组合、继承、代理
①组合:在新的类中产生现有类的对象。由于新的类是由现有类的对象所组成。该方法只是复用了现有程序代码的功能,而非它的形式。适合has-a 关系
②继承:按照现有的类型来创建新类。无需改变现有类的形式,采用其形式并在其中添加新代码。适合is-a关系③代理:为了避免得到新类(继承or组合)的对象中所有的方法都暴露给外界,我们将新类的对象放在一个代理类中定义和初始化,然后设置需要提供给外界的方法和成员。
默认构造器的隐式生成
如果没有自定义构造器,JAVA会生成一个无参数的默认构造器;一旦定义了自定义构造器,JAVA就不会自动生成一个默认构造器
继承:
extends
一个子类继承父类,就会继承父类全部
protect、public、默认权限
的非static
方法和成员变量。(
static
方法与类绑定,见多态章节)构造器与继承
构造器实质上是隐式声明的
static
方法,所以创建子类的时候,构造器不会被继承(否则就乱了,A-B-C,C直接用A的构造器构造出来,不符合设计理念)但是子类的默认构造器会默认带有一个隐式
super()
,子类被实例化时会默认调用父类的构造器。一旦在子类自定义了构造器,JAVA就不会自动生成带有
super()
默认构造器,所以自定义子类构造器里需要自己手动调用super()
方法。此时如果父类构造器带参数,那么就要在子类构造器中使用一样的参数列表(可以添加其他参数),然后调用super(传入父类构造器的参数)
以上的设计解释:
基类的构造器总是在导出类的构造过程中被调用,而且按照继承层次逐渐向上链接,以使每个基类的构造器都能得到调用(执行顺序则为从基类到子类)。这样做是有意义的,因为构造器具有一项特殊任务:检查对象是否被正确地构造。导出类只能访问它自己的成员,不能访问基类的成员(基类成员通常是private类型)。只有基类的构造器才具有恰当的知识和权限来对自己的元素进行初始化。因此,必须令所有构造器都得到调用,否则就不可能正确构造完整对象。这正是编译器要强制每个导出类部分都必须调用构造器的原因。
基类对于一般方法,可以通过super.method()和this.method()分别调用父类/本类中的方法
super
代表父类this
代表子类①可以通过
super.var
和this.var
分别调用父类/本类中的成员②对于一般方法,可以通过
super.method()
和this.method()
分别调用父类/本类中的方法③对于构造方法,通过
super(参数表)
和this(参数表)
,分别调用父类/本类的构造方法,且必须写在本构造方法的第一行写
super
调用父类构造器的时候只能写该子类的直接父类有的构造器构造函数调用栈:定义子类的一个对象时,会先调用子类的构造函数,然后在调用父类的构造函数,如果父类函数足够多的话,会一直调用到最终的父类构造函数,函数调用时会使用栈空间,所以按照入栈的顺序,最先进入的是子类的构造函数,然后才是邻近的父类构造函数,最后再栈顶的是最终的父类构造函数,构造函数执行是则按照从栈顶到栈底的顺序依次执行:也就是先执行父类的构造方法,再执行子类的构造方法
而一般方法就不会这样,可以写在方法内任意位置,按照顺序调用即可
一个构造函数只能出现一个this或一个super
this
和super
都指的是对象,所以,均不可以在static环境中使用。包括:static变量,static方法,static语句块。this
是指向本对象的指针,super
是一个Java关键字重载与重写
重载:一个类里面,方法名字相同,而参数不同。返回类型可以相同也可以不同。
重写:重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变。即外壳不变,核心重写!
protected
权限修饰符就类用户而言,这是private的,但对于以下两种情况可以访问
①保内或包外的继承该类的子类
②同一包内的类(相当于包含默认权限)
向上转型与向下转型
向上转型 : 将子类引用转换为父类引用的动作
向上转型后,父类只能调用父类方法或者子类重写后的方法,而子类中的单独方法则是无法调用的,父类中被重写的方法也是无法调用的(除非子类用super调用父类方法),因为本质只是引用的转换
其目的只是方便参数统一、有利于程序设计
向下转型 : 通过父类强制转换为子类,从而来调用子类独有的方法
向下转型会自动进行安全性检查,即该类型是否为目标类。向上转型之后再向下转型的对象可以通过安全性检查
体现了多态性,见下一章
final
①修饰类:这个类不能被继承
final类中的成员方法都会被隐式的指定为final方法。(显然地,类都无法被继承了,那方法和成员自然不可能 被子类重写)
②修饰方法:这个方法不能被子类重写
private
方法和成员隐式默认为final
③修饰成员变量:必须要赋初始值,且只会被初始化一次,以后不可被修改(即使在同一个类中也不可修改)
final
成员变量可以①定义处赋初值②定义处不赋初值,在构造器中赋初值一个
static final
的成员变量只占据一段不能改变的储存空间,即实质为define一个常量如果是final引用,代表引用本身(地址值)不可修改,但引用指向的对象是可以修改的
加载子类之前会先加载父类
如果继承关系是A-B-C-D-E,那么就会按照E-D-C-B-A一步一步往回找直到基类,然后再按A-B-C-D-E加载各类
见
super
的使用那儿,super
调用父类构造器必须(默认构造器是隐式的)放在子类构造器第一行,也即是要先执行父类的构造方法,再执行子类的构造方法重要:构造函数是私有的,构造函数不能被覆盖,不能被继承(重写),但可以被重载(同一个类中同名不同参的构造函数)。只是每一次继承父类的是,子类会默认创建一个无参构造函数,然后可以通过显式调用super(null / parameters)来使用父类构造函数,或者就是调用父类中 已定义的无参构造函数
复用类
2018-4-17
JAVA复用类
赏