class Parent{
private void method1(){
System.out.println("Parent's method1()");
}
public void method2(){
System.out.println("Parent's method2()");
method1();
}
}class Child extends Parent{
public void method1(){
System.out.println("child's method1()");
}
public static void main(String arg[]){
Parent p=new Child();
p.method2();
}
}
private void method1(){
System.out.println("Parent's method1()");
}
public void method2(){
System.out.println("Parent's method2()");
method1();
}
}class Child extends Parent{
public void method1(){
System.out.println("child's method1()");
}
public static void main(String arg[]){
Parent p=new Child();
p.method2();
}
}
p.method2();
将调用Child继承Parent的method2();
method2()中又调用了method1()
Parent的method1()被重写
所以将调用Child的method1()
所以子类的method2()和父类的method2()结果应该完全相同
无论你的methd2()调用了谁,你创建的引用(reference)是父类还是子类类型,都对结果没有影响以此为前提,则你的程序中
(new Parent()).method2()与(new Child()).mehod2()打印结果是完全相同的
即Parent's method2()
Parent's method1()内部机制不懂,所以只能在这个层面上理解呵呵,希望对你有帮助
鉴定完毕。
Parent p=new Child();是 多态 的一种形式,虽然 new 的是Child的构造方法,但是确是父类Parent的类型,这叫作"p被 声明 为Parent类型, 引用 Child实例".请记住以下原则:1)对于一个引用类型的变量,JAVA编译器按照它声明的类型来处理
2)对于一个引用类型的变量,运行JAVA虚拟机按照实际引用的对象来处理在这段程序中,p 本应该调用的是Child类的method2(),但是子类 Child类中没有这个方法,就会发生子类的对象转换为父类类型,在父类Parent类中有method2(),转换成功,如果父类Parent类中没有method2(),转换就会失败.实例方法与实际引用的对象的方法绑定,属于动态绑定,在运行时由JAVA虚拟机动态决定.该程序中很重要的是在父类Parent类method1()是private的,只能在父类中调用,所以父类method2()中的method1()不会被子类调用.输出结果: Parent's method2()
Parent's method1()
这句很好理解...声明提Tester 类型 ,引用 了child实例这里注意声明了什么类型,就调用该类型的方法...child虽然继承父类.但是父类的私有方法不能被覆盖....所以显示都是父类
class Parent{
//此处修改.原private改为public
public void method1(){
System.out.println("Parent's method1()");
}
public void method2(){
System.out.println("Parent's method2()");
method1();
}
}class Child extends Parent{
public void method1(){
System.out.println("child's method1()");
}
public static void main(String arg[]){
Parent p=new Child();
p.method2();
}
}
结果跟我们想象的就相符了,如下:
Parent's method2()
child's method1()
所以我觉得这串代码最关键的地方不在于多态性,而在于封装性。即Parent中的method1()为private。private修饰的属性或方法,子类不能继承、不能访问、不能重写。
Parent's method1()
这个是输出这不是简单的方法重写
private void method1(){
如果是public就是了这里为什么没有被重写?
有没有达人能仔细解答一下啊?