接口&多态总结

发布时间 2023-12-28 20:48:43作者: ZWJAS

总结

接口

  • 概念理解

    接口是一种约定规范,是多个抽象方法的集合。仅仅只是定义了应该有哪些功能,本身不实现功能, 至于每个功能具体怎么实现,就交给实现类完成。

  • 接口声明&多继承性

    接口可以认为是一种特殊的类,但是定义类的时候使用 class 关键字,定义接口使用 interface 关键字。

    接口名一般以I开头或者Interface结尾

    接口中的方法都是公共的抽象方法

    类可以继承类,但是只能单继承的,接口也可以继承接口,但是却可以继承多个接口,也就是说一个接口可以同时继承多个接口

接口实现类

  • 接口实现类概念

    和抽象类一样,接口是不能创建对象的,此时必须定义一个类去实现接口,并覆盖接口中的方法,这
    个类称之为实现类,类和接口之间的关系称之为实现关系(implements)。
    public class 类名 implements 接口名 1,接口名 2{
    覆盖接口中抽象方法
    }
    在类实现接口后,覆盖接口中的抽象方法,完成功能代码,此时接口和实现类之间的关系:

    • 接口:定义多个抽象方法,仅仅定义有哪些功能,却不提供实现。

    • 实现类:实现接口,覆盖接口中抽象方法,完成功能具体的实现。

多态

  • 多态概念:
    将子类对象装到父类的变量中保存(向上造型/向上转型),当父类变量调用方法的时候,如果子类重写了该方法,会直接执行子类重写之后的方法。(父类变量可以装任意类型的子类对象)。

  • 多态作用:
    可以屏蔽子类差异性,提高代码的扩展性(通过代码理解,不要从字面理解)

  • 多态使用

    1. 向上造型/向上转型:
      语法:
      父类类型 父类变量 = new 子类类型();
      父类变量.方法();//子类若重写,则会执行子类重写后的方法
    例如:
    Animal animal = new Person();//多态的方式(向上造型/向上转型)
    Animal animal2 = new Pig();//多态的方式(向上造型/向上转型)
    
    //调用方法
    	    animal.eat();//吃肉...   执行子类重写后的方法
    	    animal2.eat();//吃白菜    执行子类重写后的方法
    
    
    1. 向下造型/向下转型: =>就是为了调用子类特有方法
    例如:(接上面案例)
       现在需要调用子类Person中特有的方法或者调用子类Pig中特有的方法,不能调用怎么办?
    这个时候就需要强制转换(向下造型/向下转型):
    强制转换(向下造型/向下转型)语法:	
    数据类型 变量 = (数据类型)值/变量;
    
    在向下造型前,必须进行类型判断,需要判断当前父类变量中装的是哪一个子类类型的对象
    	类型判断方式1:
    	   if(父类变量 instanceof 子类类型1){
    		//强制类型转换
    		子类类型1	子类变量 = (子类类型1)父类变量;
    		//现在就可以调用子类特有方法
    		子类变量.子类特有方法(...);
    	   }else if(父类变量 instanceof 子类类型2){
    		//强制类型转换
    		子类类型2	子类变量 = (子类类型2)父类变量;
    		//现在就可以调用子类特有方法
      		子类变量.子类特有方法(...);
      	  }...
    	
    
    
    
    类型判断方式2:
      	if(父类变量.getClass() == 子类类型1.class){
      		//强制类型转换
    		子类类型1	子类变量 = (子类类型1)父类变量;
    		//现在就可以调用子类特有方法
    		子类变量.子类特有方法(...);
    	}else if(父类变量.getClass() == 子类类型2.class){
    		//强制类型转换
    		子类类型2	子类变量 = (子类类型2)父类变量;
    		//现在就可以调用子类特有方法
    		子类变量.子类特有方法(...);
    	}...
    
         如果不进行类型判断再强转,就有可能发生ClassCastException类造型异常	
    类型判断方式2:
      	if(父类变量.getClass() == 子类类型1.class){
      		//强制类型转换
    		子类类型1	子类变量 = (子类类型1)父类变量;
    		//现在就可以调用子类特有方法
    		子类变量.子类特有方法(...);
    	}else if(父类变量.getClass() == 子类类型2.class){
    		//强制类型转换
    		子类类型2	子类变量 = (子类类型2)父类变量;
    		//现在就可以调用子类特有方法
    		子类变量.子类特有方法(...);
    	}...
    
         如果不进行类型判断再强转,就有可能发生ClassCastException类造型异常	
    

多态注意事项

  1. 成员变量没有多态
  2. 不能调用子类特有的方法,如果需要调用子类特有的方法,必须进行强制类型转换(向下造型/向 下转型),向下造型需要进行子类类型判断
  3. 父类变量能点(调用)出哪些成员(成员变量和方法),是由当前类和其父类决定,优先从当前类 开始查找,直到找到Object了为止,如果Object中有没有,就不能调用