1.重载重写的区别
重载:
在一个类里,方法名相同,参数列表不同,包括参数个数,参数类型,参数顺序不同。访问权限修饰符和返回值类型没有要求。
当调用重载方法时,根据参数个数和类型决定调用哪个重载函数。
重写:
在父子类中,父类定义了方法无法满足子类特有要求,子类重新定义该方法。要求访问权限修饰符不能比父类严格,返回值类型相同或者是父类返回值类型的子类,方法名和参数列表必须一致,子类异常不能比父类多。
如果父引用指向子类,子类重写方法调用子类,没有重写调用父类。
2.抽象类和接口的区别
1) 定义抽象类用class,只能有一个父类,abstract不能省略
接口用interface,可以有多个父接口
2) 抽象类的属性默认是default,没有static final修饰
接口中属性默认是public static final修饰
3) 抽象类中可以有构造函数,供子类调用
接口中不能有构造函数
4) 抽象类中可以有普通方法,甚至可以全是普通方法而没有抽象方法。abstract不能省略
接口中必须全是抽象方法,不能有普通实例方法,可以有静态方法包含方法体,abstract可省略
5) 抽象类定义多个子类公共的属性和方法
接口定义的是多个无关类的公共的属性和方法
3.final,finally,finalize
final:
修饰类不能被继承
修饰方法不能被重写
修饰全局变量,声明时赋初始值;修饰局部变量可以先声明后赋值;
修饰基本数据类型赋值后不能更改,修饰引用数据类型赋值后不能指向其他对象,指向对象里的属性可以改变
finally:
finally和try-catch一起使用,表示无论是否抛异常都执行finally中代码,一般用于资源释放。
finalize:
是Object类中的方法,可以被子类重写,垃圾回收机制回收对象时调用该方法,该方法有可能使对象复活取消回收。
4.static
1) 静态变量 (类属性): 成员变量(实例变量,全局变量,属性)被static修饰
静态方法 (类方法): 成员方法(实例方法)被static修饰
静态内部类
静态代码块
2) 静态方法或静态代码块 只能访问静态的,因为非静态的还没有分配空间。
非静态的方法或代码块可以访问所有包括静态和非静态。
3) 访问:
类名.静态成员变量
类名.静态成员方法
对象.静态成员变量
对象.静态成员方法
对象.实例成员变量
对象. 实例成员方法
(类方法和类属性,如果在同一个类中,可以直接访问)
解释说明:
1) 如果数据在内存中存在,可以访问和使用。反之则不能访问和使用
2) static修饰的所有数据在类加载的时候分配内存,只分配一次。当执行main函数的时候,静态修饰的类属性类方法已经在内存中存在,所以可以通过类名直接访问。
3) 非静态实例属性实例方法在new创建对象的时候分配空间,才在内存中存在,所以必须通过对象访问。
4) static修饰在加载代码时分配一次内存,一直存在直到程序销毁。
static修饰的方法或者代码块中不能使用this关键字、super关键字。
5) 静态代码块在类加载时执行,执行一次。
自由代码块在创建对象时执行。先执行自由代码块,后执行构造函数
注意:碰到new关键字:堆内存开辟空间,调用构造函数,自由代码块
5.单例模式(二选一记住)
1) 懒汉式(线程安全--同步代码块,双重检查):
public class Singleton {
private static Singleton singleton;
private Singleton() {}
public static Singleton getInstance() {
if (singleton == null) {//--------1 ,第二次第三次调用,不进入到同步代码块中
synchronized (Singleton.class) {
if (singleton == null) {//如果第一个线程执行到1cpu时间到,第二个线程可以全部将getInstance执行完。再回到线程1,此处如果不判断又开辟空间,违反单例
singleton = new Singleton();
}
}
}
return singleton;
}
}
2) 静态内部类
public class Singleton {
private Singleton() {}
private static class SingletonInstance {//私有静态内部类
private static final Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance() {
return SingletonInstance.INSTANCE;
}
}