Java基础语法07-面向对象-多态

抽象类

  • 抽象方法 : 没有方法体的方法。

  • 抽象类 :被abstract所修饰的类。

抽象类的语法格式:

【权限修饰符】 abstract
class 类名{

}

【权限修饰符】 abstract class 类名 extends 父类{

}

抽象 方法
的语法格式:

【其他修饰符】 abstract 返回值类型  方法名(【形参列表】);

子类对父类抽象方法的完成实现,我们将这种方法重写的操作,也叫做

实现方法


注意事项

  1. 抽象类
    不能创建对象
    ,如果创建,编译无法通过而报错。只能创建其非抽象子类的对象。

    理解:假设创建了抽象类的对象,调用抽象的方法,而抽象方法没有具体的方法体,没有意义。

  2. 抽象类中,也有构造方法,是供子类创建对象时,初始化父类成员变量使用的。

    理解:子类的构造方法中,有默认的super()或手动的super(实参列表),需要访问父类构造方法。

  3. 抽象类中,不一定包含抽象方法,但是有抽象方法的类必定是抽象类。

    理解:未包含抽象方法的抽象类,目的就是不想让调用者创建该类对象,通常用于某些特殊的类结构设计。

  4. 抽象类的子类,必须重写抽象父类中
    所有的
    抽象方法,否则,编译无法通过而报错。除非该子类也是抽象类。

    理解:假设不重写所有抽象方法,则子类中可能包含抽象方法。那么创建对象后,调用抽象的方法,没有意义。

多态

多态
: 是指同一个类别的事物的同一行为,在不同的子类别中具有多个不同表现形式。

从语法角度来说,多态就是在运行期间才能确定调用哪个类的方法,即执行子类重写的方法。

前提【重点】

  1. 继承父类或者实现接口【二选一】

  2. 方法的重写【意义体现:不重写,无意义】


    • 1)静态方法 2)

      final方法 3)
      private方法 4)
      属性;//这些不能重写的就不可能有多态(即静态绑定)。只有能重写的方法才有多态(即动态绑定)。

  3. 父类引用指向子类对象【格式体现】

多态体现的格式:

父类类型 变量名 = 子类对象;
变量名.方法名();//这个方法是父类中声明,子类中重写的方法

父类类型:指子类对象继承的父类类型,或者实现的父接口类型。

多态体现出来的现象:

  • 编译时,看“父类”,只能调用父类声明的方法,不能调用子类扩展的方法;

  • 运行时,看“子类”,一定是执行子类重写的方法体;

多态的应用

1、多态参数

形参是父类的类型,传入的实参是子类的对象

2、多态数组

元素的类型是父类的类型,存进去的元素对象是子类的对象

向上转型

  • 向上转型 :多态本身是子类类型向父类类型向上转换的过程,这个过程是默认的。

父类类型  变量名 = new 子类类型();

向下转型

  • 向下转型 :父类类型向子类类型向下转换的过程,这个过程是强制的。

子类类型 变量名 = (子类类型) 父类变量名;

向下转型有风险,可能会发生ClassCastException异常,如果想要避免这个异常,最好在向下转型之前,用 instanceof
进行判断。

变量名/对象 instanceof 数据类型

如果变量/对象属于该数据类型,返回true。

如果变量/对象不属于该数据类型,返回false。

虚方法动态绑定

  • 静态绑定:编译期间就确定访问哪个类的

    • 成员变量

    • 静态方法

    • 私有方法

    • final方法

  • 动态绑定:运行期间才确定访问哪个类的

native关键字

用法:


只能修饰方法

表示这个方法的方法体代码不是用Java语言实现的,但是可以当做Java的方法一样去正常调用它,或者子类重写它。

修饰符一起使用问题


外部类

成员变量

代码块

构造器

方法

局部变量

public





×





×

protected

×



×





×

private

×



×





×

static

×





×



×

final





×

×





abstract



×

×

×



×

native

×

×

×

×



×

不能和abstract一起使用的修饰符?

(1)abstract和
final

不能一起修饰
方法和类


(2)abstract和
static

不能一起修饰
方法


(3)abstract和
native

不能一起修饰
方法


(4)abstract和
private

不能一起修饰
方法


static和final一起使用:

(1)修饰方法:可以,因为都不能被重写

(2)修饰成员变量:可以,表示静态常量

(3)修饰局部变量:不可以,static不能修饰局部变量

(4)修饰代码块:不可以,final不能修改代码块

(5)修饰内部类:可以一起修饰成员内部类,不能一起修饰局部内部类

Object根父类


java.lang.Object

是类层次结构的根类,即所有类的父类。每个类都使用
Object
作为超类。


  • Object类型的变量与除Object以外的任意引用数据类型的对象都多态引用

  • 所有对象(包括数组)都实现这个类的方法。

  • 如果一个类没有特别指定父类,那么默认则继承自Object类。

关于Object类的API另见Java类/接口的API

原文 

http://www.cnblogs.com/Open-ing/p/11884169.html

本站部分文章源于互联网,本着传播知识、有益学习和研究的目的进行的转载,为网友免费提供。如有著作权人或出版方提出异议,本站将立即删除。如果您对文章转载有任何疑问请告之我们,以便我们及时纠正。

PS:推荐一个微信公众号: askHarries 或者qq群:474807195,里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

转载请注明原文出处:Harries Blog™ » Java基础语法07-面向对象-多态

赞 (0)
分享到:更多 ()

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址