java基础之多态的那些事儿

Posted zws-bugging

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java基础之多态的那些事儿相关的知识,希望对你有一定的参考价值。

同一个对象在不同时刻体现出来的不同状态,叫多态

多态的前提:

             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();

多态中的成员访问特点:

1、成员变量:编译看左边,运行看左边(执行结果)

class Fu{
	public int num = 100;
}
class Zi extends Fu{
	public int num = 1000;
	public int num2 = 200;
}
public class DuoTai {
      public static void main(String[] args) {
    	 ///要父类引用指向子类对象,父 f = new 子(); 
    	  Fu f = new Zi();
    	  System.out.println(f.num);//100,执行的是左边父类
    	  ///System.out.println(f.num2);编译不通过,报错
      }
}

2、构造方法:创建子类对象的时候,访问父类的构造方法,对父类的数据进行初始化。子类的构造都会默认访问父类构造。

package Training;
class Fu{
	public Fu() {
		System.out.println("我是父类构造方法!!!");
	}
}
class Zi extends Fu{
	public Zi() {
		System.out.println("我是子类构造方法!!!");
	}
}
public class DuoTai {
      public static void main(String[] args) {
    	  new Zi();
      }
}
///默认先访问父类构造方法
技术图片
1 我是父类构造方法!!!
2 我是子类构造方法!!!
View Code

3、成员方法:编译看左边,运行看右边

class Fu{
	public void method() {
		System.out.println("我是父类成员方法!!!");
	}
}
class Zi extends Fu{
	public void method() {
		System.out.println("我是子类成员方法1!!!");
	}
	public void Zimethod() {
		System.out.println("我是子类成员方法2!!!");
	}
}
public class DuoTai {
      public static void main(String[] args) {
    	  Fu f = new Zi();
    	  f.method();
    	  ///f.Zimethod();编译不通过报错,父类不能使用子类特有的功能
      }
}
技术图片
1 我是子类成员方法1!!!
View Code

4、静态方法:编译看左边,运行看左边

class Fu{
	public static void method() {
		System.out.println("我是父类静态方法!!!");
	}
}
class Zi extends Fu{
	public static void method() {
		System.out.println("我是子类静态方法!!!");
	}
}
public class DuoTai {
      public static void main(String[] args) {
    	  Fu f = new Zi();
    	 f.method();
      }
}

 来自传智播客的刘意老师的经典讲解:

 

多态的问题理解:
	class 孔子爹 {
		public int age = 40;
		
		public void teach() {
			System.out.println("讲解JavaSE");
		}
	}
	
	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(); //英雄联盟
	

 

 

 

以上是关于java基础之多态的那些事儿的主要内容,如果未能解决你的问题,请参考以下文章

Java基础知识回顾之三 ----- 封装继承和多态

Swift基础之关于键盘的那些事儿

rocketmq那些事儿之集群环境搭建

JDK源码那些事儿之红黑树基础上篇

学生信的那些事儿之七 - Linux基础之Shell脚本编程

云产品之负载均衡那些事儿