2015-01-06 74 views
-1

我發現一種情況,要求我在各種編碼位置發現錯誤。在這裏,我們有兩個類這裏的錯誤在哪裏?

A類,其功能是作爲一個超類

package TestSes; 

public class A { 
    private int a = 100; 

    public void setA(int value) { 
     a = value; 
    } 
    public int getA() { 
     return a; 
    } 
} 

,這是它的子類

package TestSes; 

public class TestA extends A { 
    private int a = 222; 

    public static void main(String[] args) { 
     System.out.println("in main(): "); 
     System.out.println("a = "+a); 
     a = 123; 
    } 
} 

我想知道這裏的錯誤。請詳細解釋變量 a。我怎樣才能糾正這個代碼,使其工作?

+3

你可以把它放在一個IDE中,你知道.. –

+0

你認爲應該打印什麼值(100,222或123)? –

+0

我認爲私人領域不能實例化。所以TestA類有自己的字段a(不是從A繼承而來)。所以我認爲印刷的價值將是222. – Cloo

回答

4

您嘗試訪問並將值分配給靜態主方法中的非靜態變量a。這是不可能的。 a必須與TestA類的實例關聯,因此無法在沒有instace的情況下訪問它。

+0

這也是一個範圍問題?你可以用任何方法訪問'a'而不用說'this.a' –

+1

@JoshEngelsma在非靜態方法中,你可以不使用'this'關鍵字來訪問'a'。 – Eran

+0

感謝您的提示! –

0

您的代碼中存在兩個問題。

  1. 你的可變a是一個實例變量,裝置,它屬於一個對象上TestA類。如果沒有實例TestA,則無法訪問它。但是,在靜態main方法,你訪問它,而不TestA

  2. 你的超類TestSes的實例有可變的a一個實例,但是,它不會被繼承給你的子類,因爲你的超級類變量是私人的。

+1

不需要從實例訪問它。如果是這樣,吸氣和吸氣的作用是什麼? – Cloo

+0

@戊醇,我不明白你的問題 –

+0

我的意思是沒有必要從一個對象訪問實例變量來改變它。 – Cloo