多态 Java
来源:互联网 发布:php取数组中的最大值 编辑:程序博客网 时间:2024/06/06 17:26
1、定义:
多态性是指允许不同类的对象对同一消息作出响应。可以设计一个方法,参数类型为类或接口(是一个父类类型的变量),传入的参数是一个子类类型的对象,根据引用子类对象特征的不同,得到不同的运行结果。如下面代码:
// 定义接口Anmalinterface 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
- Java学习 java -- 多态
- java多态
- java多态
- java多态
- java多态
- Java多态
- java多态
- JAVA@多态
- Java多态
- java 多态
- Java多态
- java多态
- [Java] 多态
- JAVA多态
- Java多态
- java多态
- java 多态
- java多态
- 配置Java环境
- 编译原理学习资料整理
- PAT乙级 1039. 到底买不买(20)
- 真正的MVC思想
- Windows Server上DHCP的配置
- 多态 Java
- 图解HTTPS协议加密解密全过程
- Android 6.0的lowmemorykiller机制
- centos6.5之虚拟机 10连接SecureCRT 7.3
- freecodecamp项目---tictactoe
- 题目1534:数组中第K小的数字
- PAT乙级 1040. 有几个PAT(25)
- Android 自动化测试 Espresso篇:简介&基础使用
- BZOJ 2464 小明的游戏