Day Nine
回顾篇(面向对象知识):
继承: 类 和 类, 单继承 extends
-
子类继承父类:
- 继承父类中所有可见的成员方法和成员变量
- 父类的构造方法不能被子类继承, 只能被子类调用
- 子类可以重写父类的方法
重写的方法名和参数列表与父类中一样
子类返回值类型 小于等于 父类的返回值类型
子类访问权限 大于等于 父类的访问权限
-
子类调用父类:
super() -> 调用父类无参构造方法
super.m1() -> 调用父类的成员方法
super.a -> 调用父类的成员变量
super 只能在子类中使用
this: 指当前对象,自己 -
静态
stati::修饰的方法或变量属于类,通过 类名. 来调用
static{…} -> 静态代码块, 在类加载时执行
类加载:
执行的原因:
- 创建类的对象
- 调用类的静态成员
- 创建子类对象, 先加载父类, 再加载子类
- 调用子类的静态成员, 先加载父类, 再加载子类
- 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方法
编译时类型: 只在编译时有效泛型:< E >
若对象 a 想要调用子类特有的方法,则需要强制转换:(子类)a. 方法
可能会出现 ClassCastException 异常(不是正确的子类对象)
解决方式, 提前使用 a instanceof 子类名 (判断 a 是否为该子类的对象,返回 boolean 类型)
意义:扩展方法的功能 -
内部类:
-
成员内部类 —> 类中
public class Outer{ public class Inner{ } } 创建对象方法: Outer.Inner in = new Outer().new Inner()
-
局部内部类 —> 方法中
public void m1() { int a = 10; class Inner { // 在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
局部变量: 不能使用
-