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
字段,否则从一个实例设置它不应该影响另一个实例,不管它们是同一个超类的两个不同子类。

继承和实例化不是这样工作的

  • 子类型继承父类型的行为
  • 它们不会继承超类型的所有子类型的任何实例的状态
这与打印1没有什么不同

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;