2017-10-21 92 views
1

有人可以解釋爲什麼該函數打印超級變量而不是從子類變量?在Java中不能覆蓋類變量?重寫變量Java繼承的說明

class A { 
    int i = 1; 
    int fun() { 
    return i; 
    } 
} 

class B extends A { 
    int i = 2; 
} 

class Main { 
public static void main(String[] args) { 
    System.out.println(new B().fun()); 
} 
} 

此打印出1,而不是2

+3

您只能覆蓋方法,而不是字段。 –

+0

becuase'fun()'從A擴展到B,並且您正在調用具有值1的fun方法。並且字段不能被覆蓋只有方法可以 – Lokesh

+0

你的意思是'覆蓋',而不是'覆蓋',並且沒有重寫Java中的變量。 – EJP

回答

1

由於在子類中聲明的字段決不會覆蓋超類的字段。

重寫是方法。
如果你想使用當前類的i值,你能給我介紹getI()的方法來提供i值:

class A { 
    int i = 1; 
    int fun() { 
    return getI(); 
    } 
    int getI(){ 
    return i; 
    } 
} 

而在子類中重寫它:

class B extends A { 
    int i = 2; 

    int getI(){ 
    return i; 
    } 
} 
0

你是從fun()函數返回值i。如果要返回類B中的覆蓋變量的值,則需要重寫該方法,因爲fun方法是超類的一部分,它僅指超類的i

但總是記得在java中重寫變量總是一個壞主意,它可能會給你意想不到的結果。

如果你還想要你可以用這種方式。

class A { 
    int i = 1; 
    int fun() { 
    return i; 
    } 
} 

class B extends A { 
    int i = 2; 
    int fun() { 
     return i; 
     } 
} 
class Main { 
public static void main(String[] args) { 
System.out.println(new B().fun()); // this will refer the override i 
} 
}