java语言机制中的多态多态理解以及多态的向上转型和向下转型问题

多态中转型问题往往不容易理解,特别是向上和向下转型。

下面先说说多态的概念和前提:

1.要有继承关系;

2.要有方法重写;

3.要有父类引用指向子类对象;

如果是成员变量的话,编译看左边(父类),运行看左边(子类);

如果是成员方法的话,编译看左边(父类),运行看右边(子类);

如果是静态方法的话,编译看左边(父类),运行看右边(子类);

下面有一个例子可以说明:(输出结果为John和谈几个亿的大单子)

基本数据类型的自动提升和强制类型转换的区别:

        从基本数据类型出发,其实就可以类似地可以得出,多态中的父类引用指向子类对象实际上就是向上转型;二也有多态向下转型;

向下转型的话就是要加上前面的转型符号;(我想了一下,还是从最简单的基本类型进行对比来看比较好)

public class Job {
 
	public static void main(String[] args) {
		
		System.out.println("我的工作是:");
	}
 
	public void say() {
		System.out.println("工作");
	}
 
}

先建一个job类,Job类的方法是say

再添加两个类,Teacher和Student,都继承Job;


public class Teacher extends Job{
 
	public static void main(String[] args) {
		System.out.println("老师");
	}
 
}
public class Student extends Job{
	 
    public void say() {
        System.out.println("学生");
    }
   
}

 

最后再写个Test类来实例化调用

 

下面我们来测试下多态父类指向子类具体实现

 

public class Test {
    
	public static void main(String[] args) {
		/*父类指向Student类的具体实现
		 * 由子类Student指向父类Job,向上转型
		 * */
	    Job job = new Student();
		job.say();
		
		/*向下转型
		 * 由Student转向job,按照提示添加在job前添加(Student)
		 * */
		Student student = (Student) job;
		student.say();
		
		/*向下转型,因为job指向的是Student具体实现,
		所以会报错*/
		Teacher teacher = (Teacher) job;
		teacher.say();
	}
}

输出结果:

从Test类我们可以理解到多态中转型的含义(具体的看Test类中注释)

 

向上转型:子类对象->父类对象 安全

向下转型:父类对象->子类对象 不安全

下面用一个例子来解释向下转型的不安全性:

向上转型和向下转型都是java多态性的一种体现手段,只是向上转型不用强制转换

向上转型即父类引用指向子类对象

Gril是父类,漂亮女孩MMGril是子类

那么,

Girl g1=new MMGirl(); //向上转型

       MMGirl mmg=(MMGirl)g1; //向下转型,编译和运行皆不会出错

此时mmg指向的实际上还是子类漂亮女孩对象MMGirl,所以这里的向下转型是安全的。因为g1指向的是子类对象。


Girl g2=new Girl();
MMGirl mmg1=(MMGirl)g2; //不安全的向下转型,编译无错但会运行会出错,此时mmg1指向的是由父类对象Girl强制转换成的假MMGirl对象

试想,每个女孩Girl都会笑,但是漂亮女孩MMGirl具有蛊惑男人的微笑但是普通女孩没有

现在我把一个普通女孩强制转换成了MMGirl,虽然面子上过去了(表现为能编译)但是她不具备勾人心魄的微笑呀!(这就是不安全的体现)

能理解了吧?

猜你喜欢

转载自blog.csdn.net/rnzhiw/article/details/82744865