子类和父类的转换!谢谢!

[复制链接]
查看11 | 回复3 | 2016-1-30 01:59:49 | 显示全部楼层 |阅读模式
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的子类和父类的转换

回复

使用道具 举报

千问 | 2016-1-30 01:59:49 | 显示全部楼层
这是java多态性的表现,要深入理解的话得从内存方面去思考,创建的是子类对象,但是指针类型是父类的,它能指向的内存块是父类应能对应的内容。当你把A类得Area()方法删除时,a指向的内存块里没有Area方法,或者说它指向的这个对象虽然有这个方法,但是这个指针却是没法去访问该方法的, 所以出现无法访问的情况。然后是a.name=3这个问题,这是由于直接访问成员变量的话 指针指向的任然是父类成员变量,这点记住就行,实际中一般都设getName()、setName()方法进行访问和设置,把name设为private,这样才符合面向对象封装特性,你可以试一下,a.getName()的结果肯定是4另外父类转化为子类的问题,父类转化为子类不是一定可行的,父类要...
回复

使用道具 举报

千问 | 2016-1-30 01:59:49 | 显示全部楼层
我说说的理解,不对别见怪哈。首先A a = new C();这条语句利用了java中的多态特性,即子类对象可以当做父类对象来看。但是,若我们把子类对象当做父类对象来看是,那么就只能访问父类已有定义的属性和方法,不能访问子类扩展的属性和方法。要是子类把父类的方法覆盖了,再把子类对象的当做父类对象来看,去调用方法,调用的是覆盖后的方法(子类中定义的方法)。...
回复

使用道具 举报

千问 | 2016-1-30 01:59:49 | 显示全部楼层
当你使用A a = new C();的时候其实你声明的是一个A类只是你使用了C类去实体化他。那么A类在这里就有点像接口。你在C类中你重载了area()方法。所以你调用a.area()时就是C类中的内容。但是你的A类中的name属性你没有提供get和set方法并且int name = 3;这种方法将会使其默认为私有方式保存。虽然你在C类中使用了同样的声明int...
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行