栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

2021-10-30 多态

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

2021-10-30 多态

多态

一,多态时Java中一个重要的语法机制。例如:A继承B,C继承B,那么:
父→子(向下转型);子→父(向上转型)
其中,向下转型又被称为强制类型转换;向上转型被称为自动类型转换。
注:无论是向上还是向下,必须有继承关系,不然没法编译。

二,在使用多态机制:以student(学生)和human(人类)为例:
人类与学生有继承关系==人类是父类,学生是子类。学生是人类(这个合理)
那是不是可以写成
human h=new student();
解释:这个new出来的是student,h这个引用的数据类型是human,它们之间进行了类型转换,子类变成了父类,称为向上转型。
Java中允许父类引用指向子类对象(不过用的不多,还是乖乖调用的好)

三,例:

public class Human {
	 public void move() {
	      System.out.println("人类在学习");	 
	 }
	 
public class Student extends Human{
	 public void move() {
	      System.out.println("人类在学习");	 
	 }
	       }
	       
public static void main (String []args) {
          Human S=new Student();//父类指向子类
          S.move();
          Student h=new human();//错误,子类无法指向父类,不存在这种转换。
}

我们在使用向下转型时,如果调用的方法是子类中的特有的,也就是父类不存在的方法时,可以用向下转型。
再例如:
父类:动物
子类:猫、
animal a=new cat()//多态
但如果在上面的基础上继续一个代码
fish f= (fish)a;//直接爆炸,因为a中底层创建了cat的对象,用去找猫,两者无任何联系。
不过编译没问题了但继续运行还会发现,运行报错。因为有检测出了a中的内部有animal数据类型,指向了cat所以发生报错。
因此,向上转型有时候通过编译就可以运行,不过向下转型通过编译不一定可以运行。
因此使用instance of避免这个情况。

四,语法:
引用+instanceof+数据类型名
其结果为布尔类型表达式。
还以上面的猫和为例:
(a instanceof animal)
true表示a引用指向animal类型
false
表示a引用没有指向animal类型

五,例:

public class Human {
	 public void move() {
	      System.out.println("人类在学习");	 
	 }
	 
public class Student extends Human{
	 public void move() {
	      System.out.println("人类在学习");	 
	 }
	       }

public static void main (String []args) {
	Student S=new Student();
	Human h=new Human();
	
	if(h instanceof Student) {//引用H
          Student S1=(Student) new Human();//父类指向子类
          S1.move();
	}else if(h instanceof Human) {//引用H      
		Human h1=new Student();//错误,子类无法指向父类,不存在这种转换。
		h1.move();
}

 }
}
//上面这个可以通过运行
//把下面的换一下
public static void main (String []args) {
	Student S=new Student();
	Human h=new Human();
	
	if(S instanceof Student) {//换成了引用S
          Student S1=(Student) new Human();//父类指向子类
          S1.move();
	}else if(S instanceof Human) {  //换成了引用S    
		Human h1=new Student();//错误,子类无法指向父类,不存在这种转换。
		h1.move();
}
 }
}//运行报错,Exception in thread "main" java.lang.ClassCastException: exercise1.Human cannot be cast to exercise1.Student
类型有问题,无法运行,ClassCastException

注:在强转前,通常都会用instanceof来判断一下,避免异常

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/362357.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号