final关键字和变量的使用

一、final关键字的讲解以及使用

1.final修饰类

final修饰类,则类不可以被继承

    final class A{}
    //会报错
    //class a extends A{}

2.final修饰方法

final修饰方法,则方法不能被重写

class B{
	public final  void test() {}
}

/*class C extends B{
	public void test() {  //报错
	}
}*/

3.final修饰变量

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 = "我是第二次赋值的";//二次赋值会报错
    }
}

4.final修饰变量的注意事项

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;//不报错

二、变量(理论讲解)

1.变量的讲解

在上面我们看到了final修饰变量,我们来了解一下java中的变量:

变量整体分为两大类:

一:局部变量

二:成员变量(类变量、实例成员变量)

1.1 局部变量 

局部变量:在方法中定义的变量

1.2 成员变量

成员变量:在方法体外、类中定义的变量

类变量和实例变量的区别:

类变量:与某个实例(对象)有关的成员变量就是实例变量

实例变量:与整个类有关的成员变量就是类变量。

1.生存周期不同:
类变量是在类的准备阶段被创建,此时系统还没有创建对应的对象。所以,类变量的创建早于实例变量。类变量会在类销毁时一同被销毁,而实例变量是在对应对象被销毁时一同被销毁。因为类一定在所有对象都被销毁时才被销毁,所以类变量的死亡时间也晚于实例变量。
可以概括为:类变量的生存周期与类的生存周期基本相同,实例变量的生存周期与对应对象的生存周期基本相同。

2.访问方式不同:
访问类变量的语法为:类.类变量名。
访问实例变量的语法为:引用变量名.实例变量名。
虽然说类变量也可以用引用变量名.类变量名的方式访问,但访问的类变量本身并不与该对象相关,在java底层,这种方式也会被替换为:类.类变量名的访问方式。所以本质这种访问方式是java的不良设计,是不推荐的。

3.作用范围不同:
类变量是所有对象共有的,所有对象访问类变量,都是访问的同一块内存区域。所以,类变量的作用范围是整个类。而实例变量是某个对象独有的,它是某个对象的状态属性,改变某个对象的实例变量,不会影响到其他对象。

4.内存中的存储位置不同:
类变量是存储在与类有关的单独的区域,所有对象访问类变量时,都是访问的这一块区域。而实例变量是存储在自身对象所在的那块区域,每个对象都需要有自身的一块区域存储自身的实例变量。

1.3局部变量和成员变量的区别

局部变量 成员变量
从语法形式上看 在方法中定义的变量或者是方法的参数,不可以被四大访问控制修饰符修饰,可以被final修饰 属于类、可以被四大访问控制符修饰和static修饰,可以被final修饰
从变量在内存中的存储方式来看 存储在栈内存中 成员变量是对象的一部分,而对象是存储在堆内存的
从变量在内存中的生存时间来看 随着方法的调用而产生,随方法调用的结束而结束 与对象共存亡
从变量的赋值情况来看 不会初始化赋值 会初始化赋值(除了被final修饰,但是没有被static修饰)

1.4 成员变量修饰符的含义

修饰符 含义
public(公共访问控制符) 可以被任何对象的方法访问
private(私有访问控制符) 只允许本类的方法访问,其他任何类都不可以访问(包括子类)
protected(保护访问控制符)

可以被本类、子类、以及同一包中的类访问

缺省(缺省访问控制符) 同一包中的类,其他包中的不可以访问
final(最终修饰符) 指定变量的值不可以修改
static(静态修饰符) 指定该变量被所有对象共享,所有实例都可以调用该变量
transient(过度修饰符) 指定改变量为系统保留,暂时无特别作用的临时变量
volatile(易失修饰符) 可以同时被几个线程控制和修改

 一个变量可以被两个以上的修饰符同时修饰,但是有些修饰符是不可以定义在一起的,这里不在详细介绍

2.理解常量的好处

好处: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);
	}
}

你可能感兴趣的:(java,开发语言,学习)