Java 父成员函数隐藏子';s数据成员

Java 父成员函数隐藏子';s数据成员,java,Java,我有一个密码: class Parent{ int x=10; void show(){ System.out.println(x); } } class Child extends Parent{ int x=20; public static void main(String[] args){ Child c=new Child(); c.show(); } } 在这里,当我运行这个程序时,输

我有一个密码:

class Parent{
    int x=10;
    void show(){
        System.out.println(x);
    }
}

class Child extends Parent{
    int x=20;
    public static void main(String[] args){
        Child c=new Child();
        c.show();
    }
}
在这里,当我运行这个程序时,输出是10。这意味着在运行时父成员函数不使用同名的子数据成员(数据隐藏)。我知道的是,每当我们扩展一个类时,它的父类成员函数和数据成员对子类是可用的,然后当我说
c.show()
为什么它接受父类的数据成员而不是子类。另外,我想知道,当我们创建子类的对象时,它的父类数据成员被放在堆中子类对象的父部分,但是成员函数会发生什么情况呢

我知道的是,每当我们扩展一个类时,它的父类成员函数和数据成员对子类是可用的,那么当我说c.show()时,为什么它接受父类的数据成员而不是子类的数据成员

你的理解是正确的。但事实并非如此。父类子对象无权访问子类子对象。由于
show()
在基类
Parent
的范围内,它正在访问自己的成员。尝试注释父类中的成员
x
,查看程序是否编译


child中的X仅覆盖基类,而不是覆盖它。基类成员变量不会改变,只会被恰好具有相同名称的子类中的单独变量隐藏。它们仍然是完全不同的变量。

子类不能通过声明自己的字段版本来对父类中的方法隐藏字段。您正在反向应用“数据隐藏”的思想。子级永远不能对父级隐藏字段,但父级可以对子级隐藏字段(通过将
x
声明为
private
)。如果你想,你可以,比如:

通过重写
getX()
accessor方法,子对象可以向世界其他地方隐藏父对象的
x

还有一些值得讨论的问题:

我知道的是,每当我们扩展一个类时,它的父类 子类可以使用类成员函数和数据成员

这并不完全正确。私有方法和数据成员将(直接)不可用于子类。子类只能直接访问公共、受保护和“包级别”的方法和字段

另外,我想知道当我们创建子类的对象时 父类数据成员放在子类的父部分 对象,但成员函数会发生什么情况

成员函数不是每个实例创建的。如果JVM像这样工作,效率会非常低。相反,给定类的方法实现只定义一次,作为
永久生成的一部分,永久生成包含类定义和其他内部JVM状态等内容。给定类的所有实例将共享相同的方法定义


对于子类,它将共享其父类的方法定义,并且它还将为仅存在于子类中的任何方法(以及它重写的任何方法)添加自己的定义。

当我在父类中注释成员“x”时,它不会编译,并在“System.out.println(x)”处显示错误。好的,我可以理解,但我不清楚函数的作用域和它有什么关系?父类成员函数只能访问它的成员。当您调用
c.show()时
,当前您在父类的范围内。如果成员函数在
Child
类中被重写,则范围将在
Child
类中。当您试图访问实例变量/方法时,它应该在使用它的位置的范围内。好的,但是我的第二个问题仍然没有回答。也就是说,当我们创建子类的对象时,会在堆中创建一个具有子类数据成员的子类对象,并且在子类对象中还有另一个部分,其中父类数据成员也存在。那么show()如何对应于父级的数据成员?
class Parent{
    private int x=10;

    public int getX() {
        return x;
    }

    void show(){
        System.out.println(this.getX());
    }
}

class Child extends Parent{
    int x=20;

    @Override
    public int getX() {
        return x;
    }

    public static void main(String[] args){
        Child c=new Child();
        c.show();
    }
}