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();
}
}