Java变量及final关键字

前言

这里就不讲啥基本数据类型或者引用类型了,主要是了解变量的初始化的一些小点


Java变量

对于Java变量来说,根据位置分为了局部变量和成员变量:

  • 局部变量:方法和语句块内定义的的变量(除了形参外,局部变量都必须进行显式初始化,如果不初始化,编译不会通过)。局部变量又分为三种:(1)形参(方法签名中定义的变量):作用域在在整个方法内;当类或对象调用某个方法时,系统会在该方法栈区为所有形参分配内存空间,并将实参的值赋给对应形参,这样就完成了形参的初始化;(2) 方法局部变量(在方法内定义):作用域从定义该局部变量的地方开始生效,到该方法结束时消失;(3)代码块局部变量(在代码块内定义):作用域从定义该变量的地方开始生效,到该代码块结束时失效;
  • 成员变量:方法外部,类的内部定义的变量。类由成员变量和成员方法构成。而成员变量又分为实例变量和类变量。使用static修饰的成员变量是类变量,属于该类本身;没有使用static修饰的成员变量是实例变量,属于该类的实例。由于同一个JVM内每个类只对应一个Class对象,因此同一个JVM内的一个类的类变量只需一块内存空间;但对于实例变量而言,该类每创建一次实例,就需要为实例变量分配一块内存空间。也就是说,程序中有几个实例,实例变量就需要几块内存空间。

final关键字详解

  1. 当修饰类时:当用final去修饰一个类的时候,表示这个类不能被继承。注意:a. 被final修饰的类,final类中的成员变量可以根据自己的实际需要设计为fianl。b. final类中的成员方法都会被隐式的指定为final方法。说明:在自己设计一个类的时候,要想好这个类将来是否会被继承,如果可以被继承,则该类不能使用fianl修饰,在这里呢,一般来说工具类我们往往都会设计成为一个fianl类。在JDK中,被设计为final类的有String、System等。

  2. 修饰方法:被final修饰的方法不能被重写。注意:a. 一个类的private方法会隐式的被指定为final方法。b. 如果父类中有final修饰的方法,那么子类不能去重写。

  3. 当修饰局部变量时:只能赋值一次(如果初始化时没有赋值,则使用前必须进行有且仅有一次的赋值),另外如果一个final变量在初始化时赋值了,那么以后使用时,如以下代码:

    public static void main(String[] args) {    
    		//进行宏替换的final变量 
    		final int a=5; 
    		//这里再运行过程中直接将a转化成5,这就是“宏变量”,必须再定义是才有效果
    		// 我自己试着直接将class文件反编译后,发现a被直接替换为5了
    		/*
    		 * 如果一个final满足这三个条件,那么他就相当于一个直接量
    使用final进行修饰
    在定义final变量的时候进行了初始化。
    该初始值在编译的时候就可以确定下来。
    是不是看出来一个很重要的点,那就是在定义时就进行初始化。
    		 */
    		System.out.println(a);    
    		
    	}
    

    这段代码进行反编译后:

    public static void main(String[] args) {    
    		int a=5; 
    		System.out.println(5);    
    		
    	}
    

    可以看到a变量直接被替换成了其值5。这就是宏替换。

  4. 修饰成员变量:被fianl修饰的成员变量赋值,分为两种情况:
    第一种是final修饰实例变量。这种的final初始化有三个地方可以进行:第一种,直接在定义处初始化;第二种,在代码块中进行;第三种,在构造方法中进行。
    第二种是final修饰类变量即此时成员变量被static,final同时修饰。这种变量的初始化有两个地方:第一个,直接在定义处;第二个,在静态代码块种。

发布了14 篇原创文章 · 获赞 15 · 访问量 525

猜你喜欢

转载自blog.csdn.net/CodingNO1/article/details/104307475