# 27-面向对象-多态

面向对象-多态

1. 多态的概念

​ 同一个数据类型的不同对象对同一种行为会有多种不同的实现。

2. 多态的前提

​ ① 子类重写了父类的方法

​ ② 父类引用指向子类对象(创建的是一个子类的对象,并把该对象赋值给一个变量,这个变量的类型是其父类类型)

​ 例如:

Animal a = new Dog();
Animal b = new Cat();

3. 父类引用指向子类对象后成员访问的特点

​ 除了成员方法编译看左边,运行看右边。其他所有成员都是编译看左边,运行看左边。

​ 解读:编译期间会去看左边(父类),看父类有没有这个成员方法。如果没有则直接报错,如果有则编译通过,不报错。运行期间,实际执行代码,看的是右边(子类),看子类中有没有重写该方法,如果有则执行子类中的该方法,如果没有
则运行父类中的该方法。

4. 多态的应用场景

​ 多态最大的应用场景其实就用在方法的参数上。在适当的时候把方法的参数类型定义成父类类型。调用方法的时候就可以传入任意的子类对象。提高了代码的复用性和可扩展性。

5. 多态的优缺点

优点:提高了代码的复用性和可扩展性

缺点:不能直接使用子类的成员。

6.向上转型,向下转型

6.1 向上转型

​ 向上转型就是子类转父类。因为是绝对安全的所以会自动进行转换。

例如:

	Animal a = new Dog();

6.2 向下转型

​ 向上转型就是父类转子类。因为不是绝对安全的所以必须使用强转的方式来进行转换。

例如:

	Animal a = new Dog();
	Dog d = (Dog)a;

注意:必须是这个子类的对象才可以转换成该子类,否则会出异常

6.3 instanceof进行类型判断

​ 在向下转型的时候为了保证安全我们可以使用instanceof进行类型判断。判断一个对象是否某个类的对象。如果是的话我们再把它转换成该类型,这样会更加安全。

6.3.1 使用格式

​ 对象 instanceof 类名/接口名

示例:

	//判断对象是否是某个类的对象,如果是结果为true,如果不是结果为false
	Animal a = new Dog();
	if(a instanceof Dog){
        //说明a是Dog这个类的对象,我们可以把他强转成Dog类型
        Dog d = (Dog)a;
    }

7. 思考题

思考下面代码的输出结果

class A {  
	 public String show(D obj){  
			return ("A and D");  
	 }   
	 public String show(A obj){  
			return ("A and A");  
	 }   
}   
class B extends A{  

	 public String show(B obj){  
			return ("B and B");  
	 }  
	 public String show(A obj){  
			return ("B and A");  
	 }   
}  
class C extends B{}   
class D extends B{}

class  DynamicTest
{	
	public static void main(String[] args){
		A a1 = new A();  
        A a2 = new B();  
        B b = new B();  
        C c = new C();   
        D d = new D();   
        System.out.println(a1.show(b));  
        System.out.println(a1.show(c));  
        System.out.println(a1.show(d));  

        System.out.println(a2.show(b));   
        System.out.println(a2.show(c));           
        System.out.println(a2.show(d));  

        System.out.println(b.show(b));   
        System.out.println(b.show(c));  
        System.out.println(b.show(d)); 	 
	
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值