多态 Java

1、定义:

多态性是指允许不同类的对象对同一消息作出响应。可以设计一个方法,参数类型为类或接口(是一个父类类型的变量),传入的参数是一个子类类型的对象,根据引用子类对象特征的不同,得到不同的运行结果。如下面代码:

// 定义接口Anmal
interface Animal {    
	void shout();     // 定义抽象shout()方法
}
// 定义Cat类实现Animal接口
class Cat implements Animal {
// 实现shout()方法
	public void shout() {
		System.out.println("喵喵喵");
	}
}
// 定义Dog类实现Animal接口
class Dog implements Animal {
     // 实现shout()方法
	public void shout() {
		System.out.println("Dog叫");
	}
}

public class Example {
	public static void main(String[] args) {
		Animal an1 = new Cat(); // 创建Cat对象,使用Animal类型的变量an1引用
		Animal an2 = new Dog(); // 创建Dog对象,使用Animal类型的变量an2引用
		animalShout(an1);        // 调用animalShout()方法,将an1作为参数传入,(这里相当于上转型)
		animalShout(an2);        // 调用animalShout()方法,将an2作为参数传入
	}
     // 定义静态的animalShout()方法,接收一个Animal类型的参数
	public static void animalShout(Animal an) {
		an.shout();               // 调用实际参数的shout()方法
	}
}
结果:

喵喵喵

Dog叫


2、对象的类型转换

上转型:

子类转型成父类是向上转型,即将子类对象当作父类类型使用,例如下面的代码

Animal an1=new Cat();

子类对象当作父类类型使用不需要任何显示的声明,但此时子类对象失去了子类对象中新添加的特征。如下面代码将会报错。

// 定义Animal接口
interface Animal {    
	void shout(); // 定义抽象方法shout()
}
// 定义Cat类实现Animal接口
class Cat implements Animal {   
     // 实现抽象方法shout()
	public void shout() {			  
		System.out.println("喵喵……");
	}
     // 定义sleep()方法
	void sleep() {
		System.out.println("猫睡觉……");
	}
}
// 定义测试类 
public class Example {
	public static void main(String[] args) {
         Cat cat = new Cat(); // 创建Cat类的实例对象
		animalShout(cat);    // 调用animalShout()方法,将cat作为参数传入
	}
     // 定义静态方法animalShout(),接收一个Animal类型的参数
	public static void animalShout(Animal animal) {
		animal.shout();  // 调用传入参数animal的shout()方法
		animal.sleep();  // 调用传入参数animal的sleep()方法
	}
}
因为上面代码中,Animal类中没有定义sleep()方法,Catl类型 对象当作父类Animal类型使用时,Catl类对象失去了子sleep()方法;

但这个问题可以结果,可以将Animal类型的变量强制转为Cat类型。也就是下转型,如下面描述


下转型:

子类转型成父类是向上转型,反过来说,父类转型成子类就是向下转型。如下面代码

public static void animalShout(Animal animal) {
		Cat cat=(Cat)animal;   // 将Animal对象强制转换成Cat类型       
		cat.sleep();            // 调用cat的sleep()方法
		cat.shout();            // 调用cat的shout()方法
}
但之所可以这样强制类型转换,是因为调用animalShout()方法时传入的是Cat类型的对象,将 Cat类型的对象上转型了,之后可以下转型。若此时传入的是一个Dog类型的对象,这时进行强制类型转换就会出错。如下面的代码。
// 定义Animal类接口
interface Animal {    
	void shout(); // 定义抽象方法shout()
}
// 定义Cat类实现Animal接口
class Cat implements Animal {    
     // 实现shout()方法
	public void shout() {			  
		System.out.println("喵喵……");
	}
     // 定义sleep()方法
	void sleep() {
		System.out.println("猫睡觉……");
	}
}
// 定义Dog类实现Animal接口
class Dog implements Animal {
     // 实现shout()方法
	public void shout() {			   
		System.out.println("汪汪……");
	}
}
// 创建测试类
public class Example15 {
	public static void main(String[] args) {
          Dog dog =new Dog(); // 创建Dog类型的实例对象
		animalShout(dog);    // 调用animalShout()方法,将dog作为参数传入
	}
     // 定义静态方法animalShout(),接收一个Animal类型的参数
	public static void animalShout(Animal animal) {
			Cat cat=(Cat)animal;   // 将Animal对象强制转换成Cat类型 ,这里出错。      
			cat.sleep();            // 调用cat的sleep()方法
			cat.shout();            // 调用cat的shout()方法
	}
}


3、关键字instanceof

针对上述强制类型转换出错的情况,Java提供关键字instanceof,它可以判断一个对象是否为某个类或接口的实例或者子类实例。

格式:对象(或者对象引用变量)instanceof 类(或接口) 具体代码如下

	public static void animalShout(Animal animal) {
		if(animal instanceof Cat){
			Cat cat=(Cat)animal;   // 将Animal对象强制转换成Cat类型       
			cat.sleep();            // 调用cat的sleep()方法
			cat.shout();            // 调用cat的shout()方法			
		}
		else{
			System.out.println("可以进行强制类型转换");
		}
	}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值