黑马程序员技术交流社区

标题: 关于对象多态性,转型的问题。求解答! [打印本页]

作者: 权跃杰    时间: 2012-8-6 23:12
标题: 关于对象多态性,转型的问题。求解答!
class A{     // 定义类A
public void fun1(){  // 定义fun1()方法
  System.out.println("A --> public void fun1(){}") ;
}
public void fun2(){
  this.fun1() ;  // 调用fun1()方法
}
};
class B extends A{
public void fun1(){  // 此方法被子类覆写了
  System.out.println("B --> public void fun1(){}") ;
}
public void fun3(){
  System.out.println("B --> public void fun3(){}") ;
}
};
public class PolDemo01{
public static void main(String asrgs[]){
  A a = new B() ;  // 实例化子类对象
  
  
  a.fun1() ;
  a.fun2();// 此方法被子类覆写过
  a.fun3();// 此处为什么不能调用fun3方法呢??(转型之后是父类对象,无法找到子类中定义的新方法,可是下面a又是B类的实例,这是为什么呀???)
  System.out.println((a instanceof B) ); // true  ,,为什么又是B类的实例呢?不是转化成父类对象了吗??
  System.out.println((a instanceof A) ); // true
}
};

作者: 樊占江    时间: 2012-8-6 23:17
本帖最后由 樊占江 于 2012-8-6 23:19 编辑

你看一下a.fun3(); 是子类里面还是父类里面的。另外还有抽象 ,其实答案很简单,你再仔细看看吧。具体我不能说太多
作者: 创出一片辉煌    时间: 2012-8-6 23:19
首先A类的fun2()方法没有被A的子类B类覆写过,被覆写的只有fun1()方法
回答你第一个问题:
父类是没办法调用子类自己增加的方法和成员变量的,没办法调的原因是因为父类中没定义,没定义就是没有!如果一样东西不存在你想找到它明显是不可能的。如果你想调用子类中定义的成员变量和方法还需要向下转型
A a = new B();
B a2 = (B)a;
a.fun3();
现在调用fun3()方法就没问题了!

第二个问题:
A a = new B();
你先别管“A a =”这部份, 看后面new B();"new"就代表实例化一个对象,你现在"new"的是B类
那现在你就是实例化了一个B类对象,这个对象是就B的实例
这个和转不转化成父类没什么关系的
作者: 创出一片辉煌    时间: 2012-8-6 23:20
首先A类的fun2()方法没有被A的子类B类覆写过,被覆写的只有fun1()方法
回答你第一个问题:
父类是没办法调用子类自己增加的方法和成员变量的,没办法调的原因是因为父类中没定义,没定义就是没有!如果一样东西不存在你想找到它明显是不可能的。如果你想调用子类中定义的成员变量和方法还需要向下转型
A a = new B();
B a2 = (B)a;
a.fun3();
现在调用fun3()方法就没问题了!

第二个问题:
A a = new B();
你先别管“A a =”这部份, 看后面new B();"new"就代表实例化一个对象,你现在"new"的是B类
那现在你就是实例化了一个B类对象,这个对象是就B的实例
这个和转不转化成父类没什么关系的
作者: hello world    时间: 2012-8-6 23:27
编译时看看左边  运行时看右边  
子类当父类来用时, 如果向调用子类特有方法, 需要强制类型转换为子类, 才能调用.

作者: 潘星    时间: 2012-8-7 04:16
首先因为B类继承了A类,在子类B中覆盖了方法fun1()新增了方法fun3(),而在父类A中,也有2个方法,一个是fun1(),一个是fun2(),而fun2()调用的还是fun1().
而子类继承了父类并且覆盖了父类中的方法后如调用该方法会运行子类方法中的内容。
在主函数中 A a = new B() ; 这句话的意思是建立了一个子类对象但是指向了父类的引用,子类对象向上转型了。
当你在调用a.fun1() ;
                   a.fun2();
这2个方法后是可以编译通过的,应为此时a对象向上转型了指向了父类的引用,父类中的方法都可以拿来用,但是运行的结果是子类中的方法的结果。
而 调用这个方法a.fun3();时,因为父类中没有这个方法,所以编译失败,若想调用这个方法,可以将对象a在向下转型:B b=(B)a; 则课可以调用子类中的特有方法了。
System.out.println((a instanceof B) ); // true  为什么又是B类的实例呢?不是转化成父类对象了吗??
a的实体对象还是B类,就好比猫是动物的子类,猫可以指向动物的引用,但它本身还是猫。
以上是我的个人见解,希望对楼主有帮助。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2