11

子类对象如何引用超类?例如:

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 继承strField自 ParentClass 对象,所以它(ChildClass对象)应该以ParentClass某种方式访问​​对象,但是如何?

4

6 回答 6

9

当您这样做时,ChildClass childClassInstance = new ChildClass()只会创建一个新对象。

您可以将ChildClass视为由以下内容定义的对象:

  • 来自ChildClass+ 的字段来自ParentClass.

所以该字段strField是 ChildClass 的一部分,可以通过childClassInstance.strField

所以你的假设是

ChildClass调用构造函数时,ParentClass会创建一个类型的对象

不完全正确。创建的ChildClass实例也是一个ParentClass实例,它是同一个对象。

于 2013-03-16T17:46:02.980 回答
5

的实例ChildClass没有ParentClass对象,它一个ParentClass对象。作为一个子类,它可以访问其父类中的公共和受保护的属性/方法。所以这里ChildClass可以访问strField,但不能访问intFieldbyteField因为它们是私有的。

您可以在没有任何特定语法的情况下使用它。

于 2013-03-16T17:45:15.477 回答
1

是的,您将能够访问strField表单ChildClass,而无需执行任何特殊操作(但请注意,只会创建一个实例。子节点,它将继承父节点的所有属性和方法)。

于 2013-03-16T17:46:18.680 回答
1

您可以strField像在ChildClass. 为避免混淆,您可以添加一个super.strField含义,即您正在访问父类中的字段。

于 2013-03-16T17:42:51.563 回答
1

在这里,当调用 ChildClass 构造函数时,会创建 ParentClass 类型的对象,对吗?

不!调用 ChildClass 构造函数 >> 调用父类 constr 并且不创建 ParentClass 的对象,仅在 ChildClass 中继承父类的可访问字段

ChildClass 从 ParentClass OBJECT 继承 strField,所以它(ChildClass 对象)应该以某种方式访问​​ ParentClass 对象,但是如何?

不,这只是重用 ParentClass 的模板来创建新的 ChildClass

于 2013-03-16T17:56:50.580 回答
0

只关注无参构造器的业务和编译器的参与,在ChildClass调用派生类()的默认构造器(无参构造器)的同时,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());

    }
}

结果:

Parent()
Child()
object && subojbect
Child: [String:i_am_child, Int: 2]
Parent: [String: ]i_am_parent, Int: 1]
subojbect read access
i_am_parent
1
于 2017-07-23T19:51:09.303 回答