1.抽象类
1.1 什么是抽象类?
1.2 抽象类与普通类的区别?
- 抽象类不能被实例化,普通类可以实例化
- 语义上:例如:香蕉是一个具体的类 苹果是一个具体类 水果这个抽象类是在两者基础上提取的抽象类。你可以实例化一个香蕉 苹果 但是语义上 实例化一个水果是没有意义的。
- 语法上 :假设抽象类能实例化 但是抽象类中存在的抽象方法无方法体 无法执行 是矛盾的。
- 抽象方法只有声明 不能有实现
- 抽象方法本质上只是定义一个功能,具体功能的实现 不同的子类有不同的实现
1.3 抽象类的使用?
- 1.抽象类中可以没有抽象方法,但包含了抽象方法的类必须定义为抽象类
- 为什么有时没有抽象方法的类还需要定义为抽象类呢?设计当前类的时候,能预想到后续可能有抽象功能的添加,则设计为抽象类。如果当前类定义为普通类,后续如果有抽象功能的扩展,修改为抽象类后,所有实例化当前类的地方都会报错,不利于后续的扩展。
- 2.子类没有实现父类所有的抽象类 子类必须定义为抽象类
- 3.抽象类中可以有非抽象的构造方法,创建子类的实例时可能调用
1.4 抽象类 和接口的使用原则?
- 满足is a的关系 父类抽取为抽象类;类满足has a 功能/特性的时候 抽取这些功能为接口
- 抽象类抽取为父类便于代码复用,各种子类有一些共性的方法 ,把这些方法抽取为父类可以提高代码的复用率,但同时这些方法有五花八门的实现时,需要抽取为抽象方法。 而接口便于功能扩展,类通过实现接口 扩展了这个类的功能和能力;
1.5 抽象类和接口的区别?
- 相同点
- 都是上层 抽象类作为父类被继承 接口作为上层被实现
- 不能被实例化
- 都能包含抽象方法,用于描述系统提供的服务 不必提供具体的实现
- 不同点
- 设计思想上 抽象类是对一组具有相同属性和方法的逻辑上有关系的事物的一种抽象,而接口则是对一组具有相同属性和方法的逻辑上不相关的事物的一种抽象,因此抽象类表示的是“is a”关系,接口表示的是“like a”关系。
2.final
2.1 final 什么意思
2.2 final 可以修饰什么
- (1)final修饰类:不让其他类去继承了 如:String 类
- (2)fianl修饰方法:不能被重写了
- (3)final修饰属性:
①此属性表示此属性赋值以后就不能再改变了,如果是引用类型 则地址不再变化。 - ②属性赋值位置: 在定义的时候赋值 /在构造器中赋值(如果有多个构造器 必须多个构造器都有赋值 防止在创建对象的时候 修改属性值 )/代码块赋值
3.static
3.1 static 什么意思?
- 静态的 存储在数据区 全局只有一份 随着类的加载 static 修饰的也会加载和初始化。
3.2 static 可以修饰什么
- 属性:多个对象公用一个变量 通过类名直接调用
- 方法: 通过类名直接调用 。但在静态方法内,只能调用静态的方法和属性 因为随着类的加载 静态方法和类变量都加载了,非静态的属性和方法随着对象的创建才会在堆空间里新建
- 内部类
3.3 static 注意事项
- 被static修饰的成员变量和成员方法独立于该类的任何对象。也就是说,它不依赖类特定的实例,被类的所有实例共享 所以构造器不能构造静态变量。
public class Student {
private String name;
private Integer age;
private static String school;
public Student(String name, Integer age) {
this.name = name;
this.age = age;
}
public Student(String name, Integer age,String school) {
this.name = name;
this.age = age;
this.school=scholl;
}
}