黑马程序员技术交流社区

标题: java继承问题 [打印本页]

作者: 张庚    时间: 2013-2-4 20:52
标题: java继承问题
class A {
public void getMessage() {
showMessage();
}

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

public class B extends A {

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

public static void main(String[] args) {
A a = new B();
B b = new B();
a.getMessage();
b.getMessage();

}

}

为什么输出都是A
B b = new B();
b.getMessage();
为什么调用的是父类的私有方法

A a = new B();
a.getMessage();
为什么调用的是父类的私有方法

作者: 柴乔军    时间: 2013-2-4 21:10
private方法是不能被重写的,而getMessage又没有被重写,就是从父类中调用了getMessage,然后调用了父类的showMessage
作者: 范天成    时间: 2013-2-4 22:08
B b = new B();
b.getMessage(); B继承了A,但是B类没有覆写getMessage();所以b.getMessage()这条语句调用的是A中的getMessage()方法。getMessage()方法首先会去调用B中的showMessage() ,但是属性是私有,这时getMessage()转而去调用A中的showMessage() ,而getMessage()是类A的成员函数,所以访问当然可以访问A类的私有成员函数。如果你将showMessage()全改为public,输出结果全是B

A a = new B();
a.getMessage(); 这个是典型的多态,因为B类中没有覆写A类的getMessage()方法,所以情况和上面的一样。如果你在B类中覆写getMessage(),则输出结果全是B。
看下面的例子:

class A {
public void getMessage() {
showMessage();
}

public void showMessage() { //改为public
System.out.println("A");
}
}

public class B extends A {
       

public void showMessage() { //改为public
System.out.println("B");
}

public static void main(String[] args) {
A a = new B();
B b = new B();

a.getMessage();
b.getMessage();

}

}
输出结果:B  B





作者: dzr19850306    时间: 2013-2-6 12:40
你调用的是从父类继承而来的方法。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2