Java面向对象 ——多态

Posted 行稳方能走远

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java面向对象 ——多态相关的知识,希望对你有一定的参考价值。

多态的概念

多态是指同一个操作作用于某一类对象,可以有不同的解释,产生不同的执行结果。比如:猫吃鱼、狗吃肉、人吃米饭。

多态存在的三个必要条件:

  • 需要存在继承(extends)或实现(接口)关系
  • 同样的方法调用而执行不同操作、运行不用代码(重写)
  • 在运行时父类或者接口的引用变量可以引用其子类的对象

多态的作用:

  • 多态通过分类做什么(eat)和怎么做(猫和狗eat不一样),从一个角度将接口和实现进行分离
  • 多态消除了类型之间的耦合关系
  • 多态的存在提高了程序的拓展性和后期的可维护性

例子:(直接点击运行提示缺少cat类,右击run as运行成功 why?)

//或者:abstract class Animal
class Animal
{
	String name;
	public void eat();//或者:abstract public void eat();	
}

class Dog extends Animal
{
	
	public void eat(){//区分重写和重载
		System.out.println("狗啃骨头");
	}

}


class Cat extends Animal
{
	
	public void eat(){
		System.out.println("猫吃鱼");
	}
}

public class Test {
	public static void main(String[] args){
		
		Animal an1 = new Dog();//在运行时父类或者接口的引用变量可以引用其子类的对象
		Animal an2 = new Cat();//属于下面讲的向上转型 子类向父类转	 
		
		an1.eat();
		an2.eat();
		
	}
}

对象上下转型

  • 由子类转型成父类,在继承图上是向上移动的,一般称为向上转型

  • 向上转型是从一个较专用类型向通用类型转换,所以总是安全的,也就是说,子类是父类的超集

  • 向上转型过程中,类接口中唯一可能发生的事情是丢失方法,而不是获取方法

  • 与之相反的操作是向下转型,不安全(可能需要instanceof操作符协助)

例子:

//或者:abstract class Animal
class Animal
{
	String name;
	public void eat();//或者:abstract public void eat();	
}

class Dog extends Animal
{
	
	public void eat(){//区分重写和重载
		System.out.println("狗啃骨头");
	}

}


class Cat extends Animal
{
	
	public void eat(){
		System.out.println("猫吃鱼");
	}
	public void sleep(){
		System.out.println("猫睡觉");
	}
}

public class Test {
	public static void main(String[] args){
		
		Animal an1 = new Dog();
		Animal an2 = new Cat();
		
		an1.eat();
		
		//an2.sleep();  向上转型丢失方法
		Cat cat1 = new Cat();//这样就不会丢失方法
		cat1.sleep();
		
		if(an1 instanceof Cat){ //instanceof通过返回值(布尔值)指出对象是否是特定类或是它的一个子类
			System.out.println("aa");
		}
		if(an2 instanceof Cat){
			System.out.println("bb");
			Cat cat2 = (Cat)an2;//类型强转,类似C语言
			cat2.eat();
		}
	}
}

运行结果:

狗啃骨头
猫睡觉
bb
猫吃鱼

多态应用之打印机

以上是关于Java面向对象 ——多态的主要内容,如果未能解决你的问题,请参考以下文章

Java面向对象多态和接口

Java面向对象之多态

java-面向对象的多态性摘要

JAVA面向对象3---多态

Java 基础 ------- 面向对象(四) 多态

Java面向对象 ——多态