final
在Java中,final关键字用来可以用来修饰类、方法、变量
1、修饰类
当用final修饰一个类时,表明这个类不能被继承,final类中所有的成员方法都无法进行重写,因为没有子类。
public final class Animal {
}
2、修饰方法
修饰方法时,表示该方法不能被重写
public class Animal {
public final String eatFood(String food) {
return "动物在吃" + food;
}
}
重写final修饰的方法时,直接提示该方法不能被重写
用final修饰的方法可以重载,对重载方法没有影响。
public final void study(){
System.out.println("好好学习,天天向上");
}
public final void study(String name) {
System.out.println(name + "好好学习,天天向上");
}
注意:对于类、方法来说,abstract和final关键字不能同时使用,会有矛盾。
3、修饰局部变量
对于final修饰的局部变量
如果是基本数据类型的变量,则其数值一旦初始化后就不能修改;
如果是引用类型的变量,则在对其初始化之后不能再让其指向另一个对象,但是值可以更改;
基本类型
以int类型为例,基本类型一旦赋值之后就不能改变,如图:
对引用类型来说,不可改变的是变量当中的引用地址不可改变,但是内容可以改变。
Teacher,无final关键字修饰
//无final修饰
Teacher tea = new Teacher("张三");
System.out.println(tea.getName());
System.out.println(tea);
tea = new Teacher("李四");
System.out.println(tea.getName());
System.out.println(tea);
执行结果:引用地址改变了
Teacher,用final关键字修饰
虽然引用地址不能改变,但是内容可以改变
//final修饰
final Teacher tt = new Teacher("小五");
tt.setName("李现");
System.out.println(tt.getName());
System.out.println(tt);
4、修饰成员变量
对于成员变量来说,如果使用final关键字修饰,变量也是不可变的。
由于成员变量具有默认值,用final修饰之后必须手动赋值。
直接赋值或者构造方法初始化,二选一
直接赋值
@Setter
@Getter
public class Teacher {
private final String name = "123";
private String age;
private String speak;
// public Teacher(String name) {
// this.name = name;
// }
public void study(){
System.out.println("好好学习,天天向上");
}
}
构造方法赋值
@Setter
@Getter
public class Teacher {
private final String name;
private String age;
private String speak;
public Teacher(String name) {
this.name = name;
}
public void study(){
System.out.println("好好学习,天天向上");
}
}
必须保证类当中所有重载的构造方法,都最终会对final的成员变量赋值。
final修饰的成员变量必须由程序员显示的初始化,系统不会对变量进行隐式的初始化。
5、final修饰参数
final修饰形参,参数不能被赋值
static关键字
1、修饰成员变量
static变量称为静态变量,静态变量被所有的对象所共享,在内存当中只有一个副本,当且仅当在类初次加载时会被初始化。
非静态变量属于实例所拥有,在创建对象的时候被初始化,存在多个副本,各个对象拥有的副本互不影响。
//静态变量
private static String name;
//普通变量
private String age;
private String speak;
2、修饰成员方法
static修饰的方法,一般称做静态方法,由于静态方法不依赖于任何对象就可以进行访问,所以在静态方法中不能访问非静态成员变量和非静态成员方法。
在非静态成员方法中,可以访问静态成员变量和静态成员方法。
public class MainTest {
//静态方法
public static void main(String[] args) {
int a = add(str);
System.out.println(a);
}
static int add(Speak<? super Integer> p) {
Number first = p.getType();
Number last = p.getLevel();
return first.intValue() + last.intValue();
}
}
3、修饰代码块
static关键字用于形成静态代码块以优化性能,static块可以置于类中的任何地方,类中可以有多个static块。
在类初次被加载的时候,会按照static块的顺序来执行每个static块。
static{
int a = 10;
String name = "Lily";
int age = 30;
}
参考文档: