2011-07-29 36 views
5

簡單的問題。我做了一個名爲Tester1的類,它擴展了另一個稱爲Tester2的類。 Tester2包含一個名爲'ABC'的公共字符串。Java - 使用「超級」關鍵字

這裏是Tester1:

public class Tester1 extends Tester2 
{ 
    public Tester1() 
    { 
     ABC = "Hello"; 
    } 
} 

如果我不是改線5

super.ABC = "Hello"; 

我我還在做同樣的事情?

+2

這實際上是一個很好的問題。 「超級」與重寫方法一起工作是相當常見的知識,但字段不同。 –

回答

8

是的。對象中只有一個ABC變量。但是請不要讓字段首先公開。領域應該幾乎都是私人的。

如果聲明中Tester1變量ABC爲好,然後有會是一個差異 - 在Tester1隱藏Tester2領域的領域,但使用super你仍然可以參照場在Tester2之內。但是不要這樣做 - 隱藏變量是使代碼無法維護的一種非常快速的方法。

示例代碼:

// Please don't write code like this. It's horrible. 
class Super { 
    public int x; 
} 

class Sub extends Super { 
    public int x; 

    public Sub() { 
     x = 10; 
     super.x = 5; 
    } 

} 

public class Test { 
    public static void main(String[] args) { 
     Sub sub = new Sub(); 
     Super sup = sub; 
     System.out.println(sub.x); // Prints 10 
     System.out.println(sup.x); // Prints 5 
    } 
} 
+0

除非它是靜態的。 OP並沒有真正說它不是靜態的,但口氣表明它可能不是。 :) –

+0

@ Ray:是的,我假設它不是靜態的... –

+0

它不是靜態的。很好的例子和解釋! – WildBamaBoy

1

首先,變量ABC必須在類Tester2中聲明。如果是的話,那麼你就是。

+0

我想這隻會影響如果Tester1有一個成員變量ABC陰影超類ABC變量。 – Kevin

1

是你。考慮到ABC對於Tester1(子類)是可見的,假定它被聲明爲非私有的,這就是爲什麼它對子類可見的原因。在這種情況下,使用super.ABC只會強化變量在父級中定義的事實。

另一方面,如果ABC在父類中被標記爲私有,那麼將無法從子類訪問該變量 - 即使使用了超級(當然也不使用某種奇特的反射) 。

要注意的另一件事是,如果該變量已被定義爲父類中的私有變量,則可以在子類中定義一個具有完全相同名稱的變量。但是,超級不會授予您訪問父變量的權限。

2

是的,超級限定符是不必要的,但工作原理是一樣的。澄清:

public static class Fruit { 

    protected String color; 
    protected static int count; 
} 

public static class Apple extends Fruit { 

    public Apple() { 
     color = "red"; 
     super.color = "red"; // Works the same 
     count++; 
     super.count++; // Works the same 
    } 
}