黑马程序员技术交流社区

标题: 多态中的向上转型和向下转型 如何理解呢? [打印本页]

作者: ❦_H_t    时间: 2013-11-11 14:54
标题: 多态中的向上转型和向下转型 如何理解呢?
本帖最后由 ❦_H_t 于 2013-11-11 18:28 编辑

看了毕老师多态的视频后,对于转型这一块内容概念很模糊,不知道如何去理解转型。希望会的同学可以指点一下我
什么是向上转型,如何去理解
什么是向下转型,如何理解?


作者: ypeusksk    时间: 2013-11-11 15:29
向上转型:父类引用指向子类对象
向下转型:子类引用指向父类对象
而其中向下转型需要注意,父类引用的对象原本就是子类对象的话,那么在向下转型的过程中是安全的。也就是编译是不会出错误的。如果父类引用的对象是父类本身,那么在向下转型的过程中是不安全的,编译不会出错,但是运行时会出现错误
作者: 不抛弃不放弃    时间: 2013-11-11 16:01
假定父类为 动物,子类为狗,父类有一个方法发声(),狗继承并覆盖了一个发声方法。在子类重写该方法
则(以下过程c#实现):动物 a=new 狗();//这就为向上转型a.发声();
在调用 a.发声();时调用的是狗的发声()也可调动物类其他方法 但不能调用狗类方法
若修改为动物 a=new 狗();
狗b=(狗)a;//这里向下转型
这时b可调用动物类未被重写的方法和狗类所有方法(包括重写动物类的方法)
向上转型都会成功,是安全的。 就像说狗是动物没问题。
接上面
动物 a=new 动物();
a.发声();//调动物类方法
狗 b=(狗)a;//这也是向下转型 但下面通过b若调用 动物 或 狗类中任意方法都报异常
也就是说向下转型可能会出错 不能说动物是
JAVA中的一种调用方式
class A{
void f(){}
void g(){}
}
class B extends A{
void g(){}
void i(){}
}
public class C{
public static void main(String[] args){
A a=new B(); //B自动向上转型为A的对象
}
}
向上转型并非是将B自动向上转型为A的对象,相反它是从另一种角度去理解向上两字的:它是对A的对象的方法的扩充,即A的对象可访问B从A中继承来的和B复写A的方法。其它的方法都不能访问。即使是A 中的私有成员方法。


作者: FFF    时间: 2013-11-11 16:02
本帖最后由 FFF 于 2013-11-11 16:04 编辑

向上转型示例:

  1. class A {  
  2.       
  3.     public void repeat(){  
  4.         System.out.println("---A---");  
  5.     }  
  6. }  
  7. class B extends A{  
  8.       
  9.     public void repeat(){  
  10.         System.out.println("---B---");  
  11.     }  
  12.       
  13.     public void only(){  
  14.          
  15.         System.out.println("---only---");  
  16.     }  
  17. }  
  18. class Temp11_11_02{  
  19.       
  20.     public static void main(String[] args) {  
  21.          
  22.         A b=new B(); //向上转型  
  23.         b.repeat();   
  24.       //b.only(); Error: b虽指向子类对象,但此时丢失only()方法
  25.     }
  26.   }
复制代码
向下转型示例:
  1. class Fu {  
  2.     public void smile(){  
  3.         System.out.println("父类");  
  4.     }  
  5. }  
  6. class son extends Fu{  
  7.         
  8.     public void smile() {            
  9.         System.out.println("子类");  
  10.     }  
  11.     public void c(){  
  12.         System.out.println("子类c方法");  
  13.     }  
  14. }  
  15. class Temp11_11_02{        
  16.     public static void main(String[] args) {
  17.         Fu f= new son(); //向上转型  
  18.         f.smile();
  19.          
  20.         son s=(son)f; //向下转型,编译和运行皆不会出错  
  21.         s.smile();  
  22.         s.c();            
  23.          
  24.         Fu f2=new Fu();  
  25. //      son s1=(son)f2; //不安全的向下转型,编译无错但会运行会出错  
  26. //      s1.smile();  
  27. //      s1.c();           
  28.     }  
  29. }  
复制代码
你读一读代码。再运行一下。应该能理解个七七八八了。其他的,暂时不用深入。先打基础为主。




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