目录
1、final的概念
- 当一个类被描述完之后不想被继承,或者某些类的部分方法是固定的,不想被子类重写,要解决这些问题,需要使用一个关键字final
- final的意思为最终,不可变
- final是一个修饰符,它可以用来修饰类、类的成员、以及局部变量
2、final的特点
2.1、final修饰类
final修饰的类不可以被继承,但是它可以继承其他类
class A {}
final class B extends A {}
class C extends B {} // 这里B类是不可以被继承的
2.2、final修饰方法
final修饰的方法不可以被重写,但是父类中没有final修饰的方法,子类重写后可以追加final关键字
class A {
public final void method01() {}
public void method02() {}
}
class B extends A {
method01() // 不可以被重写
public final void method02() {}
}
2.3、final修饰变量
final修饰的变量称为常量,这些变量只能被赋值一次
final int i = 123;
i = 1; // 赋值报错
final修饰的变量为引用类型,引用类型的变量值为对象地址,地址值不能更改,但是地址内的对象属性值可以修改
final Person p1 = new Person();
Person p2 = new Person();
p1 = p2; // final修饰的变量p1所记录的地址不能改变
p1.name = "小镭" // final修饰的变量p1的属性可以改变
2.4、final修饰成员变量
final修饰成员变量,需要在创建对象前赋值,否则报错(当没有显示赋值时,多个构造方法均需要为其赋值)
class Demo {
final int m = 123;
final int n;
public Demo(int n){
// 可以在创建对象所调用的构造方法中,为n赋值
n = 1;
}
public Demo(){
n = 1;
}
}
3、static的概念
- 当在调用某个方法时,这个方法没有访问到对象的特有数据,这是去创建这个类的对象就显得有些多余,但不创建对象,方法就调用不了。要解决这个问题,就可以使用static关键字
- static是静态修饰符,一般用来修饰类中的成员
4、static的特点
4.1、static修饰的成员变量
被static修饰的成员变量属于类,但不属于这个类的某个对象
class Demo {
public static int num = 123;
}
class Test {
public static void main(String[] args){
Demo d1 = new Demo();
Demo d2 = new Demo();
d1.num = 1;
System.out.println(d1.num); // 结果为1
System.out.println(d2.num); // 结果也为1
}
}
4.2、static修饰的成员
被static修饰的成员可以通过类名直接访问
访问静态成员的格式:
类名.静态成员变量;
类名.静态成员方法(参数);
对象名.静态成员变量; -- 不建议使用
对象名.静态成员方法(参数); -- 不建议使用
class Demo {
public static int num = 123;
public static void method(){
System.out.println("静态方法");
}
}
class Test {
public static void main(String[] args){
System.out.println(Demo.num);
Demo.method();
}
}
5、static的注意事项
- 静态内容是优先于对象存在的,只能访问静态,不能使用this或super。静态static修饰的内容存于静态区。
class Demo {
public int num = 123;
public static void method(){
System.out.println(this.num); // 不能使用this或super
}
}
- 同一类中,静态成员只能访问静态成员
class Demo {
public int num = 123;
public static int n = 1;
public static void method(){
System.out.println(m); // 静态方法中,只能访问静态成员变量或者静态成员方法,要报错
System.out.println(n);
}
}
- main方法为静态方法,仅仅为程序执行入口,它不属于任何一个对象,可以定义在任意类中
6、定义静态常量
- 定影静态常量,使用public static final 修饰的变量来完成。变量名全部大写,多个单词使用下划线连接
- 定义格式
public static final 数据类型 变量名 = 值;
public static final String COMPANY_NAME = "XIAOLEI";
注意:
- 接口中的每个成员变量都默认使用public static final 修饰
- 所有的接口中定义成员变量都是静态常量,由于接口没有构造方法,所以必须是显示赋值,可以直接使用接口名访问。
interface Inter {
public static final int COUNT = 123;
}
访问:
Inter.COUNT