不希望任何人可以随意修改自己的东西的时候可以用final关键字进行修饰
* 1.final是一个关键字,表示最终的,不可变的
*
* 2.final修饰的类无法被继承
*
* 3.final修饰的方法无法被覆盖
*
* 4.final修饰的变量一旦被赋值后,不可重新赋值【不可二次赋值】
*
* 5.final修饰的实例变量,必须手动赋值,不能采用系统默认值
*
* 6.final修饰的引用,一旦指向某个对象之后,不能再指向其它对象,那么被指向的对象无法被垃圾回收器回收
只要new一次就会产生一个对象,如果将这个对象的引用用final修饰,则不能再次new这个对象的引用
final Person person=new Person(10);
person=new Person(10);//报错
*
* 7.final修饰的引用虽然指向某个对象之后不能指向其它对象,但是所指向的对象内部的内存是可以被修改的
*
* 8.final修饰的实例变量,一般和static联合使用(存储在方法区),被称为常量
常量:实际上常量和静态变量一样,区别在于:
常量的值不能变
常量和静态变量,都是存储在方法区,并且都是在类加载时候初始化
常量一般都是公共的public
万变不离其宗:final修饰的只能赋值一次
---------------------------------------------------------------------------------------------------------------------------------------------------------------
新建一个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);//10i=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 stubfinal 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; }
}