Java基础知识十二(多态)

多态:

多态意味着父类的变量可以指向子类对象。

(1)同一个对象在不同时刻体现出来的不同状态。
(2)多态的前提:
	A:有继承或者实现关系。
	B:有方法重写。
	C:有父类或者父接口引用指向子类对象。
	
	多态的分类:
		a:具体类多态
			class Fu {}
			class Zi extends Fu {}
			
			Fu f = new Zi();
		b:抽象类多态
			abstract class Fu {}
			class Zi extends Fu {}
			
			Fu f = new Zi();
		c:接口多态
			interface Fu {}
			class Zi implements Fu {}
			
			Fu f = new Zi();
(3)多态中的成员访问特点
	A:成员变量
		编译看左边,运行看左边
	B:构造方法
		子类的构造都会默认访问父类构造
	C:成员方法
		编译看左边,运行看右边
	D:静态方法
		编译看左边,运行看左边
	
		因为成员方法有重写。
(4)多态的好处:
	A:提高代码的维护性(继承体现)
	B:提高代码的扩展性(多态体现)
(5)多态的弊端:
	父不能使用子的特有功能。
	
	现象:
		子可以当作父使用,父不能当作子使用。
(6)多态中的转型
	A:向上转型
		从子到父
	B:向下转型
		从父到子
(7)多态的前提
	1、必须有关系:继承,实现。
	2、通常都有重写操作。

多态问题的理解

class 老王 {
		public int age = 40;
		
		public void teach() {
			System.out.println("讲解Java");
		}
	}
	
	class 小王 extends 老王 {
		public int age = 20;
		
		public void teach() {
			System.out.println("讲解网络安全");
		}
		
		public void playGame() {
			System.out.println("英雄联盟");
		}
	}
	
	//Java培训特别火,很多人来请老王去讲课,这一天老王有事出去了
	//但是这是人来请,就剩小王在家,价格还挺高。小王 一想,我是不是可以考虑去呢?
	//然后就穿上老王的衣服,带上老王的眼睛,粘上老王的胡子。就开始装老王
	//向上转型
	老王 k王 = new 小王();
	//到人家那里去了
	System.out.println(k王.age); //40
	k王.teach(); //讲解网络安全
	//k王.playGame(); //这是小王才能做的
	
	
	//讲完了,下班回家了
	//脱下老王的装备,换上自己的装备
	//向下转型
	小王 k =(小王) k老王; 
	System.out.println(k.age); //20
	k.teach(); //讲解网络安全
	k.playGame(); //英雄联盟
	

再如:

/*
   描述毕老师和毕姥爷,
   毕老师拥有讲课和看电影功能
   毕姥爷拥有讲课和钓鱼功能
 */
class 毕姥爷{
        void 讲课(){
                System.out.println("政治");
        }
        void 钓鱼(){
                System.out.println("钓鱼");
        }
}
//毕老师继承了毕姥爷,就有拥有了毕姥爷的讲课和钓鱼的功能,
//但毕老师和毕姥爷的讲课内容不一样,因此毕老师要覆盖毕姥爷的讲课功能
class 毕老师 extends 毕姥爷{
        void 讲课(){
                System.out.println("Java");
        }
        void 看电影(){
                System.out.println("看电影");
        }
      
}
public class Test {
        public static void main(String[] args) {
                //多态形式
                毕姥爷 a = new 毕老师(); //向上转型
                // 这里表象是毕姥爷,其实真正讲课的仍然是毕老师,因此调用的
				//也是毕老师的讲课功能
                a.讲课();
				// 这里表象是毕姥爷,但对象其实是毕老师,而毕老师继承了毕姥
				//爷,即毕老师也具体钓鱼功能
                a.钓鱼(); 
                // 当要调用毕老师特有的看电影功能时,就必须进行类型转换
                毕老师 b = (毕老师)a; //向下转型
                b.看电影();
                }
}

总结:转型过程中,至始至终只有毕老师对象做着类型转换,父类对象是无法转成子类
对象的。

多态继承中的内存图解:

在这里插入图片描述

多态中对象变化内存图解:

在这里插入图片描述

发布了48 篇原创文章 · 获赞 47 · 访问量 5247

猜你喜欢

转载自blog.csdn.net/weixin_45160969/article/details/103498381