09 多态和特殊类

838 阅读5分钟

01 多态

多态是指同一种事物表现出来的多种形态。

多态的语法格式是:父类类型 引用变量名=new 子类类型();

Person p=new Student();

多态的特点:

  • 当父类类型的引用指向子类类型的对象时,父类类型的引用可以直接调用父类独有的方法
  • 当父类类型的引用指向子类类型的对象时,父类类型的引用不可以直接调用子类独有的方法
  • 对于父子类都有的非静态方法来说,编译阶段调用父类版本,运行阶段调用子类重写的版本(动态绑定)
  • 对于父子类都有的静态方法来说,编译和运行阶段都调用父类版本

多态的实际意义:在于屏蔽不同子类的差异性实现通用编程带来不同的效果

02 引用数据类型之间的转换

引用数据类型之间的转换方式有两种:自动类型转换和强制类型转换。

具体转换规则如下:

  • 自动类型转换主要指小类型向大类型的转换,也就是子类转为父类,也叫做向上转型

  • 强制类型转换主要指大类型向小类型的转换,也就是父类转为子类,也叫做向下转型或显式类型转换

  • 引用数据类型之间的转换必须放生在父子类之间,否则编译报错

  • 若强转的目标类型并不是该引用真正指向的数据类型时则编译报错,运行阶段发生类型转换异常

  • 为了避免上述错误,应该在强转之前进行判断,格式是:if(引用变量 instanceof 数据类型)

    判断引用变量指向的对象是否为后面的数据类型

03 抽象方法和抽象类

抽象方法是指不能具体实现的方法并且使用abstaract关键字修饰,也就是没有方法体。

语法格式是:访问权限 abstract 返回值类型 方法名(形参列表);

public abstract void run();

抽象类是指不能具体实例化的类并且使用abstract关键字修饰,也就是不能创建对象。

抽象类和抽象方法之间的关系:

  • 抽象类中可以有成员变量、成员方法、构造方法
  • 抽象类中可以没有抽象方法,也可以有抽象方法
  • 拥有抽象方法的类必须是抽象类,因此真正意义上的抽象类应该具有抽象方法并且使用abstract关键字修饰的类

抽象类的实际意义:抽象类的意义不在于创建对象而在于被继承。当一个类继承抽象类后必须重写抽象方法,否则该类也变成抽象类,也就是抽象类对子类具有强制性和规范性,因此叫做模版设计模式

04 实际开发经验分享

  • 在开发中推荐使用多态的格式,此时父类类型引用直接调用的所有方法一定是父类拥有的方法,若以后更换子类时,只需将new关键字后面的子类类型修改而其他地方无需改变就可立即生效,从而提高了代码的可维护性和可扩展性
  • 该方式的缺点是:父类应用不能直接调用子类独有的方法,若想调用,必须进行强制类型转换

05 接口

接口是一种比抽象类还抽象的类,体现为所有的方法都为抽象方法。

定义类的关键字是class,而定义接口的关键字是interface

public interface Runner{
  public abstract void run();

}

类和接口之间的关系是:

3.PNG

06 抽象类和接口的主要区别(笔试题)

  1. 定义抽象类的关键字是abstract class,而定义接口的关键字是interface
  2. 继承抽象类的关键字是extends,而实现接口的关键字是implements
  3. 继承抽象类支持单继承,而实现接口支持多实现
  4. 抽象类中可以有构造方法,而接口中不可以有构造方法
  5. 抽象类中可以有成员变量,而接口只可以有常量
  6. 抽象诶中可以有成员方法,而接口只可以有抽象方法
  7. 抽象类中增加方法时子类可以不重写,而接口中增加方法时实现类需要重写(java8以前的版本)
  8. 从java8开始增加新特性,接口允许出现非抽象方法和静态方法,但非抽象方法需要使用default关键字修饰
  9. 从java9开始增加新特性,接口中允许出现私有方法

07 abstract关键字笔试考点

  • private和abstract关键字不能共同修饰一个方法
  • final和abstract关键字不能共同修饰一个方法
  • static和abstract关键字不能共同修饰一个方法

abstract修饰的成员方法是抽象方法,是没有具体实现的,需要被继承后,由子类来实现方法,其中private修饰的成员方法,子类是无法继承的,所以抽象方法也就无法被实现,故无法共存;final修饰的方法是可以被继承的,但无法进行方法重写,这也导致抽象方法无法被子类实现;最后是抽象方法是没有实现的,所以为了避免误调抽象方法,类使用abstract关键字修饰,即无法被实例化,也就无法被调用,当成员方法被static关键字修饰后,方法有对象层级提升为类层级,抽象方法就可以通过类名.方法名()的方式被调用,这显然是不对的,以上就是abstract关键字不能和private、final、static关键字共同修饰方法的原因。