封装、继承、多态

多态:一个对象具有多种的状态,父类的引用指向子类的实例。

向上转型:当给一个类变量赋值时,这个变量的类型既可以使用这个类本身,也可以使用这个类的超类。

通过使用超类(抽象类或接口),把对象真正类型隐藏在超类型之后,这些对象才能在类型检查时被互相替换使用而不报错。

类与接口

类与接口

函数式接口

JAVA 8 函数式接口 - Functional Interface

  1. // 正确的函数式接口
  2. @FunctionalInterface
  3. public interface TestInterface {
  4. // 抽象方法
  5. public void sub();
  6. // java.lang.Object中的public方法
  7. public boolean equals(Object var1);
  8. // 默认方法
  9. public default void defaultMethod(){
  10. }
  11. // 静态方法
  12. public static void staticMethod(){
  13. }
  14. }
  15. // 错误的函数式接口(有多个抽象方法)
  16. @FunctionalInterface
  17. public interface TestInterface2 {
  18. void add();
  19. void sub();
  20. }

JDK 中定义了很多函数式接口
image.png

浅拷贝与深拷贝

image.pngimage.png

内部类

内部类的访问规则

  • 可以直接访问外部类的成员,包括私有
  • 外部类要想访问内部类成员,必须创建对象

    使用内部类的原因

  1. private内部类,外部不能直接访问,通过外部类getInner()
  2. 实现多继承(内部类进行继承)
  3. 匿名内部类作为参数传给方法,在方法内回调(类似于JS的高阶函数)

    成员内部类

    就把这个类当作一个外部类的成员,其修饰符public/private的访问权限类似普通成员变量。内部类
非静态内部类 静态内部类
类中的变量和方法不能声明为静态的。
(非静态内部类在编译完成之后会隐含地保存着一个引用,该引用是指向创建它的外围内,但是静态内部类却没有。所以非静态内部类并不随外部类一起加载,只有在实例化外部类之后才会加载,在没有加载时就调用内部类的静态属性和方法会有问题。
属性和方法可以声明为静态的或者非静态的。
可以访问外部类中所有的成员变量和成员方法(包括private的) 访问外部类的static成员和方法(包括private的)
外部类名.内部类名 对象名
= new 外部类名.new 内部类名();
外部类名.内部类名 对象名
= new 外部类名.内部类名();

局部内部类

定义在一个方法或一个作用域的类,很少用。

匿名内部类

傻子都能看懂的匿名内部类
匿名内部类中不能存在任何的静态成员变量和静态方法。

  1. new 抽象类名或者接口名() {
  2. 重写方法();
  3. }