JAVA多态

Posted 一只小阿大嗷

tags:

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

多态的概念

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

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

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

多态的作用

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

案例

package 多态案例;

class Ainmal
{
	public String name;
	
	public void eat()
	{
		System.out.println("动物啥都吃");
	}
}

class Dog extends Ainmal
{
	@Override
	public void eat() {
		// TODO 自动生成的方法存根
		System.out.println("狗吃骨头");
	}
}

class Cat extends Ainmal
{
	@Override
	public void eat() {
		// TODO 自动生成的方法存根
		System.out.println("猫吃鱼");
	}
}

public class Test {
	public static void main(String[] args) {
		Ainmal am  = new Ainmal();
		Ainmal am1 = new Dog();
		Ainmal am2 = new Cat();
		
		am.eat();
		am1.eat();
		am2.eat();
	}
}

结果

动物啥都吃
狗吃骨头
猫吃鱼

对象上下转型

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

instanceof运算符用来在运行时通过返回值来指出对象是否是特定类或者是它的子类的一个实例

用法:
result = object instanceof class
result :布尔类型
object :必选项,任意对象表达式
class :必选项,任意已定义的对象类
说明:如果object是class或其子类的一个实例,则instanceof运算符返回true,如果不是或者object是null,则返回false

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

案例

package 多态案例;

class Ainmal
{
	public String name;
	
	public void eat()
	{
		System.out.println("动物啥都吃");
	}
}

class Dog extends Ainmal
{
	@Override
	public void eat() {
		// TODO 自动生成的方法存根
		System.out.println("狗吃骨头");
	}
	
	public void sleep() {
		System.out.println("zzzzz");
	}
}

class Cat extends Ainmal
{
	@Override
	public void eat() {
		// TODO 自动生成的方法存根
		System.out.println("猫吃鱼");
	}
}

public class Test {
	public static void main(String[] args) {
		Ainmal am  = new Ainmal();
		//正常向上转型
		Ainmal am1 = new Dog();
		Ainmal am2 = new Cat();
		
		Dog dg1 = new Dog();
		
		am.eat();
		am1.eat();
		dg1.sleep();
		//向上转型,丢失方法(唯一的风险),编译就会报错。
		//am1.sleep();
		am2.eat();
		
		//向下转型,是危险的
		if(am1 instanceof Cat) {
			System.out.println("am1  ok!");
			Cat cat = (Cat)am1;
			cat.eat();
		}
		
		if(am2 instanceof Cat) {
			System.out.println("am2  ok!");
			Cat cat = (Cat)am2;
			cat.eat();
		}
		//下面语法能通过,但是程序会崩
		//Cat cat = (Cat)am1;
	}
}

结果

动物啥都吃
狗吃骨头
zzzzz
猫吃鱼
am2  ok!
猫吃鱼

多态的应用

简单来说,多态是具有表现多种形式能力的特征
同一个实现接口,使用不同的案例而执行不同操作

案例

package 多态案例;

class School
{
	public Dayin dayinji;
	public void anZhuang(Dayin dayinji) {
		this.dayinji = dayinji;
	}
	
	public void print(String contex) {
		dayinji.print(contex);
	}
}

class Dayin
{
	public void print(String contex) {}
}

class CaiSe extends Dayin
{
	@Override
	public void print(String contex) {
		// TODO 自动生成的方法存根
		System.out.println("彩色打印"+contex);
	}
}

class HeiSe extends Dayin
{
	@Override
	public void print(String contex) {
		// TODO 自动生成的方法存根
		System.out.println("黑色打印"+contex);
	}
}

public class Test2 {
	public static void main(String[] args) {
		School s = new School();
		CaiSe c = new CaiSe();
		s.anZhuang(c);
		s.print("我很帅");
		
		HeiSe h = new HeiSe();
		s.anZhuang(h);
		s.print("我很帅");
	}
}

结果

彩色打印我很帅
黑色打印我很帅

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

每个人单核苷酸多态性(SNP)形成的原因是啥?

多态性和动态铸造

Java多态——代码复用性

Java 多态

java多态/重载方法——一个疑难代码引发的讨论

Java 多态