private有什么奥秘吗?
class A
{
public A()
{
b();
}
private void b()
{
System.out.println( "A ");
}
}
class A1 extends A
{
public A1()
{
super();
b();
}
private void b()
{
System.out.println( "A1 ");
}
}
class A2
{
public static void main(String [] args)
{
A1 a1=new A1();
}
}
与
class A
{
public A()
{
b();
}
void b()
{
System.out.println( "A ");
}
}
class A1 extends A
{
public A1()
{
super();
b();
}
void b()
{
System.out.println( "A1 ");
}
}
class A2
{
public static void main(String [] args)
{
A1 a1=new A1();
}
}
的区别就在于有没有private 修饰,结果就大不一样,这是为什么啊?
------解决方案--------------------private方法不能被继承及覆盖,因此不能构成多态。
------解决方案--------------------private方法、属性只能在类内使用!
------解决方案--------------------super()调用的是父类的方法
------解决方案--------------------父类的 private成员(包括成员函数和成员变量)不能被子类继承!
------解决方案--------------------第二个程序中,b并不是private啊。
------解决方案--------------------private是只有类本身能够访问,其他类不能访问
不加private继承类可以访问
------解决方案--------------------因为第二个程序里的A1继承了A,而且b()是包属性的方法,重写了父类的方法。当父类的引用指向子类时,调用的是子类的方法,即super()调用b()时由于多态调用的是A1里的b()。
在第一个程序里,b()是私有的,所以不是多态,所以super()里调用的是A里的b()。