面向对象的三大特性——多态

面向对象的三大特性——多态

  1. 概念
    (1) 多态:父类型的引用指向子类的对象。
    父类类名 引用名 = new 子类类名(实参);
    引用 对象父类型 子类型的主观类型 客观实际类型
    (2) 以父类型的引用调用属性和方法,只能调用父类中定义的属性和方法;
    注意:编译时,编译器会检测以父类调用的属性和方法是否在父类中定义,定义,则编译通过,没有定义,则编译报错。
    (3) 运行的时候,JVM会自动检测,子类中是否覆盖父类中的方法,如果子类覆盖了父类中方法,则优先调用子类覆盖的方法,没有覆盖,则运行父类中方法。

  2. 引用之间的转换
    (1) 父类型的引用 赋值给 子类型的引用 —》强制类型转换大类型 小类型
    a. 语法: 子类类名 引用名 = (子类类名)父类型引用;强转过程,引用中存储的实际对象类型不会随着转换而改变。
    b. 案例:Animal a = new Dog();
    Dog d = (Dog)a;
    c. 强制转换的结果:
    I. 如果引用中存储的实际对象类型 和 要转换的类型一致,编译通过,运行也通过。
    Animal a = new Dog();// new 后面就实际存储对象类型–>DogDog d = (Dog)a; // ()代表要转换的类型 -->Dog
    II. 如果实际存储的对象类型,和要转换的类型不一致,则编译通过,但是运行报错,错误信息:java.lang.ClassCastException(类型转换异常)Animal a = new Cat(); // 实际存储对象类型为:CatDog d = (Dog)a; // 要转换的类型为 —》Dog
    (2) 子类的引用 赋值 给父类型的 引用 --》直接赋值 (体现多态)小类型 赋值 给 大类型
    a. 语法: 父类类名 引用名 = 子类型的引用名;
    (3) 没有继承的关系引用,之间是不允许转换,强制类型转换也不可以;一旦转换,编译报错。Animal a = new Dog();Person p = (Person)a; // 编译报错

  3. instanceof的应用
    (1) 语法: 引用名 instanceof 类名
    (2) 作用:将 引用中存储的实际对象类型和instanceof 后面的类型进行判断,如果实际存储的对象类型兼容于后面的类型,结果为 true;如果不是后面的一种,则结果为false。
    (3) 开发中的应用:在进行引用类型转换之前,可以先通过instanceof进行类型判断,可以避免出现java.lang.ClassCastException(类型转换异常)。

public class TestAnimal2{
	public static void main(String[] args){
		Animal a = new Dog();
		// System.out.println(a instanceof Animal);//true
		// System.out.println(a instanceof Cat);//true
		// System.out.println(a instanceof Dog);//false
		if(a instanceof Dog){
			Dog d = (Dog)a;
			System.out.println("转换成功....");
   		}
	}
}
  1. 多态的开发应用
    (1) 多态用在数组上:本类型+所有子类型的对象都可以作为元素进行存储
public class TestAnimal3{
	public static void main(String[] args){
		Animal[] as = new Animal[5];
		as[0] = new Fish();
		as[1] = new Cat();
		as[2] = new Dog();
		as[3] = new Fish();
		as[4] = new Dog();
		for(int i =0;i<as.length;i++){
			as[i].eat();
			//as[i].run();
		}
		// 统计 狗对象的个数
		// 遍历数组:获取数组中每一个对象
		int count = 0;
		for(int i=0;i<as.length;i++){
			// as[i]
			if(as[i] instanceof Dog){
				count++;
			}
		}
		System.out.println("狗对象的个数:"+count);
		// 调用数组中 所有鱼对象的 swim方法(Fish独有方法)
		for(int i=0;i<as.length;i++){
			if(as[i] instanceof Fish){
				/*Fish f = (Fish)as[i];
				f.swim();*/
				((Fish)as[i]).swim();
			}
		}
	}
}

(2) 多态应用在形式参数上:本类型+所有子类型的对象(或是引用)都可以作为实际参数传递。

public class TestPerson2{
	public static void main(String[] args){
		// 饲养员对象
		Person p = new Person();
		// 狗对象
		Dog d = new Dog();
		//p.feedDog(d);
		Cat c = new Cat();
		// 猫对象
		//p.feedCat(c);
		p.feedAnimal(d);// Animal a = d = new Dog();
 		p.feedAnimal(c); // Animal a = c = new Cat();
		p.feedAnimal(new Tiger()); // Animal a = new Tiger();
	}
}
// 饲养员
class Person{
	/*public void feedDog(Dog d){ // d = new Dog();
	d.eat();	
	}
	public void feedCat(Cat c){
		c.eat();
	}*/
	public void feedAnimal(Animal a){
		a.eat();
	}
}
class Animal{
	public void eat(){
		System.out.println("Animal..eat..");
	}
}
class Dog extends Animal{
	public void eat(){
		System.out.println("狗吃骨头...");
	}
}
class Cat extends Animal{
	public void eat(){
		System.out.println("猫吃鱼");
	}
}
class Tiger extends Animal{
	public void eat(){
		System.out.println("老虎吃肉...");
	}
}

(3) 多态应用在返回值上:本类型+所有子类对象(或是引用)都可以作为返回值进行返回。

public class TestPerson3{
	public static void main(String[] args){
		Person p = new Person();
		Vehicle v =  p.travel(600);
		v.show();
	}
}
// 普通人
class Person{
	// 旅游:预计支出,money,给出交通出行方式
	/*
	money > 10000  飞机
	money > 5000 小于 10000 高铁
	money < 5000 绿皮车
	*/
	// 功能:获取一个交通方式
	public Vehicle travel(double money){
		if(money>10000){
			return new Plane();
		}else if(money>5000 && money <=10000){
			return new HighSpeedRail();
		}else{
			return new Train();
		}
	}
}
//交通
class Vehicle{
	public void show(){
		System.out.println("交通出行...");
	}
}
//绿皮火车
class Train extends Vehicle{
	public void show(){
		System.out.println("绿皮火车...");
	}
}
// 高铁
class HighSpeedRail extends Vehicle{
	public void show(){
		System.out.println("高铁出行...快速,安全...");
	}
}
// 飞机
class Plane extends Vehicle{
	public void show(){
		System.out.println("飞机出行...快速,安全缺乏...");
	}
}
  1. 多态的好处
    将不同子类进行统一管理和操作。
发布了13 篇原创文章 · 获赞 11 · 访问量 292
App 阅读领勋章
微信扫码 下载APP
阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 数字20 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览