Java 超类是每个子类的模板吗
我有超类Java 超类是每个子类的模板吗,java,inheritance,Java,Inheritance,我有超类test和两个子类test1和test2。我认为如果test1更改了test中的一个字段,那么test2也会看到该更改。我的意思是 test1 n = new test1(); n.setX(5); test2 a = new test2(); System.out.println(a.getX()); 它返回0,但我认为由于字段x设置为5,因此调用时会显示5 你能澄清一下这种混淆吗?n和a是两种不同的情况。除非X是一个static字段,否则从一个实例设置它不应该影
test
和两个子类test1
和test2
。我认为如果test1
更改了test
中的一个字段,那么test2
也会看到该更改。我的意思是
test1 n = new test1();
n.setX(5);
test2 a = new test2();
System.out.println(a.getX());
它返回0,但我认为由于字段x
设置为5,因此调用时会显示5
你能澄清一下这种混淆吗?
n
和a
是两种不同的情况。除非X
是一个static
字段,否则从一个实例设置它不应该影响另一个实例,不管它们是同一个超类的两个不同子类。继承和实例化不是这样工作的
- 子类型继承父类型的行为
- 它们不会继承超类型的所有子类型的任何实例的状态
test1 n1 = new test1();
test1 n2 = new test1();
n1.setX(1);
n2.setX(2);
System.out.println(n1.getX()); // prints 1
不同的实例有它们自己的状态,即使它们有相同的行为。对于超类型的子类型,这没有什么不同。所有实例在创建后都有自己的状态
当然,静态字段(类变量)总是在所有子类型之间共享。因此,一个子类型中super的静态字段的更改将在另一个子类型中看到
public class MainApp {
public static void main(String[] args) {
Sub1 sub1 = new Sub1();
Sub2 sub2 = new Sub2();
sub1.setX(2);
System.out.println(sub2.getX()); // prints 2
}
}
class Super{
private static int X;
public int getX() { return X; }
public void setX(int x) { X = x; }
}
class Sub1 extends Super {}
class Sub2 extends Super {}
<> >假设代码> SETX不修改静态变量:考虑以下内容:
test n = new test1();
test a = new test2();
n
和a
是test
的单独实例,因此它们对超类的任何属性的所有修改都只对它们自己的实例进行。子类的任何实例都不会共享超类的属性(除非它们是静态的)
注意
a
的声明中没有新的限定符。现在a
和n
共享同一个实例,因此a
所做的任何修改都会影响n
,反之亦然。字段是静态的吗?您的类应该以大写字母开头。(另请参见:camel case)不能“更改类中的字段”(除非它是静态的),只能更改对象中的字段。
test n = new test1();
test a = n;