抽象类

抽象类介绍:

  1. 用 abstract 关键字来修饰一个类时,这个类就是抽象类
    访问修饰符 abstract 类名{
    }

  2. 用 abstract 关键字来修饰一个方法时.这个方法就是抽象方法
    访问修饰符 abstract 返回值类型 方法名(参数值);//没有方法体

  3. 抽象类的价值更多作用是在于设计,是设计者设计好后,让子类继承并实现
    抽象类()

细节:

  1. 抽象类不能实例化
  2. 抽象类可以没有 abstract 方法
  3. 一旦包含了 abstract 方法则这个类必须声明为 抽象类
  4. abstract 只嗯呢该修饰类和方法,不能修饰属性和其他的.
  5. 抽象类可以有任意成员[抽象类还是类],比如:非抽象方法,构造器,静态属性等
  6. 抽象方法不能有主体,即不能实现
    1. abstract void aaa(){}//错误
  1. 如果一个类继承了抽象类,则他必须实现抽象类的所有方法,除非他自己也是声明为抽象类.
  2. 抽象方法不能使用 private, final 和 static 来修饰,因为这些关键字都是和重写相违背的. [重点]
    (static 修饰的类没有实现 )

代码块(386~)

代码块调用顺序优先于构造器调用

构造器的补充机制:如多个构造器中都有重复语句,可以抽取到初始化代码块中,提高代码的重用性.

类被加载的情况[重要]

  1. 创建对象的实例时(new)
    1. AA aa = new AA();
  1. 创建子类对象实例,父类也会被加载,而且,父类先被加载,子类后被加载.
    1. AA aa2 = new AA();
  1. 使用类的静态成员时(静态属性,静态方法)
    1. System.out.println(Cat.n1)

细节:

  1. static代码块是在类加载时执行的,被隐式的调用,而且不管有几个类被创建, 只会执行一次
  2. 普通代码块是有几个类被创建,就执行几次,(和类的加载无关[a.di]) [普通代码块是构造器的补充]
  3. 创建一个对象时,在一个类调用顺序是:
    (1) 静态属性初始化的优先级和静态代码块的优先级相同 都在类创建时被调用
    (2) 普通属性初始化的优先级和普通代码块的优先级相同
    (3) 调用构造方法
  4. 创建一个子类对象时,他们的静态代码块,静态属性初始化,普通代码块,普通属性初始化,构造方法调用如下:
    1. 父类的静态代码块和静态属性(优先级一样,按定义顺序执行)
    2. 子类的静态代码块和静态属性(优先级一样,按定义顺序执行)
    3. 父类的普通代码快和普通属性初始化(优先级一样,按定义顺序执行)
    4. 父类的构造方法
    5. 子类的普通代码快和普通属性初始化(优先级一样,按定义顺序执行)
    6. 子类的构造方法
  5. 静态代码块只能直接调用静态成员(静态成员和静态方法),普通代码块可以调用任意成员.
  1. class Person{
  2. int age = 90;
  3. String name;
  4. Person(int a,String n){
  5. age = a;
  6. name = n;
  7. }
  8. Person P = new Person(18,"小倩");
  9. }

对象创建流程分析(面试题)

1.加载person类信息(Person.class),只会加载一次

2.在堆中分配空间(地址)

3.完成对象初始化[3.1 默认初始化 age = 0,name = null 3.2 现实初始化 age = 90,name = null 3.3 构造器初始化 age = 20,name = 小倩]

4.在对象在堆中的地址,返回给p(p是对象名,也可以理解为是对象的引用)

继承VS接口

当子类继承了父类.就自动的拥有了父类功能

如果子类需要扩展功能,可以通过实现接口的方式扩展

可以理解成 实现接口是对java单继承机制的补充

不同

  1. 接口和继承解决问题不同
    继承的价值在于:解决代码的复用性和可维护性
    接口的价值在于:设计,设计好各种规范(方法),让其他类去实现这些方法,即更加灵活
  2. 接口比继承更加灵活
    接口比继承更加灵活,继承是满足is - a 的关系,而接口满足 like - a的关系
  3. 接口在一定程度上实现代码解耦合
    [解耦合:接口规范性+动态绑定]

接口

基本介绍

interface 接口名{

  1. //属性
  2. //方法(1. 抽象方法 2. 默认实现方法 3. 静态方法)

}

  1. 在接口中可以省略 abstract 关键字.
  2. 在jdk8以后,可以有默认实现方法,需要使用 default 关键字修饰
  3. 在jdk8以后,可以有静态方法,

使用细节

  1. 接口不能被实例化
  2. 接口中所有的方法是 public 方法,接口中抽象方法,可以不用 abstract 修饰
  3. 一个普通类实现接口,就必须将接口的所有方法都实现,可以用 alt + enter 解决
  4. 抽象类实现接口,可以不用实现接口的方法
  5. 一个类同时可以实现多个接口
  6. 接口中的属性,只能是final的,而且是 public static final 修饰符
  7. 接口中属性的访问形式: 接口名.属性名
  8. 一个接口不能继承其他的类,但是可以继承多个别的接口
    1. interface A extends B,C{}
  1. 接口的修饰符 只能是 public 和默认,这点和类的修饰符是一样的.

接口的多态体现

接口类型的变量可以指向实现了接口的对象实例(向上转型类似)

类的五大成员

属性

方法

构造器

代码块

内部类

值传递,地址传递

第10章 面向对象编程 - 图1

this关键字

  1. this 关键字可以用来访问本类的属性、方法、构造器
  2. this 用于区分当前类的属性和局部变量
  3. 访问成员方法的语法:this.方法名(参数列表);

  4. 访问构造器语法:this(参数列表); 注意只能在构造器中使用(即只能在构造器中访问另外一个构造器, 必须放在第一 条语句)

  5. this 不能在类定义的外部使用,只能在类定义(构造方法)的方法中使用。