《Java编程思想》笔记4:继承,多态

本篇关注:继承(第7章),多态(第8章)


组合 composition:将现有类的对象引用放于新类中。

继承 inheritance

创建一个类时总是在继承。使用extends声明,子类会获得父类的属性和方法。
如果没有声明,则默认继承Object类。

被继承的类:超类,基类,父类 superclass, base class, parent class
继承而来的类:子类,导出类,派生类,孩子类 subclass, derived class, extended class, child class

super

super表示父类/超类。this 代表对象本身。
可使用super调用父类的属性和方法。
在子类中调用super.XX() 就是调用父类版本的XX()方法。

在子类的构造器中使用super()可调用父类构造器。
super()必须位于构造器内第一行,实际上子类构造器已经隐含。不用再写。
super(args)调用具有相同参数的父类构造器。
this 和 super 不能出现在同一个构造器里。
this()和super()都指的是对象,均不可以在static环境中使用。

在执行main方法时,会执行加载--验证--准备--初始化这个过程

  1. 类加载完毕后,从最基础的根基类开始“向外”扩散,依次执行其static初始化,因为子类的static初始化可能会依赖基类成员是否被正确初始化
  2. 到此为止,必要的类都已经加载完毕,对象可以被创建;
    在实例化子类对象时,会自动调用基类的构造器。

初始化顺序:
父类静态变量 ---> 父类静态代码块 ---> 子类静态变量 ---> 子类静态代码块 --->
父类非静态变量 ---> 父类非静态代码块 ---> 父类构造器 --->
子类非静态变量 ---> 子类非静态代码块 ---> 子类构造器

每个类的编译代码存在于独立文件中,该文件只在初次使用程序代码时才被加载,通常指创建类的第一个对象时。由于构造器是隐式static,所以类是在其任何static成员被访问时加载的。

如果父类有某个被多次重载的方法,在子类中重新定义该方法不会覆盖父类方法中的任何版本。
只是相当于在子类中增加了一种重载方法。调用子类的这个方法时可以使用所有的重载版本。

@Override 注解:
当你覆写某个方法时,可以将这个注解添加在方法之前,以防你不小心重载而不是覆写了这个方法。

向上转型 Upcasting
把子类转型成父类,从一个较专用类型转成通用类型。因为子类至少具备父类所有方法,所以很安全。
Shape s = new Circle()

实际中,优先使用组合,较少用继承。使用继承的一个判断方法:如果需要向上转型,则用继承。

final

final基本数据类型:编译时常量,程序运行时被初始化,之后不能被改变。
final对象引用:引用恒定不变,对象本身可变。数组也是如此。
static final变量:只占一段空间。通常强调一个不能改变的常量。变量名是全大写,用_分隔。

域中final变量声明时可以不赋值,然后在构造器中赋值。

final参数:在方法的参数列表中将参数声明为final,使参数不能更改,主要用来向匿名内部类传递数据。
final方法:以防被子类重写。

private方法都隐式地指定为final,不需要再加final。

final类:禁止它被继承,不被修改。final类中方法都隐式地指定为final。域则不受影响。
Java中的一些核心API都是final的,比如String、Intege、Math等。


多态 Polymorphism

OOP语言中,数据抽象(封装),继承,多态是三大基本特征。

将一个方法调用同一个方法主题关联起来被称作绑定binding。
前期绑定:在程序执行前进行绑定。
后期绑定:也叫动态绑定,运行时绑定。运行时根据对象的类型进行绑定 。
Java中除了static方法和final方法(包括private方法)之外,其他所有方法都是后期绑定。
多态是由后期绑定实现的。

多态存在的三个前提:继承,重写,父类引用指向子类对象(向上转型)
有了多态特性,程序就可以只与父类接口通信,根据接收到的不同类型,使用相应的子类方法。

子类对象在向上转型为父类引用时,域的访问操作都将由编译器解析,不是多态的。想得到Father.field必须显式地指明。

子类的构造过程中,程序首先会逐层向上链接,先调用父类构造器,再逐层向下调用。

在Java中,所有转型都会得到检查,以保证它的确是我们希望的那种类型;如果不是,就会返回一个ClassCastException(类转型异常)。
这种在运行期间对类型进行检查的行为称作“运行时类型识别”runtime type identification(RTTI)。

向下转型Downcasting: (derivedClass)baseClass.derivedClassMethod()


References:

super( ) 和 this( ) 详解
对Java向上转型的理解

你可能感兴趣的:(《Java编程思想》笔记4:继承,多态)