一、final关键字修饰类,方法以及变量的特点
1.final概述
- final(最终、修饰符)
2.final修饰特点
- 修饰类,该类不能被继承
- 修饰变量,该变量就变成了常量,只能被赋值一次
- 修饰方法,该方法不能被重写
3.案例演示
class Demo1_Final {
public static void main(String[] args) {
Son s = new Son();
s.print();
}
}
class Son /*extends Father*/ {
//常量命名规范,如果是一个单词,所有字母大写,如果是多个单词,每个单词都大写,中间用下划线隔开
final int NUM = 10;
//final修饰变量叫做常量,一般会与public static共用
public static final double PI = 3.14;
public void print() {
//NUM = 20;
System.out.println(NUM);
}
}
输出:10,并且Son方法中的NUM如果去掉注释会报错。
二、final关键字修饰局部变量
- 案例演示
-
方法内部或者方法声明上都演示一下(了解)
-
基本类型,是值不能被改变
-
引用类型,是地址值不能被改变,对象中的属性可以改变
-
class Demo2_Final {
public static void main(String[] args) {
final int num = 10;
//num = 20;
System.out.println(num);
final Person p = new Person("张三", 23);
//p = new Person("李四",24);
p.setName("李四");
p.setAge(24);
System.out.println(p.getName() + "..." + p.getAge());
method(10);
method(20);
}
public static void method(final int x) {
System.out.println(x);
}
}
class Person {
private String name; //姓名
private int age; //年龄
public Person() {
} //空参构造
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public void setName(String name) { //设置姓名
this.name = name;
}
public String getName() { //获取姓名
return name;
}
public void setAge(int age) { //设置年龄
this.age = age;
}
public int getAge() { //获取年龄
return age;
}
}
输出:
10
李四...24
10
20
三、final修饰变量的初始化时机
- final修饰变量的初始化时机
- 显示初始化
- 在对象构造完毕前即可
class Demo3_Final {
public static void main(String[] args) {
Demo d = new Demo();
d.print();
}
}
class Demo {
final int num; //成员变量的默认初始化值是无效值
public Demo() {
num = 10;
}
public void print() {
System.out.println(num);
}
}
输出:10
四、总结
1.final关键字的用法:
- final关键字修饰一个基本类型的变量(包括局部变量和成员变量)时,该变量不能重新赋值,第一次的值为最终的。
- fianl关键字修饰一个引用类型变量时,该变量不能重新指向新的对象。
- final关键字修饰一个函数的时候,该函数不能被重写。
- final关键字修饰一个类的时候,该类不能被继承。
2.final关键字主要用于修饰类、类成员、方法、以及方法的形参。
3.常量的修饰符一般为:public static final,final和static可以互换位置。
- 用public的原因不是必须的,但是常量必须用static和final,即使常量用public把它的权限公开,对外别人仍然不能改变它的数据,而且把权限公开,便于你在任何情况下都可以访问的到这个常量。
- 如果不用static,比如π,别人每创建一个对象,内存中就存在着一份3.14,但是这个值是固定的,没有人可以改变它,也就是说一份数据大家用到的都是一样的。共享给大家使用即可
总而言之
- final可以修饰类,方法,变量。
- final修饰的类不可以被继承。
- final修饰的方法不可以被覆盖。
- final修饰的变量是一个常量,只能被赋值一次。
- 内部类只能访问被final修饰的局部变量。