Java—使用';超级';关键词
简单的问题。我创建了一个名为Tester1的类,它扩展了另一个名为Tester2的类。Tester2包含一个名为“ABC”的公共字符串 以下是测试人员1: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中声明。如果是,那么
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实际上并没有说它不是静态的,但语气表明它可能不是静态的它不是静态的。伟大的例子和解释!