控制访问权限
关键字 | 权限 |
---|---|
public | 允许所有途径的访问 |
default | 允许同一个类,同一个包的访问 |
protected | 允许同一个类,同一个包和子类访问 |
private | 只有在同一类可以访问 |
- 对于类方法,用private关键字限定则相当于一个final方法
组合
指一个类中包含有其他类的引用,在初始化时这个引用会被初始化为null,如果想初始化这些引用,可以在下列位置进行:
- 在定义对象的地方
- 在类的构造器中
- 在要使用这些对象以前
- 使用实例初始化
class Wheel{
Wheel(){
System.out.println("Wheel Constructor");
}
}
class Engine{
Engine(){
System.out.println("Engine Constructor");
}
}
class Car {
private Wheel wheel;
private Engine engine;
Car(){
engine = new Engine();
wheel = new Wheel();
System.out.println("Car Constructor");
}
}
public class TestCombination {
public static void main(String[] args) {
Car car = new Car();
}
}
与C++不同,组合的构造顺序与调用构造方法的调用顺序相同。
Engine Constructor
Wheel Constructor
Car Constructor
如果不在构造方法里显式调用构造方法,则会按声明顺序初始化
继承
继承语法
继承声明是在类主体的花括号左边花括号之前,书写后面跟随基类关键字extends 实现的
class Student extends Person{}
基类初始化
class Art{
Art(){
System.out.println("Art Constructor");
}
}
class Draw extends Art{
Draw(){
System.out.println("DRaw Constructor");
}
}
class Cartoon extends Draw{}
public class TextExtends {
public static void main(String[] args) {
Cartoon cartoon = new Cartoon();
}
}
当程序调用某一个类的对象时,JVM会先找到这个类的基类,然后执行初始化,并递归初始化所有的父类。所以,以上程序的执行结果为:
Art Constructor
DRaw Constructor
final关键字
- 当final关键字后跟基本类型时,表示这是一个编译期常量,这个常量必须在定义时初始化
- static后接final表示这个域只占据一块不能改变的空间,根据惯例,static final的域用大写字母表示并用下划线分隔
- 当final 后跟一个对象的引用时,表示该引用不变,一旦指向一个对象,就无法改变指向另一个对象
- 当final后跟一个方法时,表示该方法不能被重写
- 当final后跟一个类时,表示该类不能被继承
- Java允许空白final的用法,但空白的final必须在构造器中初始化
class Draw extends Art{
private final int a;
Draw(){
a=100;
System.out.println("DRaw Constructor");
}
}
多态
向上转型
类似于C++,可以用一个父类的引用管理一个子类对象,但不同于C++的是,Java不需要使用virtual关键字标明参与多态的方法,类中所有public方法都能参与多态,都能被Override。Java的动态绑定(也称运行时绑定)会完成C++中用指针才能完成的操作,可以直接用父类引用调用子类方法。
限制
只有类中的普通方法(public)可以参与多态,private、final、static修饰的方法不可以参与多态。
构造顺序
- 调用基类构造器。这个步骤会一直递归下去,直到导出最底层的类。
- 按声明顺序调用成员的初始化方法
- 调用子类主体构造器
继承与组合
- 组合多用来表达“has”关系,比如车有轮子,发动机
- 继承多用来表达“is a”关系,比如学生 是一个人
- 当不清楚如何选择时,首选组合