同一个对象在不同时刻体现出来的不同状态,叫多态。
多态的前提:
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(); //英雄联盟