Java—使用';超级';关键词

Java—使用';超级';关键词,java,keyword,super,extends,Java,Keyword,Super,Extends,简单的问题。我创建了一个名为Tester1的类,它扩展了另一个名为Tester2的类。Tester2包含一个名为“ABC”的公共字符串 以下是测试人员1: public class Tester1 extends Tester2 { public Tester1() { ABC = "Hello"; } } 如果我将第5行改为 super.ABC = "Hello"; 我还在做同样的事情吗?首先,变量ABC必须在类Tester2中声明。如果是,那么

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

以下是测试人员1:

public class Tester1 extends Tester2
{
    public Tester1()
    {
         ABC = "Hello";
    }
}
如果我将第5行改为

super.ABC = "Hello"; 

我还在做同样的事情吗?

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

是。对象中只有一个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
    }
}

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

另一方面,如果ABC在父类中被标记为private,那么就无法从子类访问该变量——即使使用了super(当然,不使用一些奇特的反射)


另一件需要注意的事情是,如果变量在父类中定义为private,则可以在子类中定义一个名称完全相同的变量。但是,super不会授予您访问父变量的权限。

是的,super限定符是不必要的,但工作原理相同。澄清:

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
    }
}

这其实是个好问题。
super
如何与重写的方法一起工作是非常常见的知识,但是字段不同。我想只有Tester1有一个成员变量ABC跟踪超类ABC变量才重要。除非它是静态的。OP实际上并没有说它不是静态的,但语气表明它可能不是静态的它不是静态的。伟大的例子和解释!