java中类型转换如何访问父级';谁的会员?
我知道在Java中使用java中类型转换如何访问父级';谁的会员?,java,inheritance,casting,Java,Inheritance,Casting,我知道在Java中使用super关键字,我们可以访问父方法/成员,它被子方法/成员隐藏/覆盖 但在多级继承中,我们使用类型转换子对象访问父对象的父方法 类型转换如何在内部工作以访问super的父类成员。还有别的办法吗 我们可以使用类型转换类似地访问方法吗?您需要转换,因为实例字段不会被覆盖(就像方法一样) 在子类中重新声明父类的字段时,隐藏父类的字段 当某个字段被隐藏时,可以使用父类型的引用来读取父字段的值: 因此,读取Grand字段时需要这两个字段中的任何一个: class Grand {
super
关键字,我们可以访问父方法/成员,它被子方法/成员隐藏/覆盖
但在多级继承中,我们使用类型转换子对象访问父对象的父方法
类型转换如何在内部工作以访问super的父类成员。还有别的办法吗
我们可以使用类型转换类似地访问方法吗?您需要转换,因为实例字段不会被覆盖(就像方法一样) 在子类中重新声明父类的字段时,隐藏父类的字段 当某个字段被隐藏时,可以使用父类型的引用来读取父字段的值: 因此,读取
Grand
字段时需要这两个字段中的任何一个:
class Grand {
int x = 10;
}
class Parent extends Grand{
int x = 20;
}
class Childs extends Parent{
int x = 30;
void show(){
System.out.println(this.x);
System.out.println(super.x); //accessing parent's member
System.out.println((Grand)this.x); //why type-casting
}
或:
这很有希望说明隐藏字段是个坏主意。简而言之,经过极大的简化,内存中的对象表示为指向区域的指针,该区域包含其所有字段成员(每个对象实例的唯一区域副本)和包含指向成员函数的指针的表/区域(每个类一个,所有对象相同) 在Java中,所有函数成员都是虚拟的,所以重写函数成员可以重写虚拟方法内存表中的单元格。所以虚拟基本上意味着可以被重写。还有一个特殊的指针,称为“super”,它指向父类的虚拟方法表。所以可以通过“super”关键字访问该表 如果您在祖先中声明字段成员,则会扩展父对象实例区域,即内存中的所有祖先字段都位于父字段之后。但由于两个字段的名称相同,这会产生歧义,因此编译器会警告您“隐藏”成员。它们不会被重写,作为函数,它们仍然存在,但编译器会根据您使用的指针类型选择要访问的实际字段作为类中声明的字段。如果您不指定任何指针,则会隐式地将其视为“this”,并且该类型将是祖先字段,即祖先字段。 若要访问父类字段,需要将(此)指针强制转换为父类,这样编译器将选择隐藏在祖先中的父类的字段
这里的区别是因为同一类的所有对象使用相同的方法,但字段的值在对象实例之间不共享。可以重写方法,但不能重写字段。了解虚拟方法/重写。
((Grand)this).x
Grand grand = this
int val = grand.x //reads parent's x