java之多态

Posted Heavy sea

tags:

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

一、多态介绍

1.多态的概念

多态性是指同一操作作用于某一类对象,可以有不同的解释,产生不同的执行结果。
多态就是同一个接口,使用不同的实例而执行不同操作。

2.多态存在的三个必要条件

需要存在继承和实现关系
同样的方法调用而执行不同操作、运行不同代码(重写)
父类引用指向子类对象:Parent p = new Child();

3.多态的作用

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

举例:
Dog 类和Cat类都继承了Animal类并重写了eat方法。在main方法中调用an1.eat()可执行Dog类的eat方法,若想调用Cat类的eat方法,只需new Cat就行了。即使用不同的实例执行不同的操作

public class Animal
{
	public void sleep()
	{
			System.out.println("动物睡觉!");
	}
	
	public void eat(){
		
	}
}

public class Dog extends Animal
{	
	// 重写父类方法
	public void eat()
	{
		System.out.println("狗啃骨头!");
	}
}

public class Cat extends Animal
{	
	
	// 重写父类方法
	public void eat()
	{
		System.out.println("猫吃鱼!");
	}
}

public class Test {
	public static void main(String[] args) {
	// 父类引用指向子类对象
		Animal an1 = new Dog();
		an1.eat();
			//Animal an1 = new Cat();	
			//an1.eat();
	}
}

二、多态中上下转型要注意的点

1.由子类转型成父类,在继承图上是向上移动的,一般称为向上转型
2.向上转型是从一个较专用类型向通用类型转换,所以总是安全的
3.向上转型过程中,类接口中唯一可能发生的事情是丢失方法,而不是获取方法
4.与之相反的操作是向下转型,不安全(可能需要 instanceof 操作符协助)

instanceof 运算符用来测试它左边的对象是否是它右边的类的实例,返回 boolean 的数据类型.

典型的使用场合:
在对对象做向下转型之前,没有其他有关对象信息时务必使用instanceof来判断一下,以免抛出ClassCastException异常

public class Test {
	public static void main(String[] args) {
//		向上转型安全 但可能会丢失方法
		Animal an1 = new Dog();
		Animal an2 = new Cat();
		
		an1.eat();
//		an1.sleep();
		an2.eat();
		
		// 向下转型	instanceof判断 以免抛出异常
		if(an2 instanceof Cat){
			Cat cat = (Cat)an2;
			cat.eat();
		}

	}
}

三、抽象类的引入

上面Animal 类中的eat方法是始终要被Dog和Cat类重写的,我们无需关心Animal类中eat方法体中的内容。这时候Animal类可以写成:

// 抽象类
public abstract class Animal {
   
   //	抽象方法
    public abstract void eat();

    public void sleep()
    {
        System.out.println("动物在睡觉");
    }
}

注意:抽象类不能实例化对象,但类的其他功能依然存在。
抽象类具体介绍见java之抽象类

四、接口的引入

如果Animal类中eat和sleep方法都需要子类去继承重写,即父类中所有的方法都需要重写。这时候代码可以写成:

// 接口
interface Animal {

   void eat();

   void sleep();

}
// implements 实现接口
public class Dog implements Animal {
    @Override
    public void eat() {
        System.out.println("狗狗在啃骨头");
    }

    @Override
    public void sleep() {
        System.out.println("狗在妙妙屋里睡觉!");
    }
}
public class Cat implements Animal{
    @Override
    public void eat() {
        System.out.println("猫在吃猫粮!");
    }

    @Override
    public void sleep() {
        System.out.println("猫在窝里睡觉!");
    }
}
public class Test {
    public static void main(String[] args) {
        Dog dog = new Dog();
        dog.sleep();
    }
}

注意:抽象类和接口理解起来是不同的,比如:抽象类是对一组具有相同属性和行为的逻辑上有关系的事物的一种抽象,而接口则是对一组具有相同属性和行为的逻辑上不相关的事物的一种抽象。
接口具体介绍见java之多态

以上是关于java之多态的主要内容,如果未能解决你的问题,请参考以下文章

Java面向对象三大特征之继承和多态

java中封装,继承,多态,接口学习总结

java之多态

java之多态

java之多态

java学习笔记之面向对象多态