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能够调用父类的私有方法吗?
答案 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
答案 2 :(得分:0)
private
与对象的实际类无关。同一顶级类中的任何代码都可以访问private
成员。 (顶级类是不嵌套的类,与继承无关)
method
在Parent
中定义,而来电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方法。