Skip to content

多态

982字约3分钟

java

2024-10-24

多态

一种事物有多个形态

在编程中指同名方法(包括构造方法)

有多种不同的实现并且程序可以根据当时的执行的情况自己调用合适的同名方法之一(类似多义字)

分为2类(重载、重写)

重载:一个方法,多个实现(根据参数判断使用哪一个同名函数)

重写:一个方法,多个实现(根据调用对象的真实类型判断使用哪一个)

重载的条件

两同三不同

1.两同:同一个类的同名方法

同类、同名方法

public class OverloadTest {
	// 同类,同名
	public void overloadTest() {
		System.out.println("无参函数");
	}
	// 同类,同名
	public void overloadTest(int i) {
		System.out.println("有1参重载int "+i);
	}
}

2.三不同:方法的参数不同(参数个数、参数类型,参数顺序)

public class OverloadTest {
	// 同类,同名,参数个数不同
	public void overloadTest() {
		System.out.println("无参函数");
	}
	// 同类,同名参数个数不同
	public void overloadTest(int i) {
		System.out.println("有1参重载int "+i);
	}
}
public class OverloadTest {
	// 同类,同名,参数类型不同
	public void overloadTest(String i) {
		System.out.println("有1参重载String "+i);
	}
	// 同类,同名,参数类型不同
	public void overloadTest(int i) {
		System.out.println("有1参重载int "+i);
	}
}
public class OverloadTest {
	// 同类,同名,参数顺序不同
	public void overloadTest(int i,String j) {
		System.out.println("有2参重载int "+i+" String "+j);
	}
   // 同类,同名,参数顺序不同
    public void overloadTest(String j,int i) {
		System.out.println("有2参重载String "+j+" int "+i);
	}
}

参数个数不同、参数类型不同、参数顺序不同(多个参数类型不同的情况下)

public class OverloadTest {
	public void overloadTest() {
		System.out.println("无参函数");
	}
	
	public void overloadTest(int i) {
		System.out.println("有1参重载int "+i);
	}
	// 参数类型不同
	public void overloadTest(String i) {
		System.out.println("有1参重载String "+i);
	}
	// 参数个数不同
	public void overloadTest(int j,int i) {
		System.out.println("有2参重载int "+i+" int "+j);
	}
    
    // 参数个数不同
	public void overloadTest(int i,String j) {
		System.out.println("有2参重载int "+i+" String "+j);
	}
    
    // 参数顺序不同
    public void overloadTest(String j,int i) {
		System.out.println("有2参重载String "+j+" int "+i);
	}
	
	public static void main(String[] args) {
		OverloadTest test = new OverloadTest();
		test.overloadTest();
		test.overloadTest(1);
		test.overloadTest("String类型");
		test.overloadTest(2, 3);
		test.overloadTest(3, "String类型");
        test.overloadTest("String类型",4);
	}

}
/* 输出结果:
 * 无参函数
 * 有1参重载int 1
 * 有1参重载String String类型
 * 有2参重载int 3 int 2
 * 有2参重载int 3 String String类型
 * 有2参重载String String类型 int 4
 */

注意:

1.仅仅参数名称不同不会构成重载的条件(默认情况下Java编译后形参参数名不存在)

// 参数名称不同,报错
public void overloadTest(String i) {
	System.out.println("有1参重载String "+i);
}
// 参数名称不同,报错
public void overloadTest(String j) {
	System.out.println("有1参重载String "+i);
}

2.仅仅返回类型不同不能构成重载条件(有返回类型时,调用不一定会用到返回值,无法判断)

靠接收到的返回值不能判断到底是哪一个

// 返回类型不同,报错
public void overloadTest() {
	System.out.println("无参函数");
}
// 返回类型不同,报错	
public int overloadTest() {
	return 1;
}

3.父类的同名方法不能和子类的同名方法构成重载条件

(子类继承的父类的同名方法可以与子类的同名方法构成重载条件)

// 子类存在和父类同名函数
class OverLoad extends OverloadTest{
	public void overloadTest(double i) {
		System.out.println(i);
	}
}
overLoad.overloadTest(3.14f);
/* 输出结果:
 * 3.140000104904175
 * 虽然没有报错,实质是子类继承了父类所有的overloadTest方法,是子类的方法与继承得到的方法发生了重载
 */

重载的用处:使用便捷

return:程序的出口

问题

这里书写今日所遇到问题及解决方法 不要忽略小问题,小问题也要记下来。( 勿以善小而不为 )

吐槽

这里是吐槽部分,内容不限。