继承:从子类访问基类字段

时间:2013-03-16 17:40:27

标签: java oop inheritance

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

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对象,但是如何?

6 个答案:

答案 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());

    }
}