程式狂想筆記

一個攻城師奮鬥史

0%

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

這篇先記錄最近改報表所踩到雷
一直以為我覺得 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可能會比較好
這可能是最好的良好習慣

參考來源: