封装、继承、多态
多态:一个对象具有多种的状态,父类的引用指向子类的实例。
向上转型:当给一个类变量赋值时,这个变量的类型既可以使用这个类本身,也可以使用这个类的超类。
通过使用超类(抽象类或接口),把对象真正类型隐藏在超类型之后,这些对象才能在类型检查时被互相替换使用而不报错。
类与接口
函数式接口
JAVA 8 函数式接口 - Functional Interface
// 正确的函数式接口
@FunctionalInterface
public interface TestInterface {
// 抽象方法
public void sub();
// java.lang.Object中的public方法
public boolean equals(Object var1);
// 默认方法
public default void defaultMethod(){
}
// 静态方法
public static void staticMethod(){
}
}
// 错误的函数式接口(有多个抽象方法)
@FunctionalInterface
public interface TestInterface2 {
void add();
void sub();
}
浅拷贝与深拷贝
内部类
内部类的访问规则
- private内部类,外部不能直接访问,通过外部类getInner()
- 实现多继承(内部类进行继承)
- 匿名内部类作为参数传给方法,在方法内回调(类似于JS的高阶函数)
成员内部类
就把这个类当作一个外部类的成员,其修饰符public/private的访问权限类似普通成员变量。内部类
非静态内部类 | 静态内部类 |
---|---|
类中的变量和方法不能声明为静态的。 (非静态内部类在编译完成之后会隐含地保存着一个引用,该引用是指向创建它的外围内,但是静态内部类却没有。所以非静态内部类并不随外部类一起加载,只有在实例化外部类之后才会加载,在没有加载时就调用内部类的静态属性和方法会有问题。 |
属性和方法可以声明为静态的或者非静态的。 |
可以访问外部类中所有的成员变量和成员方法(包括private的) | 访问外部类的static成员和方法(包括private的) |
外部类名.内部类名 对象名 = new 外部类名.new 内部类名(); |
外部类名.内部类名 对象名 = new 外部类名.内部类名(); |
局部内部类
匿名内部类
傻子都能看懂的匿名内部类
匿名内部类中不能存在任何的静态成员变量和静态方法。
new 抽象类名或者接口名() {
重写方法();
}