面向对象
# 面向对象三大特征
封装:将属性private关键字隐藏在内部,对外暴露set,get方法
继承:子类继承父类,子类可以访问父类的属性和方法,也可以重写一些父类的方法;
多态:父类的引用指向子类的实例,引用类型的变量发出的方法调用到底执行的哪个类中的方法,是在运行期才能确定;
多态可以通过方法重写和重载来实现;
# 接口&抽象类
区别:
- 单继承,实现多接口
- 都可以有成员变量,接口默认public static final,抽象类默认default;
- 自上而下,自下而上;
共同点:
- 都不能实例化
- 都可以包含抽象方法
# 静态方法和成员方法区别?
调用方式
成员方法 对象名.方法名;
静态方法 类名.方法名;
静态方法不能使用this,this代指当前对象 当静态方法完成加载可以执行时 对象可能还没有创建;
加载时期
成员方法:随着创建对象调用方法时加载;
静态方法:随着类的加载就会加载静态方法(变量);
# 静态变量作用
可以被类的所有实例共享,静态变量只会被分配一次内存,即使创建多个对象,节省内存;
# Comparable&Comparator
Comparable:
package java.lang;
public interface Comparable<T> {
int compareTo(T);
}
2
3
4
5
返回负值:正序排序
public class User implements Comparable<User> {
private String username; // 用户名
private Integer age; // 年龄
@Override
public int compareTo(User nextUser) {
// 这里我们先直接使用 Integer 自带的 compareTo 进行比较
return this.age.compareTo(nextUser.getAge());
}
}
2
3
4
5
6
7
8
9
10
Comparator:
@FunctionalInterface
public interface Comparator<T> {
int compare(T o1, T o2);
boolean equals(Object obj);
}
2
3
4
5
负值:o1排o2前面
Collections.sort(userList, (o1, o2) -> {
return o1.getAge().compareTo(o2.getAge());
});
log.info("userList: {}", userList);
// userList: [User(username=李四, age=9), User(username=张三, age=11)]
2
3
4
5
# final finalize finally
final
修饰成员变量,如果是基本数据类型,值不能改变;引用类型,只能指向初始化指向的那个对象,不能指向别的对象,内容可以改变;
修饰方法,该方法不能被重写,可以被重载;
修饰类,不能被继承,所有方法不能被重写,所以不能同时使用abstract和final修饰类;
finalize
用于回收资源,再垃圾回收器清除对象之前调用;
释放资源:关闭连接,关闭文件
finally
用于捕捉异常,也不一定执行,如虚拟机终止;
# 重载与重写区别?
重载:同一个类中多个同名方法根据不同的传参来执行不同的逻辑处理;
重写:发生在运行期,是子类对父类的允许访问的方法的实现过程进行重新编写;
方法名、参数列表必须相同,子类方法返回值类型应比父类方法返回值类型更小或相等,抛出的异常范围小于等于父类,访问修饰符范围大于等于父类;
如果父类方法访问修饰符为
private final static
则子类就不能重写该方法,但是被static
修饰的方法能够被再次声明;构造方法无法被重写;
# hashCode()与equals()?
hashCode()判断对象相等更快,但是会误判;
两个对象相等,则hashCode相等,如果equals判断两个对象相等,则两个对象的hashCode值也要相等;
如果重写equals()没重写hashCode()会导致equals()判断的相等的对象,hashCode不相等;