目录
- 1.修饰类时
- 2.修饰方法时
- 3.修饰属性和局部变量时
- 3.1修饰局部变量时
- 3.2修饰成员变量时
- 3.3修饰类变量时
- 4.final与普通变量的区别
- 5.final用于引用
1.修饰类时
1.只能是公共的(public)就算不写也是public
2.被final修饰的类不可以被继承
//前面默认有个public 写不写都行final class A{ }
2.修饰方法时
1.方法不能不能覆盖
2.被final修饰的方法,JVM会尝试将其内联,以提高运行效率
3.修饰属性和局部变量时3.1修饰局部变量时
1.要赋值
2.不能被改变
public class Test01 { public static void main(String[] args) { go(); } public static void go(){// 方式一:初始化的时候赋值// final int age = 10; // 方式二:先初始化后赋值 final int age; age = 10; System.out.println(age); }}
3.2修饰成员变量时
1.必须在系统赋默认值之前赋值
2.不可更改
public class Test01 {// 1.写法一报错未在创建时声明对象// final int a;// a =10;// 2.写法二正确// final int a = 10;// 3.写法三正确 final int a;// 赶在系统赋默认值之前赋值就行,系统赋默认值在构造方法执行的时候 public Test01() { this.a =0; }}
final String name = "qy";//报错name = "ym";final Object obj = new Object();//报错obj = new Object();
3.3修饰类变量时
1.与static结合使用修饰的变量是常量
2.常量要符合命名规范,全部大写,可以用下划线连接
3.被final修饰的常量,在编译阶段会存入常量池中
public class Main {// final 放前放后都一样// final static double PI = 3.1415926; static final double PI = 3.1415926;}
4.final与普通变量的区别
public class Test1 { public static void main(String[] args) { String a = "hello2"; final String b = "hello"; String d = "hello"; String c = b + 2; String e = d + 2; System.out.println((a == c)); System.out.println((a == e)); }}//结果//true//false
public class Test2 { public static void main(String[] args) { String a = "hello2"; final String b = getHello(); String c = b + 2; System.out.println((a == c)); } public static String getHello() { return "hello"; }}//结果//false
通过上面两个例子,我们可以发现在Test1中被final修饰的变量在进行字符串串接的时候,地址没变,但是在Test2中通过方法调用后就变了,也就是说间接的赋值会改变地址。
5.final用于引用
如果修饰引用,那么表示引用不可变,引用指向的内容可变。
public class Test02 { public static void main(String[] args) { final Student stu = new Student("小芊",18); //可以修改里面的值 stu.setName("芊嵛");// 不能再new// stu = new Student("ff",5); }}