2016-05-30 74 views
1

我是java的初學者。這是我的代碼如何使用超類的實例訪問子類的重載變量

class Super{ 
public int a; 
} 
class sub extends Super{ 
int a = 10; 
} 

public class test{ 
public static void main(String args[]){ 

Super var = new sub(); 
System.out.println(var.a);//Here I want to print 10 , value of sub class 
} 
} 

是否有可能,如果是的話請告訴我怎麼做? 我對這個問題的標題有些問題,所以請給我一個合適的問題,因爲我已經在我的代碼中解釋了所有我想要的東西。

+0

變量未覆蓋,所以這是不可能的,因爲it's繼承的不一部分。變量只是陰影。 – SomeJavaGuy

+1

有沒有什麼辦法可以實現這個任務,我的一個朋友告訴我可以用一些getter setter方法,但我們不知道該怎麼做。 – Shubh

+0

@shubhamnandanwar你可以在'sub'中創建一個'getA'方法並返回'super.a'。但是最終,這在實際編程方面是毫無意義的,因爲隱藏變量是相當糟糕的編程實踐,應該避免。 'sub'已經知道變量'a',不應該再次聲明它。 – SomeJavaGuy

回答

0

充分利用私有變量,並在這兩個類添加一個getA()方法,與一個在子類中重寫超類。

public class Foo 
{ 
    static class Super{ 
     private int a; 
     public int getA() { return a; } 
    } 

    static class Sub extends Super{ 
     private int a = 10; 
     @Override 
     public int getA() { return a; } 
    } 

    public static void main(String args[]) { 
     Super sup1 = new Super(); 
     Super sup2 = new Sub(); 
     Sub sub = new Sub(); 
     System.out.println(sup1.getA()); 
     System.out.println(sup2.getA()); 
     System.out.println(sub.getA()); 
    } 
} 

此輸出

0 
10 
10 
+0

謝謝@Jim它完全爲我工作 – Shubh

+0

爲什麼我們使用私人的?它也與保護和公衆一起工作。只是好奇。 – Shubh

+0

將會員私密化並提供獲得者/設定者通常是良好的做法。 OO編碼的一個目標是「封裝」,這意味着僅向外界公開接口合同所要求的內容。 –

1

你應該在你的超類中添加一個getter方法的

public int getA(){ 
return a; 
} 

子類將繼承的getter也和您可以在sublass訪問的價值。它也被推薦爲使類屬性保護或不公開而不是公開的。

+0

這將如何幫助?如果沒有子類中的重寫,getA()將始終返回0,這是OP不想要的。 –

+0

謝謝@Hooch,但請你寫出整個程序。 – Shubh