Java向上转型和向下转型实例解析

2020-02-12 14:01:42王振洲

易采站长站为您分析Java向上转型和向下转型实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

学习向上转型和向下转型怎么用没多难,但是为什么那样用,我搞了很多次没弄明白。没弄明白的原因是平时学习时之看例子,而例子一般都比较简单,没有对象之间的调用,一般就是一个对象调用自己的方法。

首先看下怎么用转型。

要转型,首先要有继承。继承是面向对象语言中一个代码复用的机制,简单说就是子类继承了父类中的非私有属性和可以继承的方法,然后子类可以继续扩展自己的属性及方法。

向上转型:子类对象转为父类,父类可以是接口。公式:Father f = new Son();Father是父类或接口,son是子类。

向下转型:父类对象转为子类。公式:Son s = (Son)f;

例子:向上转型

package multistate;

public class Human {

  public void sleep() {
    System.out.println("Human sleep..");
  }

  public static void main(String[] args) {
    Human h = new Male();// 向上转型
    h.sleep();
    Male m = new Male();// 干嘛要向上转型
    m.sleep();
    // h.speak();此方法不能编译,报错说Human类没有此方法
  }
}

class Male extends Human {
  @Override
  public void sleep() {
    System.out.println("Male sleep..");
  }

  public void speak() {
    System.out.println("I am Male");
  }
}

class Female extends Human {
  @Override
  public void sleep() {
    System.out.println("Female sleep..");
  }

  public void speak() {
    System.out.println("I am Female");
  }
}

注意:向上转型不要强制转型。向上转型后父类的引用所指向的属性是父类的属性,如果子类重写了父类的方法,那么父类引用指向的或者调用的方法是子类的方法,这个叫动态绑定。向上转型后父类引用不能调用子类自己的方法,就是父类没有但是子类的方法,如果调用不能编译通过,比如子类的speak方法。

非要调用子类的属性呢?如果不向下转型就需要给需要的属性写getter方法。

例子:

package multistate;

public class Human {
   String name = "Human";
   public String getName(){
     return this.name;
   }
  public void sleep() {
    System.out.println("Human sleep..");
  }

  public static void main(String[] args) {
    Human h = new Male();// 向上转型
    System.out.println(h.getName());
  }
}

class Male extends Human {
  String name = "Male";
  public String getName(){
    return this.name;
  }
  @Override
  public void sleep() {
    System.out.println("Male sleep..");
  }

  public void speak() {
    System.out.println("I am Male");
  }
}

class Female extends Human {
  String name = "Female";
  
  public String getName(){
    return this.name;
  }
  @Override
  public void sleep() {
    System.out.println("Female sleep..");
  }

  public void speak() {
    System.out.println("I am Female");
  }
}