一、继承
继承(inheritance)是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展(extends)(增加功能)产生新的类,称派生类。继承主要解决的问题是:共性的抽取。被继承的类我们称为父类、基类或超(级)类,产生的新类我们称为子(级)类,派生类。
1)语法规则:
class 子类 extends 父类 {
}
①使用
extends
继承
父类;
②Java
中一个子类
只能
继承
一个
父类;继承后在子类的对象中就
会存在父类的
数据成员;
③子类会继承父类的
所有 public 的字段和方法
;对于父类的 private 的字段和方法
子类是
无法访问
的(会继承);
④子类的实例中
包含着父类
的实例,
可以使用
super
关键字得到父类实例的引用;
※注意:在调用子类构造方法之前会先调用父类构造方法,当子类构造方法中没有使用"super(参数或无参数)"指定调用父类构造方法时,是默认调用父类的无参构造方法;如果父类中包含有参构造方法,就没有系统所提供的无参构造方法了,则这时在子类构造方法中一定要使用“super(参数)”指定调用父类的有参构造方法,且必须放在第一行,不然就会报错。
2)protected关键字:
我们知道,如果把字段设为 private,子类不能访问;但是设成 public又违背了我们 "封装" 的初衷。那么,两全其美的办法就是使用 protected 关键字。因为对于类的调用者来说,protected 修饰的字段和方法是不能访问的;对于类的 子类 和 同一个包的其他类 来说,protected 修饰的字段和方法是可以访问的。
※注:
我们希望类要尽量做到
"
封装
",
即:
隐藏内部实现细节
只暴露出
必要
的信息给类的调用者。
因此我们在设计的时候应该尽可能的使用
比较严格
的访问权限,即:
如果一个方法能用 private 就尽量不要用 public
。
3)复杂的继承关系:
多层
继承,
即子类还可以进一步的再派生出新的子类。但
即使这样可以
, 却
并不希望类之间的继承层次太复杂,
一般不要
出现
超过三层
的继承关系。
4)final关键字:
当final
修饰一个变量或者字段的时候
,
表示
常量在赋值之后无法改变;当final修饰的是引用类型时,表示不能再指向别的东西(即
赋值后其指向地址无法改变),但是可以改变其中的内容;且final修饰的
方法不允许被子类覆盖,final修饰的
类也不能被继承。
final修饰的成员变量在赋值时可以有三种方式:①在声明时直接赋值;②在构造器中赋值;③在初始代码块中进行赋值。
5)关于 this 和 super(获取到父类实例的引用) :
如果是子类的某个属性是
继承自的父类的属性,那么可以
既可以用 this.属性 访问(或修改内容)
也可以用 super.属性 访问(或修改内容),修改后改变的也是
同一个对象,因为这时二者表示的是同一个属性对象;但如果子类
新建了一个和继承自父类的属性
一样的属性,那么此时 this.属性 和 super.属性 表示的就
不是同一个对象了,二者
互不影响,且想访问子类的这个属性就
只能通过 this.属性 的方法了。
二、组合
组合和继承类似,
也是一种表达类之间关系的方式,
也能够达到
代码重用
的效果。
组合
是
将一个类的实例作为另外一个类的字段
。
※区别继承和组合:
组合表示
has
-
a
语义,即 "包含
" 的关系;
继承表示
is
-
a
语义,即 "是
" 的关系。