疯狂java


您现在的位置: 疯狂软件 >> 新闻资讯 >> 正文

Java向上转型和向下转型


 

 

 
 
 
向上转型:父类引用指向子类对象                             向下转型:子类引用指向父类对象
 
举例:Father是父类,Son是子类
Father f1 = new Son();   // 这就叫 upcasting (向上转型), 现在f1引用指向一个Son对象
Son s1 = (Son) f1;   // 这就叫 downcasting (向下转型),现在f1还是指向Son对象
 
举例:Father是父类,Son是子类
Father f2 = new Father();
Son s2 = (Son) f2;       // 编译不出错,运行时出错(除非子类和父类拥有相同的属性和方法),子类引用不能指向父类对象
 
向上转型:父类引用指向子类对象,将会丢失子类和父类中不一致的方法,并且父类引用调用的变量只能是父类中的。
举例:
[java] view plain copy
class Person{  
    private String name = "Person";  
    int age=0;  
    public void function() {  
        System.out.println("this is person");  
    }  
}  
public class Child extends Person{  
      
    public String grade;  
    int age=10;  
    public void function() {  
        System.out.println("this is child");  
    }  
    public void b1(){  
        System.out.println("子类新方法");  
    } //B类定义了自己的新方法  
    @Test  
    public  void test(){  
        Person p = new Child();  
        p.function();  
        System.out.println(p.age);  
          
    }  
}  
 
此时将输出:
“this is child”  
0
并且我们是不能使用p.b1()的,编译错误,因为,此时该对象p已经失去了该方法。
 
向上转型的作用:
这里以父类为参数,调有时用子类作为参数,就是利用了向上转型。这样使代码变得简洁。
[java] view plain copy
public class Main{    
      
    public static void main(String[] args) {    
        dosleep(new Male());    
        dosleep(new Female());    
    }    
        
    public static void dosleep(Human h) {    
        h.sleep();    
    }    
}    
class Human {    
    public void sleep() {    
        System.out.println("Human sleep..");    
    }    
}    
class Male extends Human {    
    @Override    
    public void sleep() {    
        System.out.println("Male sleep..");    
    }    
}    
class Female extends Human {    
    @Override    
    public void sleep() {    
        System.out.println("Female sleep..");    
    }    
}    
 
如果dosleep以子类对象为参数,则有多少个子类就需要写多少个函数。这也体现了JAVA的抽象编程思想。