Contents

java method 類別成員(class member) 繼承踩雷

Contents

這篇先記錄最近改報表所踩到雷
一直以為我覺得 class member 也可以做 java Overwrite
但 overwrite 好像是指 method
在做繼承方發一想不到事情

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class A{
    int usertype = 0;
    public void ok(){
        System.out.println(usertype);
    }
    public static void main(String args[]) {
        C c = new C();
        c.ok();
    }
}

class B extends A{
    // int usertype = 2;
    B(){
        usertype = 2;
    }
}

class C extends B{
    // int usertype = 3;
    C(){
        usertype = 3;
    }
}

結果印出應該是 3

但是把 usertype=2 跟 usertype=3 前面注解拿掉
印出來的東西會是0
這個雷…

做後原本想做 js 做做看

JS class 不能用 class member…
發現 typescript 也不行
可能真的在 class member 轉 function 行不通

又好奇試試 PHP
結果發現跟 JAVA 完全不一樣的結果

PHP

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php
class A{
    public $a = 1;
    public function ok(){
        echo $this->a;
    }
}

class B extends A{
    public $a =2;
}

class C extends B{
    public function __construct()
    {
        $a =3;
    }
}


$o = new C();
$o->ok();
//print 3

PHP class 比較像 JAVA,但結果不一樣…,我感到意外
不過…抽象類別 裡面方法不能用抽象 function
詳細抽象類別(Abstract Class) · PHP 學習筆記

python,golang 我就不試了 orz

D2:[Java]類別的繼承(基本範例解說) - iT 邦幫忙::一起幫忙解決難題,拯救 IT 人的一天

2019-02-21

今天剛好做 PHP 有關 class,突然想到 Java 之前遇到的問題還沒有理解為什麼

感覺this是參照原本 method 那一層的(這一點跟 PHP self 很像,$this 是實例物件)
所以一直抓到父層 A,沒有解決抓到在C
這解決方法除了寫在建構式,寫在子層static也能解決

我原先的錯誤想法
在想是因為 extends,所以父層 function 複製到子層那邊去
其實用參照(reference)的方法想就很好懂了

1
2
3
4
5
class Son extends Dad {
    static {
       me = 'son';
    }
}

inheritance - Is there a way to override class variables in Java? - Stack Overflow

難怪最近看到有一個程式
宣告 class 裡面的變數
都不會直接給值,都寫在 constructor

也許子層不需要再重新宣告父層有的變數
複寫都在constructor可能會比較好
這可能是最好的良好習慣

參考來源: