Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/397.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.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_Variables_Inheritance_Instance - Fatal编程技术网

java中带变量的继承

java中带变量的继承,java,variables,inheritance,instance,Java,Variables,Inheritance,Instance,谁能给我澄清一下吗。此处重写了实例方法,但未重写变量。 输出为:b10 class A{ int i=10; public void name(){ System.out.println("A"); } } class B extends A{ int i=20; public void name(){ System.out.println("B"); } } public clas

谁能给我澄清一下吗。此处重写了实例方法,但未重写变量。 输出为:
b10

class A{
    int i=10;
    public void name(){   
        System.out.println("A");
    }
}

class B extends A{
    int i=20;
    public void name(){        
        System.out.println("B");
    }  
}  

public class HelloWorld { 
    public static void main(String[] args){       
        A a = new B();
        a.name();
        System.out.println(a.i);
    }
}

你完全正确。如果参数列表和函数名相同,并且返回类型是协变的,则在Java中重写方法


基类中的
i
只是阴影:
a.i
指基类中的
i
成员,因为引用
a
的类型是
a
,即使它指的是
B
实例。

无法覆盖属性,只能覆盖方法:

public class A{
    private int i=10;

    public void name(){   
        System.out.println("A");
    }

    public int getI(){
        return i;
    }
}

public class B extends A{
    private int i=20;

    public void name(){        
        System.out.println("B");
    }

    @Override
    public int getI(){
        return i;
    }
}  

public class HelloWorld { 

    public static void main(String[] args){
        A a = new B();
        a.name();
        System.out.println(a.getI());
    }

}

在您的示例中,您将变量
a
定义为类型
a
,因此
B
中的
i
值被忽略。

在Java实例中,变量不能被重写,只能重写方法。当我们声明一个与在super类中声明的字段同名的字段时,这个新字段将隐藏现有字段。看到这个java doc../p>@ SIDDAPAWAKAK:是的,你也可以称它为超级类:我更喜欢基类这个词,因为我是C++的CHAP。但是为什么这里奇怪呢?变量也是实例成员对吗???@siddapwalake:确实是,但类字段和类方法的行为在这方面有所不同。但在oracle文档中,他们提到了“子类从其超类继承所有成员(字段、方法和嵌套类)”。构造函数不是成员,所以它们不会被子类继承,但是超类的构造函数可以从子类调用。这在哪里解释过了吗?您可以开始知道,将属性私有化并通过getter将其公开是非常常见的。之后,您可以按照子类中所需的方式重写getter方法调用是动态绑定的(这意味着它们在运行时解析),而对实例变量的访问是静态绑定的(这意味着它们在编译时解析)。编译器总是使用声明的变量类型来解析其实例变量。@请参阅LenVirtuose+1以获得简单而漂亮的解释是的,您是对的。因为要访问类的变量或实例,使用getstatic或getfield,字节码无法找到超类,但是调用重写其超类方法的方法将执行invokevirtual,字节码将找到超类方法。