Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 重写从子类定义的静态变量是否会影响父类中所述变量的值?_Java - Fatal编程技术网

Java 重写从子类定义的静态变量是否会影响父类中所述变量的值?

Java 重写从子类定义的静态变量是否会影响父类中所述变量的值?,java,Java,我来问你一个简单的OOP问题。 假设有三个等级——A、B和C。 B和C都从a继承了一个静态变量。也就是说a将这个变量的值定义为0。 假设B和C都修改了这个静态变量的值。 我的问题是——既然静态变量在同一个类的成员之间保持不变,这是否意味着从子类设置超类变量的值对超类的值没有影响 换句话说,如果我们把B的变量值改为1,对于B类而不是C类或A类的对象,该值将仅为1?静态字段只属于一个类,不被其子类继承静态字段只属于一个类,不被其子类继承在这里,您可以找到解决问题的简单java实现。 结果可以解释这个

我来问你一个简单的OOP问题。 假设有三个等级——A、B和C。 B和C都从a继承了一个静态变量。也就是说a将这个变量的值定义为0。 假设B和C都修改了这个静态变量的值。 我的问题是——既然静态变量在同一个类的成员之间保持不变,这是否意味着从子类设置超类变量的值对超类的值没有影响


换句话说,如果我们把B的变量值改为1,对于B类而不是C类或A类的对象,该值将仅为1?

静态字段只属于一个类,不被其子类继承

静态字段只属于一个类,不被其子类继承

在这里,您可以找到解决问题的简单java实现。
结果可以解释这个解

 class A {
   static int variable = 0;
}

class B extends A{

}
 class C extends A{

}

public class Runclass {

    public static void main(String arg[]){
        A a = new A();
        System.out.println("A "+a.variable);

        B b = new B();
        System.out.println("B "+b.variable);

        C c = new C();
        System.out.println("C "+c.variable);

        b.variable=1;
        System.out.println("After modifying B "+b.variable);
        System.out.println(" A "+a.variable);

    }
}
输出:

A 0
B 0
C 0
After modifying B 1
A 1

在这里,您可以找到解决问题的简单java实现。
结果可以解释这个解

 class A {
   static int variable = 0;
}

class B extends A{

}
 class C extends A{

}

public class Runclass {

    public static void main(String arg[]){
        A a = new A();
        System.out.println("A "+a.variable);

        B b = new B();
        System.out.println("B "+b.variable);

        C c = new C();
        System.out.println("C "+c.variable);

        b.variable=1;
        System.out.println("After modifying B "+b.variable);
        System.out.println(" A "+a.variable);

    }
}
输出:

A 0
B 0
C 0
After modifying B 1
A 1
静态并不意味着恒定。final表示您不能更改值。
您可以访问超类A中的变量并更改它,例如在B:A.someVariable=1中使用此代码
在此之后,如果使用超类A变量(A.someVariable),您也将看到C、B和A的值1。
我给您一个代码示例:

package teszt;

class A {
    static int statValami=0;
}



封装测试

class Over  {
    public static void main(String args[]){
        new B().writeOut();
        new C().writeOut();
        System.out.println(A.statValami);
    }
}


输出是:
1
100
100静态并不意味着恒定。final表示您不能更改值。
您可以访问超类A中的变量并更改它,例如在B:A.someVariable=1中使用此代码
在此之后,如果使用超类A变量(A.someVariable),您也将看到C、B和A的值1。
我给您一个代码示例:

package teszt;

class A {
    static int statValami=0;
}



封装测试

class Over  {
    public static void main(String args[]){
        new B().writeOut();
        new C().writeOut();
        System.out.println(A.statValami);
    }
}



输出是:
1
100
100

为什么不测试它并找出答案?你认为会发生什么?你为什么这么想?不管怎样,在标题中你说的是重写,但在你的问题中你说“B和C都修改这个静态变量的值”,这更接近于重新赋值。也许可以通过发布适当的代码示例来澄清这一部分。可能的重复不能覆盖变量,更不用说静态变量了。您只能重写实例方法。为什么不测试它并找出答案?你认为会发生什么?你为什么这么想?不管怎样,在标题中你说的是重写,但在你的问题中你说“B和C都修改这个静态变量的值”,这更接近于重新赋值。也许可以通过发布适当的代码示例来澄清这一部分。可能的重复不能覆盖变量,更不用说静态变量了。您只能重写实例方法。由于子类可以继承对该静态字段的访问,所以“且不由其子类继承”是模糊的。假设我们有
类Foo{publicstaticintx=0;}
,并且
类栏扩展了Foo{}
。这意味着我们仍然可以使用
Bar.x
访问
Foo
中定义的
x
。没错,子类可以访问,但从OO的角度来看,只有一个字段,它属于超类静态字段,由子类型继承​, 如果可访问且非私密。根据JLS,“一个类从它的直接超类和直接超接口继承了超类和超接口的所有非私有字段,这些字段都可以被类中的代码访问,并且不会被类中的声明隐藏。”这个答案完全错误。这是一个相当学术性的讨论,但是(很明显,文档中描述的是我从OO的角度不会调用inharetace。“并且不是由它的子类继承的”是模糊的,因为子类可以继承对这个静态字段的访问。假设我们有
类Foo{public static int x=0;}
类栏扩展了Foo{}
。这意味着我们仍然可以使用
Bar.x
访问
Foo
中定义的
x
。没错,子类具有访问权限,但从OO的角度来看,只有一个字段,它属于超类。静态字段由子类型继承​, 如果可访问且非私有。根据JLS,“类从其直接超类和直接超级接口继承超类和超级接口的所有非私有字段,这些字段可供类中的代码访问,且不被类中的声明隐藏。”这个答案是完全错误的。这是一个相当学术性的讨论,但从面向对象的角度来看,你(显然还有文档)描述的内容我不会称之为Inharetac。