子类对象如何引用超类?例如:
public class ParentClass {
public ParentClass() {} // No-arg constructor.
protected String strField;
private int intField;
private byte byteField;
}
public class ChildClass extends ParentClass{
// It should have the parent fields.
}
这里调用ChildClass
构造函数时,会创建ParentClass
类型的对象,对吗?
ChildClass从ParentClass对象继承strField
,因此它(ChildClass
object)应该以某种方式访问ParentClass
对象,但是如何?
答案 0 :(得分:8)
执行ChildClass childClassInstance = new ChildClass()
时,只创建一个新对象。
您可以将ChildClass
视为由以下内容定义的对象:
ChildClass
的{{1}} +字段的因此字段ParentClass
是ChildClass的一部分,可以通过strField
所以你的假设是
调用
childClassInstance.strField
构造函数时,会创建ChildClass
类型的对象
不完全正确。创建的ParentClass
实例也是ChildClass
实例,它是同一个对象。
答案 1 :(得分:4)
ChildClass
的实例没有ParentClass
个对象, 一个ParentClass
个对象。作为子类,它可以访问其父类中的public和protected属性/方法。因此,ChildClass
strField
可以访问intField
,但不能访问byteField
和{{1}},因为它们是私有的。
您可以在没有任何特定语法的情况下使用它。
答案 2 :(得分:1)
您可以访问strField
,就像在ChildClass
中声明一样。为避免混淆,您可以添加super.strField
,这意味着您正在访问父类中的字段。
答案 3 :(得分:1)
是的,您将能够访问strField
表单ChildClass
,而无需执行任何特殊操作(请注意,只会创建一个实例。子项,将继承所有属性和来自父母的方法。
答案 4 :(得分:1)
这里当ChildClass构造函数被称为类型的对象时 创建了ParentClass,对吗?
没有! ChildClass构造函数被称为>>父类constr被调用 并且创建了ParentClass的No Object只是父类的可访问字段在ChildClass中继承
ChildClass从ParentClass OBJECT继承strField,所以它 (ChildClass对象)应该以某种方式访问ParentClass对象, 但是如何?
不,它只是重用ParentClass的模板来创建新的ChildClass
答案 5 :(得分:0)
通过专注于非arg构造函数和编译器的参与业务,同时调用派生类(ChildClass
)的默认构造函数(非arg构造函数),基类的子对象({ {1}})是通过编译器帮助机制(在派生类中插入基类构造函数调用)创建的,并包装在派生类的对象中。
ParentClass
结果:
class Parent{
String str = "i_am_parent";
int i = 1;
Parent(){System.out.println("Parent()");}
}
class Child extends Parent{
String str = "i_am_child";
int i = 2;
Child(){System.out.println("Child()");}
void info(){
System.out.println("Child: [String:" + str +
", Int: " + i+ "]");
System.out.println("Parent: [String: ]" + super.str +
", Int: " + super.i + "]");
}
String getParentString(){ return super.str;}
int getParentInt(){ return super.i;}
public static void main(String[] args){
Child child = new Child();
System.out.println("object && subojbect");
child.info();
System.out.println("subojbect read access");
System.out.println(child.getParentString());
System.out.println(child.getParentInt());
}
}