来自Child Object的私有调用方法

时间:2015-06-30 05:06:13

标签: java inheritance private private-methods

class Parent {
    public Parent() {
        System.out.println("Parent Default..");
        System.out.println("Object type : " + this.getClass().getName());
        this.method();
    }

    private void method() {
        System.out.println("private method");
    }
}

class Child extends Parent {
    public Child() {
        System.out.println("Child Default..");
    }

    public static void main(String[] args) {
        new Child();
    }
}

当我运行此代码时,它会输出"这个"的类名。 =孩子 但是"这个" object能够调用父类的私有方法吗?

5 个答案:

答案 0 :(得分:2)

当你扩展类时,私有方法将不会被继承。但是,子类的对象包含父类的对象,因此当调用超类构造函数时。你可以在超类中调用超类私有方法

答案 1 :(得分:1)

首先,在调用new Child()时,由于Child类中没有声明的非参数构造函数,因此调用super()将会调用Parent构造函数。

然后,在执行this.getClass().getName()时,此处this代表Child个实例,这就是为什么你得到" Child"作为结果。请记住,Object#getClass()返回对象所属的最具体的类。从here了解更多信息。

关于this.method()为什么有效。首先,因为Child扩展了Parent,所以Child实例也是Parent实例。 java范围修饰符控制可以访问方法或字段的位置。以Parent#method()为例,private修饰符表示只能在Parent类中访问(调用)此方法。这正是你编码的方式。它调用编译规则的Parent类的构造函数内的方法。从here

了解有关Java访问控制的更多信息

答案 2 :(得分:0)

private与对象的实际类无关。同一顶级类中的任何代码都可以访问private成员。 (顶级类是不嵌套的类,与继承无关)

methodParent中定义,而来电this.method()也在Parent,因此允许。

答案 3 :(得分:0)

此处未创建父实例,您可以使用jdk安装的/ bin文件夹中的jvisualjvm进行确认,也不会创建子实例。仍调用父构造函数。

输出:

Parent Default..
Object type : com.packagename.Child
private method
Child Default..

子类可以调用父构造函数。 在父母的构造函数中,正如Krishanthy Mohanachandran在上面提到的那样,可以合法地调用私有方法。

答案 4 :(得分:-1)

很明显,你可以在课堂上调用任何私人成员,但不能在课外召集。

在这种情况下,它是合法的。在这个程序中,首先会调用Parent的constrctor,你可以在类中调用private方法。