* 1.final是一个关键字,表示最终的,不可变的
*
* 2.final修饰的类无法被继承
*
* 3.final修饰的方法无法被覆盖
*
* 4.final修饰的变量一旦被赋值后,不可重新赋值【不可二次赋值】
*
* 5.final修饰的实例变量,必须手动赋值,不能采用系统默认值
*
* 6.final修饰的引用,一旦指向某个对象之后,不能再指向其它对象,那么被指向的对象无法被垃圾回收器回收
*
* 7.final修饰的引用虽然指向某个对象之后不能指向其它对象,但是所指向的对象内部的内存是可以被修改的
*
* 8.final修饰的实例变量,一般和static联合使用,被称为常量
---------------------------------------------------------------------------------------------------------------------------------------------------------------
新建一个User类
package com.lbj.javase12;
public class User {
public int id;
public User() {
super();
}
public User(int id) {
super();
this.id = id;
}
}
新建一个测试类
package com.lbj.javase12;
/**
* 1.final是一个关键字,表示最终的,不可变的
*
* 2.final修饰的类无法被继承
*
* 3.final修饰的方法无法被覆盖
*
* 4.final修饰的变量一旦被赋值后,不可重新赋值【不可二次赋值】
*
* 5.final修饰的实例变量,必须手动赋值,不能采用系统默认值
*
* 6.final修饰的引用,一旦指向某个对象之后,不能再指向其它对象,那么被指向的对象无法被垃圾回收器回收
*
* 7.final修饰的引用虽然指向某个对象之后不能指向其它对象,但是所指向的对象内部的内存是可以被修改的
*
* 8.final修饰的实例变量,一般和static联合使用,被称为常量
*/
public class Test01 {
/*
* 成员变量之实例变量
*
* 实例变量有默认值+final修饰的变量一旦赋值不能重新赋值
*
* 综合考虑:java语言最终规定实例变量使用final修饰后,必须手动赋值,不能采用系统默认值
*
*
*/
//final int age;编译报错
//第一种解决方案
final int age=10;
//第二种解决方案
final int num;
public Test01(){//这里面差一点犯了错误,因为这里我用了自定义的方法,其实是要用类名才行
this.num=10;
//以上两种解决方案:其实本质上就是一种方式,都是在构造方法执行过程中给实例变量赋值
}
public static void main(String[] args) {
int i=10;
System.out.println(i);//10
i=20;
System.out.println(i);//20
// 4.final修饰的变量一旦被赋值后,不可重新赋值【不可二次赋值】
final int k=10;
//k=20;
final int m;
m=10;
//m=20;
//------------------------
//创建用户对象
User u=new User(100);//User u=ox1234
//又创建了一个新的User对象
//程序执行到此处表示以上对象已经变成垃圾堆数据,等待垃圾回收器的回收
u=new User(200);//u=nv12231
//创建用户对象
final User user=new User(30);
//user=new User(50);//final修饰的引用,一旦指向某个对象后,不能再指向其它对象,那么被指向的对象无法被垃圾回收器回收
//相当于绑定了user这个引用只能和一个对象连接
//final修饰的引用虽然指向某个对象之后不能指向其它对象,但是所指向的对象内部是可以被修改的
user.id=50;
//-----------------
//访问国籍
System.out.println(Chinese.GUO_JI);//已经固定,不能修改
}
}
//中国人
class Chinese{
/*
* 国籍
*
* 需求:每一个中国人的国籍都是中国,而且国籍是不会发生改变的,为了防止国籍被修改,建议加final修饰
*
* final修饰的实例变量是不可变的,这种变量一般和static联合使用,被称为常量
*
* 常量的定义语法格式:
* public static final 类型.常量名=值;
*
* java规范中要求所有常量的名字全部大写,每个单词之间使用下划线连接
*/
public static final String GUO_JI="中国";
}
package com.lbj.javase16;
/**
* 深入final
*
* final修饰的引用类型,该引用不可再重新指向其它的java对象
*
* 但是final修饰的引用,该引用指向的对象的属性是可以修改的
*
*/
public class Test02 {
public static void main(String[] args) {
// TODO Auto-generated method stub
final Customer c=new Customer("123",12);
//c是final的,无法重新赋值
//c=new Customer("LKKK",20);
c.name="321";
c.age=25;
System.out.println(c.name);
System.out.println(c.age);
}
}
class Customer{
String name;
int age;
Customer(String name,int age){
this.name=name;
this.age=age;
}
}