从子对象调用的私有方法

Private method of call from Child Object

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();
    }
}

当我 运行 这段代码时,它会打印出 "this" = Child 的 class 名字 但是 "this" 对象能够调用父对象的私有方法 class 为什么?

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

method定义在Parent,调用this.method()也在Parent,所以允许。

首先,在调用new Child()时,由于Childclass中没有声明的无参构造函数,所以会简单调用super(),即调用 Parent 构造函数。

那么在执行this.getClass().getName()的时候,这里的this代表了一个Child的实例,这就是为什么会得到"Child"的结果。请记住,Object#getClass() returns 对象所属的最具体 class。从 here.

查看更多

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

查看有关 java 访问控制的更多信息

很明显,您可以在 class 内调用任何私有成员,但不能在 class 外调用。

在这种情况下是合法的。在此程序中,首先将调用 Parent 的构造函数,您可以在 class.

中调用私有方法

当您扩展 class 时,私有方法将不会被继承。但是子 class 的对象包含父 class 的对象,所以当 superclass 构造函数被调用。你可以调用 superclass

内部的 superclass 私有方法

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

输出:

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

子构造器可以调用父构造器class。 而在 parent 的构造函数中,正如 Krishanthy Mohanachandran 在上面指出的那样,可以合法地调用私有方法。