访问权限
Java中有三种访问权限修饰符:public、protected和private,如果不加访问修饰符,就是default(默认的、包级)
可以对类或类中的成员(字段以及方法)加上访问修饰符:
- 类可见表示其他类可以用这个类创建实例对象
- 成员可见表示其他类可以用这个类或这个类的实例对象访问到该成员
所以,Java中一共有四种权限,其权限控制的大小情况是这样的:public > protected > default > private
权限 | 本类 | 本包的类 | 非本包的子类 | 非子类的外包类 |
---|---|---|---|---|
public | √ | √ | √ | √ |
protected | √ | √ | √ | × |
default | √ | √ | × | × |
private | √ | × | × | × |
抽象类和接口
1.抽象类
抽象类和抽象方法都使用abstract关键字进行声明。如果一个类中包含抽象方法,那么这个类必须声明为抽象类。
抽象类和普通类最大的区别就是,抽象类不能被实例化,需要继承抽象类才能实例化其子类。
2.接口
在Java8之前,它可以看成完全抽象的类,也就是说它不能有任何的方法实现。
从Java8开始,接口也可以拥有默认的方法和静态的方法实现。
接口的成员(字段 + 方法)默认都是public的,并且不允许定义为private或者protected。
接口的字段默认都是 static 和 final 的。
3.比较
- 从设计层面上看,抽象类提供了一种IS-A关系,而接口更像是LIKE-A关系。
- 从使用上来看,一个类可以实现过个接口,但是不能继承多个抽行类
- 接口的字段只能是static 和 final 类型的,而抽象类的字段没有这种限制
- 接口的成员只能是public的,而抽象类的成员可以有多种访问权限
super
- 访问父类的构造函数:可以使用super() 函数访问父类的构造函数,必须是第一行
- 访问父类的成员(字段 + 方法):如果子类重写了父类的某个方法或某个字段,可以使用super关键字调用父类的方法或字段
重写与重载
1.重载
存在于同一类中,指一个方法与已经存在的方法名称上相同,但是参数类型、个数、顺序至少有一个不同。
返回值不同,其他都相同不算是重载。
2.重写
存在于继承体系中,指子类实现了一个与父类在方法声明上完全相同的一个方法。
重写有以下三个限制:
- 子类方法的访问权限必须大于等于父类方法
- 子类方法的返回类型必须是父类放回类型或为其子类型
- 子类方法抛出的异常类型必须是父类抛出异常类型或为其子类型。
使用 @Override 注解,可以让编译器帮忙检查是否满足上面的三个限制条件。
在调用一个方法时,先从本类中查找是否有对应的方法,如果没有查找到再到父类中查看,看是否有继承的方法。否则就要对参数进行转型,转成父类之后看是否由对应的方法。总的来说,方法调用的优先级为:
- this.func(this)
- super.func(this)
- this.func(super)
- super.func(super)