2015-06-30 33 views
0
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(); 
    } 
} 

调用私有方法。当我运行这段代码将打印“这个” =儿童 的类名,但“此”对象是能够调用为什么父类的私有方法?从子对象

+0

您需要在父类中删除'this',因为当您在此时调用继承时,它指向子类引用,因此它不会调用该继承。 –

+0

,因为这是父母的私有方法,如果这=父母,那么它称之为自己的方法 –

+0

@DanialHussain请首先运行代码,然后做出决定。这可以调用私有方法。 –

回答

1

首先,调用new Child()的时候,因为没有一个申报非参数的构造函数中Child类,它会简单的调用super()被调用Parent构造。

然后,当执行this.getClass().getName()时,这里this代表Child实例,这就是为什么你得到“Child”的原因。请记住,Object#getClass()返回对象所属的最具体的类。从here可以看到更多。

关于为什么有效。首先,因为Child延伸Parent,所以Child实例也是Parent实例。 java scope修饰符控制方法或字段可以被访问的地方。以Parent#method()为例,private修饰符指示此方法只能在Parent类中被访问(调用)。这正是你编码的方式。它调用编译规则的类Parent的构造函数内部的方法。从here可以看到更多关于java访问控制的信息

+0

_“这里代表一个子实例”_如果您运行Harshit Gupta的代码,_实例不会创建,对于子代或父代都不会创建。我确定像Child这样的“事物”存在于内存(堆)中的某个地方,但不是实例......请查看'jvisualjvm'来验证。如果你像'Child ch = new Child()'那样做了一些事情,那么你可以确定你可以看到一个'instance'被创建,但是对于我们所知的Super类别来说并不是这样。 – Nirmal

0

private与对象的实际类没有任何关系。一个private成员可以被同一个顶级类中的任何代码访问。 (A顶层类是一个不是嵌套的,这是不相关的继承)

methodParent限定,并且该呼叫也是Parent,因此它允许的。

-1

很明显,您可以调用类中的任何私有成员,但不能在类之外调用。

在这种情况下它是合法的。在这个程序中,首先会调用Parent的构造函数,并且可以在类中调用私有方法。

+0

但首先看看我正在调用该方法的对象的类型。 –

+0

你是什么意思?你正在使用父类对象来调用它的mehtod。 – RajSharma

+0

如果您运行代码,那么您将看到“this”对象打印子对象的类名称。 –

2

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

0

这里没有创建一个父实例,你可以在你的jdk安装的/ bin文件夹中使用jvisualjvm来确认,子实例也不会创建。父构造函数仍然被调用。

输出:

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

父类的构造可以通过子类调用。 虽然在父母的构造函数中,正如Krishanthy Mohanachandran在上面指出的那样,可以合法调用私有方法。