Java - 使用'super'关键字

时间:2011-07-29 23:03:18

标签: java keyword super extends

简单的问题。我创建了一个名为Tester1的类,它扩展了另一个名为Tester2的类。 Tester2包含一个名为'ABC'的公共字符串。

这是Tester1:

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

如果我改为将第5行更改为

super.ABC = "Hello"; 

我还在做同样的事吗?

4 个答案:

答案 0 :(得分:8)

是。您的对象中只有一个ABC变量。但请不要首先公开领域。字段应该几乎总是私有的。

如果您在ABC内声明变量Tester1,那么然后会有所不同 - 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
    }
}

答案 1 :(得分: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
    }
}

答案 2 :(得分:1)

首先,必须在类ABC中声明变量Tester2。如果是,那么你是。

答案 3 :(得分:1)

你是。鉴于ABC对Tester1(子类)是可见的,假设它被声明为私有,这就是为什么它对于子类是可见的。在这种情况下,使用super.ABC只是强化了变量在父级中定义的事实。

另一方面,如果ABC在父类中被标记为私有,则无法从子类访问该变量 - 即使使用了super(当然也没有使用某些花哨的反射)。

另外需要注意的是,如果变量已在父类中定义为私有,则可以在子类中定义具有完全相同名称的变量。但同样,super不会授予您访问父变量的权限。