欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

day09Java-多态01

程序员文章站 2022-05-09 13:15:49
...

多态

我对多态的最终理解:父类的引用指向不同的子类,调用相同的方法从而实现不同的功能。
多态概述以外可参考

博客名称 连接地址
day09Java-多态02 https://blog.csdn.net/qq_40332952/article/details/104715953

多态:同一个对象(事物),在不同时刻体现出来的不同状态。
举例:
猫是猫,猫是动物。
水(液体,固体,气态)。

多态的前提:
A:要有继承关系。
B:要有方法重写。
其实没有也是可以的,但是如果没有这个就没有意义。
自己的理解:
多态是由方法的重写来实现的,比如说一个动物类有一个吃饭的方法(),再有两个子类猫和狗都重写了父类的吃饭方法,猫吃的是鱼,狗吃的是肉,通过父类引用去指向猫或者狗。从而实现调用相同的方法实现不同的功能。
C:要有父类引用指向子类对象。
父 f = new 子();

用代码体现一下多态。
多态中的成员访问特点:
A:成员变量
编译看左边,运行看左边。
B:构造方法
创建子类对象的时候,访问父类的构造方法,对父类的数据进行初始化。
C:成员方法
编译看左边,运行看右边。
D:静态方法
编译看左边,运行看左边。
(静态和类相关,算不上重写,所以,访问还是左边的)

由于成员方法存在方法重写,所以它运行看右边。

多态继承中的内存图解
day09Java-多态01

多态中成员变量访问特点代码演示

System.out.println(fu.num2); //编译报错,因为左边没有该成员变量,所以说编译看左边。
fu.num; 输出值为100,100是Fu中的成员变量,所以说执行看左边。

多态中成员变量访问特点结论:
编译看左边,运行看右边。

class Fu {
	public int num = 100;
}

class Zi extends Fu {
	public int num = 1000;
	public int num2 = 10000;
}

public class DuoTaiTest{
	public static void main(String[] args) {
		Fu fu = new Zi();
		System.out.println(fu.num);
	  //System.out.println(fu.num2); 因为左边没有该成员变量所以报错,所以说编译看左边
	  }
}

结果

100
多态中成员方法访问特点代码演示

fu.method(); 编译报错,因为在Fu中没有method()方法,method()方法是Zi独有的。所以说编译看左边。
fu.show(); 输出值为shwo() Zi,调用的是Zi的show()方法。所以说运行看右边。
多态中成员方法访问特点结论:
编译看左边,运行看右边
原因:由于成员方法存在方法重写,所以它运行看右边。

class Fu {
	public void show(){
		System.out.println("show() Fu");
	}
}

class Zi extends Fu {
	//子类重写父类show()方法
	public void show(){
		System.out.println("shwo() Zi");
	}
	//子类独有的method()方法
	public void method(){
		System.out.println("method() Zi");
	}
	
}

public class DuoTaiTest{
	
	public static void main(String[] args) {
		Fu fu = new Zi();
		fu.show();
		//fu.method();
		
	}
}

结果:

shwo() Zi
多态中静态方法访问特点代码演示

fu.method(); 编译报错,因为在Fu中没有method()静态方法,编译看左边。
fu.function(); 输出值为function() Fu,调用的Fu类中方法function()方法,所以运行看左边。
多态中静态方法总结:
编译看左边,运行看左边。(静态和类相关,算不上重写,所以,访问还是左边的)

class Fu {
	public static void function() {
		System.out.println("function() Fu");
	}
}

class Zi extends Fu {
	public static void function() {
		System.out.println("function() Zi");
	}

	public static void method() {
		System.out.println("method() Zi");
	}

}

public class DuoTaiTest {

	public static void main(String[] args) {
		Fu fu = new Zi();
		fu.function();
		// fu.method();
	}
}

结果:

function() Fu
相关标签: Java相关知识