class A{
int name=3;
int area(){
System.out.println("A");
return 1;
}
}
class C extends A{
int name=4;
intarea(){
System.out.println("C类方法");
return 1;}
public static void main(String[]args){
A a = new C();
a.area();
System.out.println(a.name);
}
}
输出结果为
c类方法
3
我不明白,实际上创建的是子类的实例,为什么调用的是子类的方法,父类的成员变量?
如果说,因为子类重写了父类的方法,那还可以理解,可是为什么成员变量name会是父类的值3?而不是子类的值4?
那么我就C c=new C();
System.out.println(c.name);
输出的是竟然是4
C c ,A a,只是一个存放地址的指针。实际的对象都是 子类C啊,那么name的值都应该是4不是吗?为什么会出现不同的结果?
还有,当我把A类的area()方法删除,也就是只有子类有area()这个方法,重新编译,结果出现了错误,根本访问不到area()这个方法。实际创建的对象是子类,子类当然可以访问area这个方法,怎么会出现了错误呢? 网上搜搜说必须强制转换成子类才可以访问子类的方法,我不清楚怎么回事。
子类和父类的转换,我不明白这究竟有什么转换啊,还是 A a有什么其他的意思?
我还不清楚 父类强制转换成子类 怎么转,这个教程好像网上的也少,希望大家帮帮啊!
万分感谢!
java的子类和父类的转换
我说说的理解,不对别见怪哈。首先A a = new C();这条语句利用了java中的多态特性,即子类对象可以当做父类对象来看。但是,若我们把子类对象当做父类对象来看是,那么就只能访问父类已有定义的属性和方法,不能访问子类扩展的属性和方法。要是子类把父类的方法覆盖了,再把子类对象的当做父类对象来看,去调用方法,调用的是覆盖后的方法(子类中定义的方法)。...
当你使用A a = new C();的时候其实你声明的是一个A类只是你使用了C类去实体化他。那么A类在这里就有点像接口。你在C类中你重载了area()方法。所以你调用a.area()时就是C类中的内容。但是你的A类中的name属性你没有提供get和set方法并且int name = 3;这种方法将会使其默认为私有方式保存。虽然你在C类中使用了同样的声明int...