域的隐藏和方法的覆盖
class Parent {
int x = 10;
public void print() {
System.out.println("Parent's print method");
}
}
class Child extends Parent {
int x = 20;
public void print() {
System.out.println("Child's print method");
}
}
class aaa{
public static void main(String[] args) {
Parent p = new Child();/*Chlid中有Parent的域?因为子类只是隐藏?*/
System.out.println(p.x);
p.print();//p是从Child那赋值来的,print方法已经被覆盖
if (p instanceof Child) {
((Child) p).print2();
}
/*在代码p.print2();中会出现错误,原因在于变量p的类型是Parent。
虽然它实际指向的对象是Child类型(通过new Child()创建的),
但在编译阶段,编译器只会根据变量声明的类型(也就是Parent类型)来检查能够调用的方法。
由于Parent类中并没有定义print2这个方法,所以编译器认为通过p调用print2是不合法的操作,
从而报错。如果想要调用print2方法,需要先将p进行向下转型(前提是确定实际对象是Child类型)*/
}
}
int x = 10;
public void print() {
System.out.println("Parent's print method");
}
}
class Child extends Parent {
int x = 20;
public void print() {
System.out.println("Child's print method");
}
}
class aaa{
public static void main(String[] args) {
Parent p = new Child();/*Chlid中有Parent的域?因为子类只是隐藏?*/
System.out.println(p.x);
p.print();//p是从Child那赋值来的,print方法已经被覆盖
if (p instanceof Child) {
((Child) p).print2();
}
/*在代码p.print2();中会出现错误,原因在于变量p的类型是Parent。
虽然它实际指向的对象是Child类型(通过new Child()创建的),
但在编译阶段,编译器只会根据变量声明的类型(也就是Parent类型)来检查能够调用的方法。
由于Parent类中并没有定义print2这个方法,所以编译器认为通过p调用print2是不合法的操作,
从而报错。如果想要调用print2方法,需要先将p进行向下转型(前提是确定实际对象是Child类型)*/
}
}
全部评论
相关推荐
点赞 评论 收藏
分享
点赞 评论 收藏
分享