Java中的多态的前提,成员访问特点,好处,弊端,引用类型转换

多态:同一事物(对象),在不同时刻体现的不同状态
举例: 水(固态,液态,气态)

多态的前提:
A:要有继承关系
B*:要有方法重写
C:要有父类或者父接口引用指向子类对象

多态中成员访问特点:
A:成员变量:编译看边,运行看
B:构造方法:创建子类对象的时候,访问父类的构造方法,对父类的数据进行初始化,子类的构造都会默认访问父类构造
C:成员方法:编译看边,运行看边(因为由于方法重写,运行的时候调用的是子类的成员方法)
D:静态方法:编译看边,运行看
==注意:==在此处由于方法重写,所以运行的时候看右边

代码验证多态中成员访问的特点
A:成员变量:编译看边,运行看

class TestA {
	public int num = 10;
	public int num2 = 30;
}
class TestB extends TestA {
	public int num = 20;
	public int num2 = 40;
}
class TestDemo {
	public static void main(String[] args) {
		TestA a = new TestB();
		System.out.println(a.num);//输出结果为:10,
		System.out.rintln(a.num2);//输出结果为:30,
	}
}

/*
编译运行后的结果为:
10
30

其结果都是父类中的成员变量的值,
再一次验证了:编译看左边,运行看左边

*/

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

class TestA {
	public TestA() {
		System.out.println("父类TestA");
	}
}
class TestB extends TestA {

}
class TestDemo {
	public static void main(String[] args) {
		//创建子类对象,访问的是父类的构造方法
		TestA a = new TestB();//输出结果为:父类TestA
	}
}

C:成员方法:编译看边,运行看边(因为由于方法重写,运行的时候调用的是子类的成员方法)

class TestA {
	public void show() {
		System.out.println("父类TestA");
	}
}
class TestB extends TestA {
	public void show() {
		System.out.println("子类TestB");
	}
}
class TestDemo {
	public static void main(String[] args) {
		TestA a = new TestB();
		a.show();//调用的是子类的show方法,其实这就是方法重写的调用,
		//编译看左边,运行看右边
	}
}
/*
编译运行后的结果:	

子类TestB

*/

D:静态方法:编译看边,运行看

class TestA {
	public static void show() {
		System.out.println("父类show");
	}
}
class TestB extends TestA {
	public static void show() {
		System.out.println("子类show");
	}
}
class TestDemo {
	public static void main(String[] args) {
		TeatA a = new TestB();
		a.show();//父类show
}
/*
编译运行后的结果为:

父类show

*/

多态的好处
A:提高了代码的维护性(继承保证)
B:提高了代码扩展性(有多态保证)

多态的弊端
A:不能使用子类特有的功能

那么如何使用子类特有的功能?
A:创建子类对象调用即可(方法可行,但是在很多时候不合理。而且,太占内存)
B:把父类的引用强制转换为子类引用(专业名词名词:向下转换)

在此引出对象间的转换问题:
A:向上转换
Fu f = new Zi();
父类引用指向子类对象
B:向下转换
Zi z = (Zi)f; //这里要求f必须是能够转化为Zi的
父类引用转换子类对象

代码举例向下转换

class TestA {
	public void show() {
		System.out.println("父类show");
	}
}
class TestB extends TestA {
	public void show() {
		System.out.println("子类show")}
	
	//子类特有
	public void function() {
		System.out.println("子类特有function");
	}

}
class TestDemo {
	public static void main(String[] args) {
		TestA a = new TestB();
		//调用父类和子类共有的方法,会出现方法重新,所调用的但是子类的
		a.show();//结果为:子类show
		
		//引用类型转换
		//而对于子类特有的方法,就需要将父类引用转换为子类引用
		TestB b = (TestA)a;//引用类型转换格式
		b.function();//显示结果为:子类特有function
	}
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
多态是面向对象编程的一个重要概念,它具有一些优势和弊端。 优势: 1. 代码灵活性:多态允许使用父类类型的引用变量来引用子类对象,使得代码更加灵活。通过多态,可以在不修改代码的情况下,改变对象的行为,实现代码的重用和扩展。 2. 可替代性:多态可以通过父类类型的引用变量调用子类对象的方法,从而实现动态绑定。这意味着可以在运行时根据实际的对象类型来调用相应的方法,提高了代码的可替代性和扩展性。 3. 代码可读性和可维护性:多态可以使代码更加简洁和易于理解。通过使用统一的接口,隐藏了具体实现的细节,提高了代码的可读性和可维护性。 弊端: 1. 性能损耗:在运行时需要进行动态绑定,这会带来一定的性能损耗。相比于直接调用对象的方法,通过多态调用需要额外的开销。 2. 可能存在类型转换问题:当使用多态时,可能需要进行类型转换操作。如果类型转换不正确,会导致运行时异常。因此,在使用多态时需要注意类型转换的正确性。 3. 可能存在设计问题:过度使用多态可能导致代码结构复杂化,使得代码难以理解和维护。在设计时需要合理地使用多态,避免滥用。 总的来说,多态的优势在于提高代码的灵活性、可替代性、可读性和可维护性,但同时也可能带来性能损耗和类型转换问题。在实际应用,需要根据具体场景权衡利弊,合理使用多态
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值