抽象类
抽象类介绍:
用 abstract 关键字来修饰一个类时,这个类就是抽象类
访问修饰符 abstract 类名{
}用 abstract 关键字来修饰一个方法时.这个方法就是抽象方法
访问修饰符 abstract 返回值类型 方法名(参数值);//没有方法体- 抽象类的价值更多作用是在于设计,是设计者设计好后,让子类继承并实现
抽象类()
细节:
- 抽象类不能实例化
- 抽象类可以没有 abstract 方法
- 一旦包含了 abstract 方法则这个类必须声明为 抽象类
- abstract 只嗯呢该修饰类和方法,不能修饰属性和其他的.
- 抽象类可以有任意成员[抽象类还是类],比如:非抽象方法,构造器,静态属性等
- 抽象方法不能有主体,即不能实现
abstract void aaa(){}//错误
- 如果一个类继承了抽象类,则他必须实现抽象类的所有方法,除非他自己也是声明为抽象类.
- 抽象方法不能使用 private, final 和 static 来修饰,因为这些关键字都是和重写相违背的. [重点]
(static 修饰的类没有实现 )
代码块(386~)
代码块调用顺序优先于构造器调用
构造器的补充机制:如多个构造器中都有重复语句,可以抽取到初始化代码块中,提高代码的重用性.
类被加载的情况[重要]
- 创建对象的实例时(new)
AA aa = new AA();
- 创建子类对象实例,父类也会被加载,而且,父类先被加载,子类后被加载.
AA aa2 = new AA();
- 使用类的静态成员时(静态属性,静态方法)
System.out.println(Cat.n1)
细节:
- static代码块是在类加载时执行的,被隐式的调用,而且不管有几个类被创建, 只会执行一次
- 普通代码块是有几个类被创建,就执行几次,(和类的加载无关[a.di]) [普通代码块是构造器的补充]
- 创建一个对象时,在一个类调用顺序是:
(1) 静态属性初始化的优先级和静态代码块的优先级相同 都在类创建时被调用
(2) 普通属性初始化的优先级和普通代码块的优先级相同
(3) 调用构造方法 - 创建一个子类对象时,他们的静态代码块,静态属性初始化,普通代码块,普通属性初始化,构造方法调用如下:
- 父类的静态代码块和静态属性(优先级一样,按定义顺序执行)
- 子类的静态代码块和静态属性(优先级一样,按定义顺序执行)
- 父类的普通代码快和普通属性初始化(优先级一样,按定义顺序执行)
- 父类的构造方法
- 子类的普通代码快和普通属性初始化(优先级一样,按定义顺序执行)
- 子类的构造方法
- 静态代码块只能直接调用静态成员(静态成员和静态方法),普通代码块可以调用任意成员.
class Person{
int age = 90;
String name;
Person(int a,String n){
age = a;
name = n;
}
Person P = new Person(18,"小倩");
}
对象创建流程分析(面试题)
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单继承机制的补充
不同
- 接口和继承解决问题不同
继承的价值在于:解决代码的复用性和可维护性
接口的价值在于:设计,设计好各种规范(方法),让其他类去实现这些方法,即更加灵活 - 接口比继承更加灵活
接口比继承更加灵活,继承是满足is - a 的关系,而接口满足 like - a的关系 - 接口在一定程度上实现代码解耦合
[解耦合:接口规范性+动态绑定]
接口
基本介绍
interface 接口名{
//属性
//方法(1. 抽象方法 2. 默认实现方法 3. 静态方法)
}
- 在接口中可以省略 abstract 关键字.
- 在jdk8以后,可以有默认实现方法,需要使用 default 关键字修饰
- 在jdk8以后,可以有静态方法,
使用细节
- 接口不能被实例化
- 接口中所有的方法是 public 方法,接口中抽象方法,可以不用 abstract 修饰
- 一个普通类实现接口,就必须将接口的所有方法都实现,可以用 alt + enter 解决
- 抽象类实现接口,可以不用实现接口的方法
- 一个类同时可以实现多个接口
- 接口中的属性,只能是final的,而且是 public static final 修饰符
- 接口中属性的访问形式: 接口名.属性名
- 一个接口不能继承其他的类,但是可以继承多个别的接口
interface A extends B,C{}
- 接口的修饰符 只能是 public 和默认,这点和类的修饰符是一样的.
接口的多态体现
接口类型的变量可以指向实现了接口的对象实例(向上转型类似)
类的五大成员
属性
方法
构造器
代码块
内部类
值传递,地址传递
this关键字
- this 关键字可以用来访问本类的属性、方法、构造器
- this 用于区分当前类的属性和局部变量
访问成员方法的语法:this.方法名(参数列表);
访问构造器语法:this(参数列表); 注意只能在构造器中使用(即只能在构造器中访问另外一个构造器, 必须放在第一 条语句)
- this 不能在类定义的外部使用,只能在类定义(构造方法)的方法中使用。