1.访问修饰符
访问修饰符 | outer class | inner class | member_var | member_func | note |
---|---|---|---|---|---|
public | √ | √ | √ | √ | 包及包之外 |
protected | √ | √ | √ | 同一包内和不同包的子类 | |
default(friendly) | √ | √ | √ | √ | 同一包内 |
private | √ | √ | √ | 只能被该类自身访问修改 |
2.组合
即实现接口,组合比继承更易维护,程序设计时优先选择组合的方法。
对象引用的三种初始化的方法:
指定初始化:
声明时就初始化完成或者在构造代码段中初始化。
在构造器中初始化:
如果调用默认构造器,成员变量会被初始化为默认值。
懒惰初始化:
如果对于某个成员变量一直没有初始化,那么JVM只会初始化该变量为默认值,只有到该变量第一次被调用时由程序员手动初始化。
3.多态的概念
多态就是事物的多种形态,一个对象在不同条件下所表现的不同形式
- 继承或实现:在多态中必须存在有继承或实现关系的子类和父类
- 方法的重写:子类对父类中的某些方法进行重新定义(重写,使用@Override注解进行重写)
- 基类引用指向派生类对象,即父类引用指向子类对象(向上造型)
4.upcast
向上造型,假如我们有以下类
当我们声明一个Cat时,我们可以有以下两种方法:
Animal cat = new Cat();//向上造型
Cat cat = new Cat();
使用向上造型的方法可以增强我们程序的兼容性和可扩展性,并且减少代码重复。
比如我们想要创建一个数组来存储很多Animals
我们只需要创建一个Animals数组,而不用创建一个Cat数组和一个Dog数组。
- 向上造型情况下,子类和父类存在同名的静态或非静态成员变量时,访问的是父类的成员变量
- 向上造型情况下,子父类存在同名的非静态成员方法时,访问的是子类中重写的方法
- 向上造型情况下,子父类存在同名的静态成员变量成员方法时,访问的是父类的成员方法
- 向上造型情况下,不能访问子类独有的方法
- 对于子类独有的方法,父类无法访问,
6.downcast
但是在上例中,若采用向上造型的方法来声明变量,那么我们的cat只能进行cat.eat()
而不能进行cat.cute()
,若需要使用cute方法我们可以进行强制类型转换,Cat realCat = (Cat)cat
,这种强制类型转换就称作向下造型。
但是当我们向下造型时倘若我们将本是Cat类型的实例强制转换为Dog类型Dog dog = (Dog)cat
,这时会报错,为了避免这种情况我们可以使用instanceof
运算来检测目标实例属于什么类。
cat instanceof Cat // true
cat instanceof Dog // false
cat instanceof Animal // true
5.final 关键字含义
final变量----常量
可以初始化但不能被修改
final方法----派生类无法修改的方法
并且效率高,如果一个方法是final的,所以对该方法的调用都转为内嵌调用
final类----不可以被继承的类
static final变量----静态常量
可以初始化但不能被修改
6.基类的初始化:
(1)在创建派生类对象时,该对象包含一个基类的子对象。基类的子对象的初始化是通过调用基类构造函数实现,自动在派生类的构造器中插入对基类的构造器的调用
(2)基类的构造器在派生类构造器之前被调用。
(3)如果没有默认的构造器或构造器带参数必须显式的调用
详细见这里
继承中的方法重写:
如果基类中的某个方法被重载多次,在派生类中依然可以继承,且不会hide基类中的任何版本。
重写是重新覆盖父类的方法,如果没有重写,那么子类调用一个子类没有的方法时,其实是调用父类。
重载是同样的方法名,但参数名称不同,为了防止错误的进行重载可以加上@Override标签