: final关键字修饰类,不可以被继承。即final类没有子类;
: final 关键字修饰方法,方法不可被重写;
: final 关键字修饰属性(变量)时,变量不可再被赋值;
final 修饰属性(变量)
final修饰属性(变量)时,此时的属性称之为常量;
java中用final定义常量时,命名规范全部用大写;
常量在java内存常量池中的地址不可以改变,但是地址中的值(即对象中的属性)可以改变;
此处先插入一下对变量扩展,此处一直比较迷糊,引用一篇其他人简洁的博客http://blog.sina.com.cn/s/blog_ae96abfd0101kvcp.html
摘抄其中比较精简的文字:
java中数据类型分为两大类:基本数据类型与复合数据类型
相应地,变量也有两种类型:基本类型与引用类型
Java的8中基本类型的变量称为基本类型变量,而类、接口和数组变量是引用类型变量
再简单插入下java内存中常量池的扩展:
常量池在java虚拟机启动的时候加载,即常量池在代码编译的时候被确定,保存在.class中;
常量池中基本类型值已经在编译的时候确定,存放引用类型的引用变量的地址;
所以上面横线的那句话可以拆分成两句:
1、如果常量是基础数据类型的,则值不能被改变;
2、如果常量是引用类型的,则引用地址不能被改变,但是地址中的值可以被改变;
样例:
定义一个类
package main.test;
public class FinalDemo {
private String str;
public FinalDemo(String str){
this.str = str;
}
public String getStr() {
return str;
}
public void setStr(String str) {
this.str = str;
}
}
--定义常量
package main.test;
public class FinalTest {
public static void main(String[] args) {
final FinalDemo f1 = new FinalDemo("1");
final FinalDemo f2 = new FinalDemo("2");
fa=f2;
}
}
//编译报错:The final local variable f1 cannot be assigned. It must be blank and not using a compound assignment
可以看到引用地址不可以再被改变
package main.test;
public class FinalTest {
public static void main(String[] args) {
final FinalDemo f1 = new FinalDemo("1");
f1.setStr("2");
System.out.println(f2.getStr());
}
}
//运行结果是2,说明引用地址中的值是可以改变的,即引用内容可以被改变