面向对象总结
继承: 类 和 类, 单继承 extends
子类继承父类:
1.继承父类中所有可见的成员方法和成员变量
2.父类的构造方法不能被子类继承, 只能被子类调用
3.子类可以重写父类的方法
方法名和参数列表一样
返回值类型, 小于等于 父类的返回值类型
权限, 大于等于 父类的权限
子类调用父类:
super() -> 调用父类无参构造方法
super.m1() -> 调用父类的成员方法
super.a -> 调用父类的成员变量
super 只能在子类中使用
this: 当前对象, 自己
static: 属于类, 通过 类名. 来调用
static{} -> 静态代码块, 类加载时执行
类加载:
1.创建类的对象
2.调用类的静态成员
3.创建子类对象, 先加载父类, 再加载子类
4.调用子类的静态成员, 先加载父类, 再加载子类
5.Class.forName(String className): 手动加载
java.lang.String java.util.ArrayList
抽象abstract:
抽象方法: 只能存在于抽象类或者接口中
抽象类: 可以用来放抽象方法
不能实例化
有构造方法, 给自类调用的
final:
final class -> 不能被继承
final void m1() -> 不能被重写
final int a -> 不能被改变, 常量, 必须初始化
成员变量a, 必须在创建对象时初始化
final static int B -> 必须初始化, 静态常量
类加载时, 必须初始化完成
常量: 固定几个选项时, 通常类型都是int
将选项起个名字-变量, final 变量
如果常量要在外部无关类中使用, 通常为了方便, 都会定义成static
实现: 接口
抽象方法 -> 必须被实现类重写/覆盖的
静态常量 -> 直接通过接口类型使用
默认方法 -> 有具体实现, 可以不被重写
静态方法 -> 直接通过接口类型使用
私有方法 -> 给默认方法提供的
使用接口, 必须有实现类, 并且创建实现类对象
多态: 编译时看左边, 运行时看右边
父类 a = new 子类();
接口 b = new 接口实现类();
a.m1(): 说明m1声明在父类中
子类重写了m1方法
编译时类型: 只在编译时有效
泛型
a 想要调用子类特有的方法, 需要强制转换
可能会出现 ClassCastException
解决方式, 提前使用 a instanceof 子类
意义: 扩展方法的功能
内部类:
成员内部类 -> 类中
public class Outer{
public class Inner{
}
}
Outer.Inner in = new Outer().new Inner()
局部内部类 -> 方法中
public void m1() {
int a = 10;
class Inner {
// 使用a, a必须是final
}
}
只在方法中可以使用, 一次性
匿名内部类
接口/抽象类 b = new 接口/抽象类() {
// 真正的类, 重写抽象方法
}
只能创建一次对象
静态内部类 -> 属于类的
public class Outer{
public static class Inner{
}
}
Outer.Inner in = new Outer.Inner()
权限:
外部类: public/(default)
成员内部类: public/protected/(default)/private
局部内部类: 不能使用
方法: public/protected/(default)/private
成员变量: public/protected/(default)/private
局部变量: 不能使用