final修饰类,则类不可以被继承
final class A{}
//会报错
//class a extends A{}
final修饰方法,则方法不能被重写
class B{
public final void test() {}
}
/*class C extends B{
public void test() { //报错
}
}*/
final修饰变量总规则:只能赋值一次
废话不多说,直接上代码:
public class FinalDemo2 {
// 2.被public static final:
// 修饰的成员变量相当于常量,建议名称全部大写,多个单词下划线连接
public static final String MY_NAME = "我是静态成员变量";
// 3.修饰实例成员变量
private final String name = "我是实例成员变量";// 这种用法无意义
public static void main(String[] args) {
// 1.final修饰局部变量
final double pi = 3.14;
// pi = 3;二次赋值会报错
// MY_NAME = "我是第二次赋值的静态成员变量";//二次赋值会报错
//用类创建对象,去修改name的值(会报错)
FinalDemo2 t = new FinalDemo2();
// t.name = "我是第二次赋值的";//二次赋值会报错
}
}
1.final修饰基本类型的变量,变量储存的数据不能被改变
2.final修饰的引用类型的变量,变量储存的地址不能被改变,但是地址指向的内容是可以被改变的
看下面的代码:
//final修饰引用类型的变量
final int[] arr = { 1, 2, 5, 6 };
// arr = null;报错,因为arr不为空
arr[2] = 20;// 不报错,因为当final修饰引用类型的变量时,内容可以改变
System.out.println(Arrays.toString(arr));
int[] arr = { 1, 2, 5, 6 };
arr = null;//不报错
在上面我们看到了final修饰变量,我们来了解一下java中的变量:
变量整体分为两大类:
一:局部变量
二:成员变量(类变量、实例成员变量)
局部变量:在方法中定义的变量
成员变量:在方法体外、类中定义的变量
类变量和实例变量的区别:
类变量:与某个实例(对象)有关的成员变量就是实例变量
实例变量:与整个类有关的成员变量就是类变量。
1.生存周期不同:
类变量是在类的准备阶段被创建,此时系统还没有创建对应的对象。所以,类变量的创建早于实例变量。类变量会在类销毁时一同被销毁,而实例变量是在对应对象被销毁时一同被销毁。因为类一定在所有对象都被销毁时才被销毁,所以类变量的死亡时间也晚于实例变量。
可以概括为:类变量的生存周期与类的生存周期基本相同,实例变量的生存周期与对应对象的生存周期基本相同。
2.访问方式不同:
访问类变量的语法为:类.类变量名。
访问实例变量的语法为:引用变量名.实例变量名。
虽然说类变量也可以用引用变量名.类变量名的方式访问,但访问的类变量本身并不与该对象相关,在java底层,这种方式也会被替换为:类.类变量名的访问方式。所以本质这种访问方式是java的不良设计,是不推荐的。
3.作用范围不同:
类变量是所有对象共有的,所有对象访问类变量,都是访问的同一块内存区域。所以,类变量的作用范围是整个类。而实例变量是某个对象独有的,它是某个对象的状态属性,改变某个对象的实例变量,不会影响到其他对象。
4.内存中的存储位置不同:
类变量是存储在与类有关的单独的区域,所有对象访问类变量时,都是访问的这一块区域。而实例变量是存储在自身对象所在的那块区域,每个对象都需要有自身的一块区域存储自身的实例变量。
局部变量 | 成员变量 | |
---|---|---|
从语法形式上看 | 在方法中定义的变量或者是方法的参数,不可以被四大访问控制修饰符修饰,可以被final修饰 | 属于类、可以被四大访问控制符修饰和static修饰,可以被final修饰 |
从变量在内存中的存储方式来看 | 存储在栈内存中 | 成员变量是对象的一部分,而对象是存储在堆内存的 |
从变量在内存中的生存时间来看 | 随着方法的调用而产生,随方法调用的结束而结束 | 与对象共存亡 |
从变量的赋值情况来看 | 不会初始化赋值 | 会初始化赋值(除了被final修饰,但是没有被static修饰) |
修饰符 | 含义 |
---|---|
public(公共访问控制符) | 可以被任何对象的方法访问 |
private(私有访问控制符) | 只允许本类的方法访问,其他任何类都不可以访问(包括子类) |
protected(保护访问控制符) | 可以被本类、子类、以及同一包中的类访问 |
缺省(缺省访问控制符) | 同一包中的类,其他包中的不可以访问 |
final(最终修饰符) | 指定变量的值不可以修改 |
static(静态修饰符) | 指定该变量被所有对象共享,所有实例都可以调用该变量 |
transient(过度修饰符) | 指定改变量为系统保留,暂时无特别作用的临时变量 |
volatile(易失修饰符) | 可以同时被几个线程控制和修改 |
一个变量可以被两个以上的修饰符同时修饰,但是有些修饰符是不可以定义在一起的,这里不在详细介绍
好处:1. 代码的可读性和可维护性较好,通常用于记录系统的配置信息
2.当我们写的程序很大时,用到这些常量的地方我们只需要引用它即可,而且简洁易懂,在多次引用之后如果想改值只需要改常量值即可,牵一发而动全身。
public class FinalDemo3 {
//修改NAME,后面全部修改
public static final String NAME = "北京";
public static void main(String[] args) {
//理解常量的好处
System.out.println(NAME);
System.out.println(NAME);
System.out.println(NAME);
System.out.println(NAME);
System.out.println(NAME);
System.out.println(NAME);
System.out.println(NAME);
}
}