欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

向上转型、向下转型和动态绑定机制

程序员文章站 2022-03-15 19:24:45
...
  1. 分类:向上转型,向下转型
  2. 向上转型: Father f = new Son();(形成指向子类对象的父类引用)
  3. 向下转型: Son s = (Son) f;
  4. 上面的都是指向Son对象
  5. 子类对象不能指向父类对象
    Father f = new Father();
    Son s = (Son)f;//错误
  6. 总结:

1、父类引用指向子类对象,而子类引用不能指向父类对象。

2、把子类对象直接赋给父类引用叫upcasting向上转型,向上转型不用强制转换吗,如:

Father f1 = new Son();
3、把指向子类对象的父类引用赋给子类引用叫向下转型(downcasting),要强制转换,如:(向上转型后再强制赋给子类引用)

f1 就是一个指向子类对象的父类引用。把f1赋给子类引用 s1 即 Son s1 = (Son)f1;

其中 f1 前面的(Son)必须加上,进行强制转换。

class Animal{
	public void eat(){
		System.out.println("动物吃东西");		
	}
}
class Bird extends Animal{
	public void eat(){
		System.out.println("鸟儿在吃虫子");
	}
	public void fly(){
		System.out.println("鸟儿在飞");
	}
}
public class Main{
	public static void main(String []args){
		Animal animal = new Bird();//向上转型
		animal.eat();
		//animal.flu();//错误
		Bird bird = (Bird)animal;//向下转型
		bird.eat();
		bird.fly();
		dosleep(new male());
		dosleep(new femal())
	}
	public static void dosleep(Human h){
		h.sleep();
	}
}
public 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..");
  }
}

2、向上转型的好处

看上面的代码:

public static void dosleep(Human h) {
h.sleep();
}
这里以父类为参数,调有时用子类作为参数,就是利用了向上转型。这样使代码变得简洁。不然的话,如果 dosleep 以子类对象为参数,则有多少个子类就需要写多少个函数。这也体现了 JAVA 的抽象编程思想。
二、向下转型。
与向上转型相反,即是把父类对象转为子类对象

public class Girl {
  public void smile(){
    System.out.println("girl smile()...");
  }
}
class MMGirl extends Girl{
  
  @Override
  public void smile() {
    
    System.out.println("MMirl smile sounds sweet...");
  }
  public void c(){
    System.out.println("MMirl c()...");
  }
}
class Mian(){
	public static void main(String []args){
	//向下转型的前提是有向上转型
		Girl girl = new MMGirl();
		girl.smile();
		MMGirl mmg = (MMGirl)girl;
		mmg.smile();
		mmg.c();
		/*Girl g = new Girl();
		MMGirl mmg = (MMGirl) g;//不安全的向下转型,编译无错但会运行会出错
		*/
		
	}
}

**

静态绑定和动态绑定

  • 绑定就是将方法调用和所在的类连接起来
  • 为了实现多态
  • 分类:动态绑定和静态
  • 静态:程序运行之前(和普通类一样,美区别)
  • 动态: 根据需要绑定(动态产生对象)

    
Human human[] = new Human[5];
for(int i = 0;i < human.length;i++){
	int n = (int)(Math.random()*3);
	switch(n){
		case 0: human[i] = new Chinese();break;
		case 1: human[i] = new American();break;
		case 2:human[i] = new British();break;
	}
}
for(int i = 0;i < human.length;i++){
	human[i].speak();
}

动态产生chinese,american,british 对象

相关标签: 多态