- 继承
- 父类也称作超类,基类,派生类等。
- Java中只有单继承。
- Java中类没有多继承,接口有多继承。
- 子类继承父类,可以得到父类的全部属性和方法(
除了父类的构造方法
),但不见得可以直接访问(比如父类私有的属性和方法)。 - 如果定义一个类时没有使用extends,则它的父类是 java.lang.Object。
在eclipse中使用Ctrl + T可以展示类继承树。或者快捷菜单:
F4可以展示类的方法和属性。
- override
- “==”:方法名和形参列表相同。
- “≤”:返回值类型和声明异常类型,子类小于等于父类。
- “≥”:访问权限,子类大于等于父类。
-
super
super是对直接父类对象的引用,可以通过super来访问父类中被子类覆盖前的方法和属性。 -
继承树追溯
属性/方法查找顺序:(以属性h为例)
- 查找当前类中有没有属性h。
- 依次上溯每个父类,查看每个父类中是否有h,直到Object。
- 如果没找到,则出现编译错误。
- 上面步骤,只要找到变量,则这个过程终止。
构造方法调用顺序:
- 构造方法第一句总是super(…)来调用父类对应的构造方法。所以,流程是先向上追溯到Object,然后再依次向下执行类的静态初始化块和构造方法,直到当前子类为止。
- 构造方法的第一句 super(); 可以不写,如果不写系统也会自动加上。
- 封装
修饰符 | 同一个类 | 同一个包 | 子类 | 所有类 |
---|---|---|---|---|
private | √ | |||
default | √ | √ | ||
protected | √ | √ | √ | |
public | √ | √ | √ | √ |
- 多态
- 多态是方法的多态,不是属性的多态(多态与属性无关)。
- 多态的存在要有三个必要条件:继承,方法重写,父类引用指向子类对象。
- 父类引用指向子类对象后,用该父类引用调用子类重写的方法,此时多态就出现了。
- 转型(casting)
- 自动向上转型
- 强制向下转型
- final
- 修饰变量:只能被赋值一次值(变成常量)。
- 修饰方法:不能被子类重写(但可以重载)。
- 修饰类:修饰的类不能被继承。
- 数组
- 声明
int[] arr=new int[10];
int[][] arr2=new int[10][];
多维数组声明:
- 初始化
静态初始化
int[] a1={1,2,3,4};
User[] a2={new User(1,"张三"),new User(2,"李四"),new User(3,"王五")};
int[][] a3=new int[3][]
//嵌套定义
a3[0]=new int[]{20,22};
a3[1]=new int[]{12,17,29};
a3[2]=new int[]{87,18};
int[][] a4={
{18,16,2},
{76,88},
{76,29,38,66}
};
默认初始化
int[] a3=new int[3]; //数组元素给出默认值(和类的成员变量赋初值的规则一样)
//数字:0
//boolean:false
//对象:null
动态初始化
//通过下标挨个赋值
a4[0]=1;
a4[1]=2;
a4[2]=3;
- this关键字
- 在程序中用于解决二义性。普通方法中this总是指向调用该方法的对象。构造方法中this总是指向正要初始化的对象。
- this作为非静态方法的隐含参数被传递。
- this仅能在构造方法中调用其他重载的构造方法,且只能位于构造方法的第一句。
- this不能用于static方法。
-
组合
组合的核心就是 将父类对象作为子类的属性,子类通过调用这个属性来获得父类的方法及属性。一般has-a关系使用组合,而is-a关系使用继承。 -
数组拷贝
System.arraycopy(object src, int srcpos, object dest, int length)