final关键字
可修饰类、属性、方法和局部变量
用途:
不希望类被继承时
不希望父类中的某个方法被子类重写/覆盖
不希望类的某个属性的值被修改
不希望某个 局部变量 被修改
使用细节:
final修饰的属性又称为常量, 名字要按照XX_XX_XX来命名
final修饰的属性在定义时必须赋初值,赋值可选以下位置:
定义时 public final double TAX_RATE = 0.08;
在构造器中
在代码块中
如果final修饰的属性是静态(public final static int MAX_NUM = 23435465;)的,则初始化的位置只能是
final类不能继承,但是可以实例化对象(“能使用”)
类不是final类但是有final方法,则该方法虽不能重写,但是可以被继承(“能使用”)
如果一个类已经是final类了,就不用再把方法也定义成final方法了
final不能修饰构造器
final往往和static搭配使用,底层编译器对此做了优化处理(用类中的属性不会导致类加载),效率更高
public class StaticFinal {
public static void main(String[] args) {
System.out.println(AA.num);
}
}
class AA{
public final static int num = 1000;
static {
System.out.println("类AA被加载了");
}
}
1000
包装类(Integer,Double,Float,Boolean等类都是final类),String类也是final类
抽象类
父类的某些方法不能确定如何实现时,可以将其声明为抽象方法,那么这个类就是抽象类
抽象方法:没有实现的方法,即没有方法体
abstract class Animal {
private String name;
public abstract void eat();
}
注意:
抽象方法不能有方法体
一旦一个方法被声明为抽象方法,其所在的类必须被声明为抽象类
子类一定要实现抽象方法,否则会报错
抽象类不能被实例化(不能new)
抽象类可以没有抽象方法
abstract只能修饰类或者方法,不能修饰属性
抽象类可以拥有任意成员(因为其本质还是类,可以有类的各种成员)构造器、属性、非抽象方法、代码块
若一个类继承了抽象类,则这个类必须要实现这个抽象类所有的抽象方法,除非这个子类也是抽象的
抽象类、方法不能使用private、final和static来修饰,这些关键字都是和重写相悖的
抽象类最佳实践:模板设计模式
好处:提高代码复用性
示例:若不使用抽象类,则需要在每个类中都写calculateTime
public abstract class TestTemplate {
public abstract void job();
public void calculateTime(){
long start = System.currentTimeMillis();
job();
long end = System.currentTimeMillis();
System.out.println("job()方法执行时间:"+(end - start));
}
}
public class TestFile {
public static void main(String[] args) {
A a = new A();
B b = new B();
a.calculateTime();
b.calculateTime();
}
}
class A extends TestTemplate{
public void job(){
long sum = 0;
for (int i = 0; i < 1000000; i++) {
sum += i;
}
}
}
class B extends TestTemplate{
public void job(){
int sum = 1;
for (int i = 0; i < 100000; i++) {
sum *= i;
}
}
}
