日期:2014-05-20  浏览次数:20704 次

请高手指点一下继承的问题!!,不胜感激
class   Super{
int   a=10;
void   hi(){
System.out.println( "你好 ");
}
}
class   sub   extends   Super{
int   b=20;
void   hi(){
System.out.println( "hi~~~~ ");
}
void   bye(){
System.out.print( "sssss ");
}
}
public   class   Inher10{
public   static   void   main(String[]   args){
Super   ob1=new   sub();
sub   ob2=(sub)ob1;
ob2.hi();
ob2.bye();
}
}


我昨天发过贴的,还是昨天的那个,这里有个不解的问题:

Super   ob1=new   sub();这里父类型引用变量ob1引用的对象是sub类子类的对象,
ob1可引用int   a;     void   hi(){}被覆盖的方法
而下面的sub   ob2=(sub)ob1;     ob1引用类型强制为sub型并传值给ob2;

为什么ob2能引用bye();ob1不是给了他有的对象了吗?
我不知道这时的sub型ob2可引用的对象有哪些,可能理解强制转换理解的不够好,谁能指点一下谢谢


------解决方案--------------------
向上转型会隐藏子类中有而父类中没有的接口(公有方法)。

向下转型会重新“获得”子类中原先就有的接口。

一个常见的例子是,在泛型引入以前,把一个对象放入容器都会向上转型为Object,而隐藏了Object中没有的所有接口,要使用这些接口,必须向下转型以重新获得它们。
------解决方案--------------------
向下转型时vm会进行合法性检查
类名的第一个字母要大写!
------解决方案--------------------
关于向上转型和向下转型,通过内存模型,结合你的例子,来解释一下,你就会明白了:

对象类型的方法与对象的关联是通过指针来完成的,比如:
Super sup = new Super();
单从方法而言,在构造结束后,sup对象内部会有一个指向存储在堆中的hi()方法的指针;
sub s1 = new sub();
由于sub类是 Super类 子类,构造s1的过程是:先调用父类的构造方法,构造出父类对象,于是有了指针1,指向Super的hi()方法;然后构造其余部分,指针2,指向sub的bye()方法,子类发现重载hi()重载了,指针1定位到sub()的hi()方法!

子类对象的方法指针分为两类:
一、基类的方法:先指向父类的方法,在构造自己的时候,如果是重载再指向自己的重载方法;
二、自己的新方法:指针在构造自己的时候定位方法;

说到正题:
向上转型:
Super ob1 = new sub();
ob1在sub()类型对象完成构造后,方法指针都已经正确指定方法,发现自己是个Super对象引用,于是被限定只能使用从基类继承或重载的那部分方法。
sub ob2 = (sub)ob1;
ob1被重新评定为 (sub)对象引用,再把对象地址赋给ob2,ob2指向了原先new出的对象,且它是
sub类型的,所以可以访问子类的新方法了。