Java三大特性——多态

概念

多态(Polymorphism)按字面的意思就是“多种状态”,同一种行为在不同的对象身上有不同的表现形式,它是面向对象程序设计(OOP)的一个重要特征,在面向对象语言中,接口的多种不同的实现方式即为多态。

三个必要条件

1.继承
多态中必须存在有继承关系的子类和父类,通过继承来自父类的方法,对某个方法进行重写,继承父类同一个方法,不同的子类重写可以有多种不同的表现形式。

2.重写
子类对于父类的继承来的方法进行重写,调用时就会调用子类重写过的方法而不会调用父类的方法

3.父类引用指向子类对象
在多态中需要将父类的引用赋给子类对象,只有这样该引用才能够具备父类引用调用子类重写的方法,此时就是多态。

多态的好处

1.减少代码的冗余,提高代码的可复用性

2.代码的可拓展性增强

案例

Dog和Cat两个类都有eat(),猫了饭后喵喵叫,狗吃了饭后汪汪叫,模拟人喂食

//狗具有名字属性和eat()方法
public class Dog {
	String name;// 姓名

	Dog() {

	}

	Dog(String name) {
		this.name = name;
	}

	public void eat() {
		System.out.println(this.name + "吃了骨头汪汪叫");
	}
}
public class Cat {
//猫也具有姓名属性和eat()方法
	String  name;//姓名
	Cat(){
		
	}
	Cat(String name){
		this.name=name;
	}

	
	public void eat(){
		System.out.println(this.name+"吃了鱼喵喵叫");
	}
}
public class Demo {
	public static void main(String[] args) {
		Cat c=new Cat("英短");
		Dog d=new Dog("拉布拉多");
		
		Person p=new Person("小红");
		//小红去喂狗
		p.feet(d);
		//小红去喂猫
		p.feet(c);
				
	}
}

如果此时要加入一只鸭子,然后人也要去喂

public class Duck {
	String name;// 姓名

	Duck() {

	}

	Duck(String name) {
		this.name = name;
	}

	public void eat() {
		System.out.println(this.name + "吃了米嘎嘎叫");
	}
}
// 喂狗
	public void feet(Dog dog) {
		dog.eat();
	}

	// 喂猫
	public void feet(Cat cat) {
		cat.eat();
	}

	// 喂鸭子
	public void feet(Duck duck) {
		duck.eat();
	}

*如果再领养XXX宠物,就需要给XXX喂食,怎么办?

频繁修改代码,代码可扩展性、可维护性差。解决办法就是使用多态优化。

//添加Animal类,增加eat方法,让Dog,Cat,Duck继承Animal
//重写eat方法
//修改feet的方法

// 喂所有的
	public void feet(Animal animal) {
		animal.eat();
	}
//父类引用指向子类对象
		Animal c=new Cat("花花");
		Animal d=new Dog("大黄");
		Animal duck=new Duck("小黄鸭");
		Person p=new Person("李雷");

		p.feet(d);
		p.feet(c);
		p.feet(duck);

向上转型

把子类对象直接赋值给父类引用叫做向上转型,向上转型不用强制转化,会隐藏掉对象本身扩展的内容,意思是向上转型会丢失子类的特有方法和属性

//拆分
Cat c=new Cat();
Animal a=c;
//合并
Animal a=new Cat();

向下转型

父类引用可以指向子类对象,但子类引用指向不了父类对象,意思是子类对象的父类引用赋值给子类叫向下转型,必须要强制类型转换(前提是可以向下转型),怎么样判断是不是可以向下转型,就要求必须要做instanceof判断,instanceof 是用来判断引用所指向的对象是不是某个类型

1.指向父类对象的父类引用不能转换为子类类型

Animal a=new Animal();
Cat c=(Cat)a;

写法是错误的,会报java.lang.ClassCastException一个异常

2.指向子类对象的父类引用能转换为该子类类型

Animal a=new Cat();
//a.upTree();//报错
//当你想拿回子类对象被隐藏的属性和方法时,需要做向下类型转换,(强制类型转换)
Cat c=(Cat) a;
c.upTree();//可以

3.instanceof判断

	Animal a= new Cat()if(a instanceof Cat){
		Cat c=(Cat)a;
	}else if(a instanceof Dog){
		Dog d=(Dog)a;
	}

版权声明:本文为Darcy_fx原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。