精华内容
下载资源
问答
  • Java中的final变量、final方法和final类

    万次阅读 多人点赞 2018-12-13 17:39:24
    1、final变量 final关键字可用于变量声明,一旦该变量被设定,就不可以再改变该变量的值。通常,由final定义的变量为常量。例如,在类中定义PI值,可以使用如下语句: final double PI=3.14; 在Java定义全局...

    1、final变量

    final关键字可用于变量声明,一旦该变量被设定,就不可以再改变该变量的值。通常,由final定义的变量为常量。例如,在类中定义PI值,可以使用如下语句:

    final double PI=3.14;

    在Java中定义全局常量,通常使用public static final修饰,这样的常量只能在定义是被赋值。

    public static final double PI_VAULE = 3.14;

    规范:被定义为final的常量定义时需要使用大写字母命名,并且中间使用下划线进行连接。

    常量示例:

    import java.util.Random;
    
    class Test
    {
    	int i = 0;
    }
    
    /**
     * 常量示例
     * 
     * @author pan_junbiao
     *
     */
    public class FinalData
    {
    	static Random rand = new Random();
    	private final int VALUE_1 = 9; // 声明一个final常量
    	private static final int VALUE_2 = 10; // 声明一个final、static常量
    	private final Test test = new Test(); // 声明一个final引用
    	private Test test2 = new Test(); // 声明一个不是final的引用
    	private final int[] a = { 1, 2, 3, 4, 5, 6 }; // 声明一个定义为final的数组
    	private final int i4 = rand.nextInt(20);
    	private static final int i5 = rand.nextInt(20);
    
    	public String toString()
    	{
    		return "i4值:" + i4 + " i5值:" + i5 + " ";
    	}
    
    	public static void main(String[] args)
    	{
    		FinalData data = new FinalData();
    
    		// 报错:不能改变定义为final的常量值
    		// data.VALUE_1 = 8;
    
    		// 报错:不能改变定义为final的常量值
    		// data.VALUE_2 = 9;
    
    		// 报错:不能将定义为final的引用指向其他引用
    		// data.test = new Test();
    
    		// 正确: 可以对指定为final的引用中的成员变量赋值
    		data.test.i = 1;
    
    		// 正确: 可以将没有定义为final的引用指向其他引用
    		data.test2 = new Test();
    
    		// 报错:不能对定义为final的数组赋值
    		// int b[] = { 7, 8, 9 };
    		// data.a = b;
    
    		// 但是final的数组中的每一项内容是可以改变的
    		for (int i = 0; i < data.a.length; i++)
    		{
    			data.a[i] = 9;
    		}
    
    		System.out.println(data);
    		System.out.println("data2");
    		System.out.println(new FinalData());
    	}
    }

    执行结果:

     

    从上述执行结果中可以发现i5的值是相同的。

    全局常量:

    我们知道一个被定义为final的对象引用只能指向唯一一个对象,不可以将它再指向其它对象,但是一个对象的值却是可以改变的,那么为了使一个常量真正做到不可更改,可以将常量声明为static final。

    示例:在项目中创建FinalStaticData类,在该类中创建Random类的对象,在主方法中分别输出类中定义的final变量a1与a2。

    import static java.lang.System.out;
    
    import java.util.Random;
    
    /**
     * FinalStaticData类
     * 
     * @author pan_junbiao
     *
     */
    public class FinalStaticData
    {
    	private static Random rand = new Random(); // 实例化一个Random类对象
    	// 随机产生0~10之间的随机数赋予定义为final的a1
    	private final int a1 = rand.nextInt(10);
    	// 随机产生0~10之间的随机数赋予定义为static final的a2
    	private static final int a2 = rand.nextInt(10);
    
    	public static void main(String[] args)
    	{
    		FinalStaticData fdata = new FinalStaticData(); // 实例化一个对象
    		// 调用定义为final的a1
    		out.println("重新实例化对象调用a1的值:" + fdata.a1);
    		// 调用定义为static final的a2
    		out.println("重新实例化对象调用a2的值:" + fdata.a2);
    		// 实例化另外一个对象
    		FinalStaticData fdata2 = new FinalStaticData();
    		out.println("重新实例化对象调用a1的值:" + fdata2.a1);
    		out.println("重新实例化对象调用a2的值:" + fdata2.a2);
    	}
    }

    运行结果:

     

    从本示例运行结果中可以看出,定义为final的常量不是恒定不变的,将随机数赋予定义为final的常量,可以做到每次运行程序时改变a1的值。但是a2与a1不同,由于它被声明为static final形式,所以在内存中为a2开辟了一个恒定不变的区域,当再次实例化一个FinalStaticData对象时,仍然指向a2这块内存区域,所以a2的值保存不变。a2是在装载时被初始化,而不是每次创建新对象时被初始化;而a1会重新实例化对象时被更改。

    最后总结一下在程序中final数据可以出现的位置,如下程序。

    /**
     * 总结一下在程序中final数据可以出现的位置
     * 
     * @author pan_junbiao
     *
     */
    public class FinalDataTest
    {
    	// final成员变量不可更改
    	final int VALUE_ONE = 6;
    
    	// 在声明final成员变量时没有赋值,称为空白final
    	final int BLANK_FINALVAULE;
    
    	// 在构造方法中为空白final赋值
    	public FinalDataTest()
    	{
    		BLANK_FINALVAULE = 8;
    	}
    
    	// 设置final参数,不可以改变参数x的值
    	int doIt(final int x)
    	{
    		return x + 1;
    	}
    
    	// 局部变量定义为final,不可以改变i的值
    	void doSomething()
    	{
    		final int i = 7;
    	}
    }

     

    2、final方法

    首先,我们应该了解定义为final的方法不能被重写

    将方法定义为final类型可以防止任何子类修改该类的定义与实现方式,同时定义为final的方法执行效率要高于非final方法。在修饰权限中曾经提到过private修饰符,如果一个父类的某个方法被设置为private修饰符,子类将无法访问该方法,自然无法覆盖该方法,所以一个定义为private的方法隐式被指定为final类型,这样无须将一个定义为private的方法再定义为final类型。

    语法:

    private final void test()
    {
    }

     

    3、final类

    定义为final的类不能被继承。

    如果希望一个类不允许任何类继承,并且不允许其他人对这个类有任何改动,可以将这个类设置为final形式。

    final类的语法如下:

    final 类名{}

    如果将某个类设置为final形式,则类中的所有方法都被隐式设置为final形式,但是final类中的成员变量可以被定义为final或非final形式。

    示例:在项目中创建FinalClass类,在类中定义doit()方法和变量a,实现在主方法中操作变量a自增。

    /**
     * 定义final类
     * 
     * @author pan_junbiao
     *
     */
    final class FinalClass
    {
    	int a = 3;
    
    	void doit()
    	{
    	}
    
    	public static void main(String args[])
    	{
    		FinalClass f = new FinalClass();
    		f.a++;
    		System.out.println(f.a); // 结果:4
    	}
    }

     

    4、总结

    下面总结了一些使用final关键字的好处:

    (1)final关键字提高了性能。JVM和Java应用都会缓存final变量。

    (2)final变量可以安全的在多线程环境下进行共享,而不需要额外的同步开销。

    (3)使用final关键字,JVM会对方法、变量及类进行优化。

    不可变类:

    创建不可变类要使用final关键字。不可变类是指它的对象一旦被创建了就不能被更改了。String是不可变类的代表。不可变类有很多好处,譬如它们的对象是只读的,可以在多线程环境下安全的共享,不用额外的同步开销等等。

    关于final的重要知识点:

    (1)final关键字可以用于成员变量、本地变量、方法以及类。

    (2)final成员变量必须在声明的时候初始化或者在构造器中初始化,否则就会报编译错误。

    (3) 你不能够对final变量再次赋值。

    (4)本地变量必须在声明时赋值。

    (5)在匿名类中所有变量都必须是final变量。

    (6)final方法不能被重写。

    (7)final类不能被继承。

    (8)final关键字不同于finally关键字,后者用于异常处理。

    (9)final关键字容易与finalize()方法搞混,后者是在Object类中定义的方法,是在垃圾回收之前被JVM调用的方法。

    (10)接口中声明的所有变量本身是final的。

    (11)final和abstract这两个关键字是反相关的,final类就不可能是abstract的。

    (12)final方法在编译阶段绑定,称为静态绑定(static binding)。

    (13)没有在声明时初始化final变量的称为空白final变量(blank final variable),它们必须在构造器中初始化,或者调用this()初始化。不这么做的话,编译器会报错“final变量(变量名)需要进行初始化”。

    (14)将类、方法、变量声明为final能够提高性能,这样JVM就有机会进行估计,然后优化。

    (15)按照Java代码惯例,final变量就是常量,而且通常常量名要大写。
     

    展开全文
  • Java中声明final变量

    千次阅读 2019-03-07 16:30:10
    凡是对成员变量或者本地变量(在方法中的或者代码块中的变量称为本地变量)声明为final的都叫作final变量final变量经常和static关键字一起使用,作为常量。用final关键字修饰的变量,只能进行一次赋值操作,并且在...

    final的含义在不同的场景下有细微的差别,但总体来说,它指的是“不可变”。

    final变量
    凡是对成员变量或者本地变量(在方法中的或者代码块中的变量称为本地变量)声明为final的都叫作final变量。final变量经常和static关键字一起使用,作为常量。用final关键字修饰的变量,只能进行一次赋值操作,并且在生存期内不可以改变它的值。
    不过在针对基本类型和引用类型时,final关键字的效果存在细微差别。例如:

    				class value {
    				    int v;
    				    public value(int v) {
    				        this.v = v;
    				    }
    				}
    				public class FinalTest {
    				    final int f1 = 1;
    				    final int f2;
    				    public FinalTest() {
    				        f2 = 2;
    				    }
    				    public static void main(String[] args) {
    				        final int value1 = 1;
    				        // value1 = 4;
    				        final double value2;
    				        value2 = 2.0;
    				        final Value value3 = new Value(1);
    				        value3.v = 4;
    				    }
    				}
    

    上面的例子中,main方法中被final修饰的数据,在给value1赋初始值之后,我们无法再对value1的值进行修改,final关键字起到了常量的作用。从value2我们可以看到,final修饰的变量可以不在声明时赋值,即可以先声明,后赋值。value3时一个引用变量,这里我们可以看到final修饰引用变量时,只是限定了引用变量的引用不可改变,即不能将value3再次引用另一个Value对象,但是引用的对象的值是可以改变的。
    另一方面,我们看到了用final修饰成员变量时的细微差别,因为final修饰的数据的值是不可改变的,所以我们必须确保在使用前就已经对成员变量赋值了。因此对于final修饰的成员变量,我们有且只有两个地方可以给它赋值,一个是声明该成员时赋值,另一个是在构造方法中赋值,在这两个地方我们必须给它们赋初始值。

    展开全文
  • java中的final变量

    万次阅读 2016-03-01 16:38:53
    java中为什么会有final变量】: final这个关键字的含义是“这是无法改变的”或者“终态的”; 那么为什么要阻止改变呢? java语言的发明者可能由于两个目的而阻止改变: 1).效率问题: jdk中的某些类的某些方法,是...

    【java中为什么会有final变量】:

    final这个关键字的含义是“这是无法改变的”或者“终态的”;

    那么为什么要阻止改变呢?

    java语言的发明者可能由于两个目的而阻止改变:

    1).效率问题:

    jdk中的某些类的某些方法,是不允许被用户覆盖的,设计者可能认为,所用方法已经是最好的方法,

    用户私自覆盖,或是由于疏忽而覆盖,就会影响JVM或是系统的系能;

    2). 设计所需:

    众所周知,有些情况必须使用final关键字,比如方法中的匿名内部类的参数传递;

    【final关键字的使用方法】:

    【修饰变量】:

    final成员变量表示常量,只能被赋值一次,赋值后值不再改变。

    【修饰方法】:

    final方法不能被子类方法覆盖,但可以被继承。

    【修饰类】:

    final类不能被继承,没有子类,final类中所有方法都是final的。

    【final的内存分配方式】:

    【修饰变量】:

    通常情况下,final变量有3个地方可以赋值:直接赋值,构造函数中,或是初始化块中。

    【初始化】:

    由于在java的语法中,声明和初始化是联系在一起的,

    也就是说:如果你不显示的初始化一个变量,系统会自动用一个默认值来对其进行初始化。(如int就是0)

    对于final变量,在声明时,如果你没有赋值,系统默认这是一个空白域,在构造函数进行初始化,

    如果是静态的,则可以在初始化块。

    【内存】:

    常量(final变量)和非final变量的处理方式是不一样的。

    每一个类型在用到一个常量时,都会复制一份到自己的常量池中。

    常量也像类变量(static)一样保存在方法区,只不过他保存在常量池。

    (可能是,类变量被所有实例共享,而常量池是每个实例独有的。)

    【修饰方法】:

    保存在方法区,并且可以被函数代码直接替换,而不用等到执行时再决定具体是那个函数。

    【修饰类】:

    保存在方法区。

    【java中变量的初始化顺序】:

    变量的初始化次序优于任何方法,甚至在构造方法的前面。对于static变量也是一样,

    如果变量是原始类型,那么它得到一个标准的原始类型的初始值,

    如果是一个对象的引用,除非你创建了一个新的对象给这个引用,否则就是null。

    static变量在需要的时候才会初始化,并且在这个类的构造函数和所有其他普通变量之前调用,static之后就不再进行初始化了,

    static变量在类初始化时(注意不是实例),就必须分配内存空间,

    static变量单独划分一块存储空间。

    java类首次装入时,会对静态成员变量或方法进行一次初始化,

    先初始化父类的静态代码-->初始化子类的静态代码-->

    (创建使历史,如果不创建实例,则后面的不执行)初始化父类的非静态代码-->初始化父类的构造

    -->初始化子类的非静态代码-->初始化子类的构造

    类只有在使用new调用创建的时候才会被java类装载器装入。

    【final方法为何会高效】:

    final方法会在编译的过程中利用内嵌机制进行inline优化。

    inline优化是指:在编译的时候直接调用函数代码替换,而不是在运行时调用函数。

    inline需要在编译的时候就知道最后要用哪个函数,

    显然,非final是不行的。

    非final方法可能在子类中被重写,由于可能出现多态的情况,编译器在编译阶段

    并不能确定将来调用方法的对象的真正类型,也就无法确定到底调用哪个方法。

    【什么是多态】:

    按字面的意思是“多种状态”。在面向对象语言中,接口的多种不同的实现方式即为多态。

    简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。

    【非final方法为什么会出现多态】:

    显然,如果派生出一个子类,覆盖非final方法,就会出现2个这样的方法可供调用,这就是多态。

    【final变量的变与不变】:

    有人说final变量在赋值后就不可变,

    那么这个不变到底指的是什么呢?

    这个不变指的是引用,是地址,而所引用的对象的内容仍然是可变的。

    就是说,这个final变量永远指向某个对象,是一个常量指针,而不是指向常量的指针。



    【final变量的效率】
    在能够通过编译的前提下,无论局部变量声明时带不带final关键字修饰,对其访问的效率都一样。

    例如说,以下代码:

    static int foo() {
      int a = someValueA();
      int b = someValueB();
      return a + b; // 这里访问局部变量
    }
    与带final的版本

    static int foo() {
      final int a = someValueA();
      final int b = someValueB();
      return a + b; // 这里访问局部变量
    }
    效果一模一样,由javac编译得到的字节码会是这样:
    invokestatic someValueA:()I
    istore_0 // 设置a的值
    invokestatic someValueB:()I
    istore_1 // 设置b的值
    iload_0  // 读取a的值
    iload_1  // 读取b的值
    iadd
    ireturn

     字节码里没有任何东西能体现出局部变量的final与否,Class文件里除字节码(Code属性)外的辅助数据结构也没有记录任何体现final的信息。既然带不带final的局部变量在编译到Class文件后都一样了,其访问效率必然一样高,JVM不可能有办法知道什么局部变量原本是用final修饰来声明的。

    但有一个例外,那就是声明的“局部变量”并不是一个变量,而是编译时常量的情况:

    static int foo2() {
      final int a = 2; // 声明常量a
      final int b = 3; // 声明常量b
      return a + b;    // 常量表达式
    }

     这样的话实际上a和b都不是变量,而是编译时常量,在Java语言规范里称为constant variable。其访问会按照Java语言对常量表达式的规定而做常量折叠。
    实际效果跟这样的代码一样:

    static int foo3() {
      return 5;
    }

    由javac编译得到对应的字节码会是:

    iconst_5 // 常量折叠了,没有“访问局部变量”
    ireturn

     (用Eclipse里的Java编译器ECJ来编译 foo3() 可能会在iconst_5之前看到一些冗余的对局部变量的代码。那个其实没有任何作用,真正有用的还是后面的iconst_5,所以仍然符合Java语言规范的要求。可以在Preferences->Java->Compiler->Code Generation->Preserve unused (never read) local variables把钩去掉来改变Eclipse这一行为,然后得到的代码就会跟javac更接近。)
    而这种情况如果去掉final修饰,那么a和b就会被看作普通的局部变量而不是常量表达式,在字节码层面上的效果会不一样

    static int foo4() {
      int a = 2;
      int b = 3;
      return a + b;
    }

     就会编译为:

    iconst_2
    istore_0 // 设置a的值
    iconst_3
    istore_1 // 设置b的值
    iload_0  // 读取a的值
    iload_1  // 读取b的值
    iadd
    ireturn

     但其实这种层面上的差异只对比较简易的JVM影响较大,因为这样的VM对解释器的依赖较大,原本Class文件里的字节码是怎样的它就怎么执行;对高性能的JVM(例如HotSpot、J9等)则没啥影响。这种程度的差异在经过好的JIT编译器处理后又会被消除掉,上例中无论是 foo3() 还是 foo4() 经过JIT编译都一样能被折叠为常量5。

    还有,先把成员或静态变量读到局部变量里保持一定程度的一致性,例如:在同一个方法里连续两次访问静态变量A.x可能会得到不一样的值,因为可能会有并发读写;但如果先有final int x = A.x然后连续两次访问局部变量x的话,那读到的值肯定会是一样的。这种做法的好处通常在有数据竞态但略微不同步没什么问题的场景下,例如说有损计数器之类的。

    最后,其实很多人用这种写法的时候根本就没想那么多吧。多半就是为了把代码写短一点,为了把一串很长的名字弄成一个短一点的而把成员或静态变量读到局部变量里,顺便为了避免自己手滑在后面改写了局部变量里最初读到的值而加上final来让编译器(javac之类)检查。例如:

    final int threshold = MySuperLongClass.someImportantThreshold;

     歪打正着 ^_^

    ===========================================================================================

    【final关键字的具体应用】:

    【final+变量】:

    在实际应用中,这种形式是非常少见的。

    比如logger是可以的,但是貌似并不是非常实用,或许用户仍然希望通过setter来改变logger变量。

    【static+final+变量】:

    常量。经常使用。

    【final+方法】:

    JDK中常用,但是自己并未常用。

    【final+类】:

    helper类经常使用。

    【final用于匿名内部类的参数传递】:

    在多线程测试时,经常使用。

    【final用于方法的参数】:

    并不常用。

    展开全文
  • 主要介绍了Javafinal变量使用总结,final关键字可用于变量声明,一旦该变量被设定,就不可以再改变该变量的值,通常final定义的变量为常量,需要的朋友可以参考下
  • java】局部变量必须定义final

    千次阅读 2019-05-23 14:43:11
    今天写多线程程序时遇到一个Java的错误:Local variable i defined in an enclosing scope must be final or effectively final,即局部变量不许声明为final。详情请移步:为什么java内部类访问局部变量必须声明为...

     今天写多线程程序时遇到一个Java的错误:Local variable i defined in an enclosing scope must be final or effectively final,即局部变量不许声明为final。详情请移步:为什么java内部类访问局部变量必须声明为final?

    其实原因就是一个规则:java内部类访问局部变量时局部变量必须声明为final。

    1. 那为什么要这样呢?
    2. 还有线程为什么和内部类一样?
    public class Out {
        
        public void test(final String a) {
            class In{
                
                public void function() {
                    System.out.println(a);
                }
            }
            new In().function();
        }
        
        public static void main(String[] args) {
            new Out().test("hi");
        }
    }

    编译这个类后发现产生了两个class文件

    也就是说内部类和外部类各一个class文件,这样就产生了一个问题,调用内部类方法的时候如何访问外部类方法中的局部变量呢?

    实际上编译后的内部类的构造方法的里面,传了对应的外部类的引用和所有局部变量的形参。(由于外部类方法执行完后局部变量会消亡,所以内部类构造函数中的局部变量实际是一份“复制”。而为了访问外部类中的私有成员变量,外部类编译后也产生了访问类似与getXXX的方法。)

    这时产生了一个不一致的问题,如果局部变量不设为final,那内部类构造完毕后,外部类的局部变量又改变了那怎么办?

    public class Out {
        
        public void test(String a) {
            class In{    
                public void function() {
                    System.out.println(a);
                }
            }
            a="hello";
            new In().function();
        }
         
        public static void main(String[] args) {
            new Out().test("hi");
        }
    }

    如代码中所示,这样调用内部类方法时会造成外部类局部变量和内部类中对应的变量的不一致。(注意内部类编译成class文件与new无关,a="hello"放在new In()前后不影响不一致关系,new在jvm运行class文件时才起效)

    理解完内部类必须访问final声明的局部变量原因,我们回到最开始的问题:为什么线程和内部类一样

    因为线程也是一个类,所以new Thread也相当于创建了一个内部类啦

    我们编译一下最开始的ThreadTest.java文件

    发现线程编译后也是产生了单独的class文件。

     

    最后,问题改怎么解决呢?

    还有一个可能出现这一问题的场景是使用lambda表达式的时候。

    展开全文
  • 然后以为它只能在申明的时候就必须得赋值,其实不然,本文就重点讲述平时我们用到的final变量的赋值问题。 对被final修饰的变量进行赋值的几种方法 被final修饰的变量,有三种赋值方式。 被final static 修饰的...
  • java中为final变量赋值的几种方式

    千次阅读 2019-08-30 15:15:15
    java中为final变量赋值的几种方式 前言 使用final修饰变量,很多人第一时间想到的就是不可变。然后以为变量必须得在声明的时候就为其赋初始值,其实不然,本文将详细讲解java中使用final修改的变量的赋值问题。 ...
  • 之前一直以为final修饰的变量不能改变,这个理解是有问题的。 首先final修饰的基本变量是不可变的,但是final修饰的对象要看以下情况: 先定义一个自定义对象 @Data public class FinalUser { private String...
  • final修饰的变量表示赋值之后不能再进行更改,系统赋默认值也算赋值,因此系统也不会赋默认值...如果同时用staic final 修饰则static > final 则需要在定义时就必须初始化,因为static在类加载时系统就会给它赋值。
  • Java局部变量final

    千次阅读 2018-10-26 09:25:36
    在一个线程A中开起另一个线程B,如果线程B要使用线程A的局部变量,那么A的局部变量需要定义final。理由:局部变量是线程内部共享的,每一个线程内的不能访问其他线程的局部变量,但是上诉的情况却违背了这一原则,...
  • Java final变量的声明和使用

    千次阅读 2017-12-24 15:00:23
    final变量(never be changed): final int NUMBER_OF_CATS = 10;//never be changed final double PI = 3.1415927; final NUMBER_OF_WHEELS = 2;
  • Java中的实例变量、局部变量、类变量与final变量之间的关系的思路重新整理一遍。俗话说的好“好记忆不如烂笔头”,在此分享一下。
  • Javafinal修饰变量

    千次阅读 2016-05-31 15:25:20
    1.定义final实例变量时指定初始值; 2.在非静态初始化块中为final实例变量指定初始值 3.在构造器中为final实例变量指定初始值 对于普通实例变量Java程序可以对它执行默认的初始化,也就是将实力变量的值指定为...
  • 定义final变量

    千次阅读 2017-03-07 14:55:48
     理解final最主要的是这句话:定义final类型,指的是该变量的 “引用” 不能被再次赋值。  比如:  final int a=1; 这边定义的int类型a,他其实直接是放在栈里面的,固然不能重新对其赋值。 fin
  • final关键字我们并不陌生,但是final修饰的属性变量为什么必须在定义的时候或者构造函数中被初始化呢?...如果不在定义的时候或者构造函数中对final变量进行赋值的话,则生成的对象中final变量的值是
  • Javafinal局部变量的生命周期

    千次阅读 多人点赞 2015-07-17 09:29:57
    查了很多博客和帖子,发现这个帖子是把这个问题将得最清楚的(个人认为) ... 问题: package test;...public class TestFinal ... //只有定义final User user 才不会报错为什么? public void test( User user)
  • final变量简介(转) 1 final修饰变量时表示该变量一旦获得初始值之后就不可能改变。 2 final既可修饰成员变量,也可修饰局部变量。二 final修饰成员变量 1 final修饰成员变量时,必须由程序员显示地指定初始...
  • java定义静态变量的作用 static关键字

    万次阅读 2016-10-25 11:33:09
    我们知道类中的静态变量在程序运行期间,其内存空间对所有该类的对象实例而言是共享的,为了节省系统内存开销、共享资源,应该将一些变量声明为静态变量。通过下面的例子,你就会发现有什么不同。 代码一: public...
  • JAVA final关键字,常量的定义

    千次阅读 2019-06-17 16:58:14
    final(最终)是一个修饰符 1、final可以修饰类,函数,变量(成员变量,局部变量) 2、被final修饰后的类不可以被其它类继承 3、被final修饰后的方法(函数...定义常量:final 类型 大写常量名 = 常量值 常量命名规范...
  • 当用final作用于类的成员变量时,成员变量必须在定义时或者构造器中进行初始化赋值,而且final变量一旦被初始化赋值之后,就不能再被赋值了。而作用于局部变量时,只需要保证在使用之前被初始化赋值即可 ...
  • (1)final关键字的含义 final在Java中是一个保留的关键字,可以声明成员变量、方法、类以及本地...凡是对成员变量或者本地变量(在方法中的或者代码块中的变量称为本地变量)声明为final的都叫作final变量。final变
  • Java实例变量和类变量

    万次阅读 多人点赞 2017-09-04 09:02:02
    Java程序的变量大体可分为成员变量和局部变量。其中局部变量可分为如下3类。 形参:在方法签名中定义的局部变量,由方法调用者负责为其赋值,随方法的结束而消亡。 方法内的局部变量:在方法内定义的局部变量,必须...
  • final关键字: final是 最终 的意思,...3. final修饰变量:一旦一个变量final变量就只能被赋值一次,一旦赋值之后,其值就不能被修改 a.对于局部变量而言,如果被final修饰,那么该变量必须在使用之前赋值,...
  • final变量如果是静态的,要么定义时初始化,要么在静态代码块中初始化。final变量如果不是静态的,要么定义时初始化,要么在非静态代码块中初始化。 静态变量定义时初始化: 静态变量在静态代码块中初始化: ...
  • Java变量和常量的定义及初始化

    万次阅读 多人点赞 2019-01-24 11:48:57
     变量是内存中的一个存储区域,该区域有自己的名称(变量名)和类型(数据类型),Java中每个变量必须先声明,后使用, 该区域的数据可以在同一类型范围内不断变化。  2.变量的分类  1)按数据类型  对于不同...
  • java——Final修饰成员变量的注意事项

    万次阅读 多人点赞 2018-07-22 15:46:21
    一.Final 修饰成员变量的注意事项 final修饰成员变量,该成员变量必须在创建对象之前进行赋值,否则编译失败 ...定义成员变量的时候手动赋值 利用构造器对成员变量进行赋值 利用set函数进行赋...
  • final可以用来修饰变量...一旦定义final变量并在首次为其显示初始化后,final修饰的变量值不可被改变。 所以,final修饰变量时就成了 常量(一旦赋值不能改变) 常量名一般要全部大写; final int BOY = 1; ...
  • final变量

    2019-06-27 21:40:29
    Final关键字可以用于变量声明,一旦该变量被设定,就不可以再改变该变量的值,通常,由final定义变量为常量。例如在类中定义PI值,可以使用语句:final double PI=3.14; 当在程序中使用到PI这个常量时,他的值...
  • final 表示"最后的、最终的"含义,变量一旦赋值后,不能被重新赋值。被 final 修饰的实例变量必须显式指定初始值。 final 修饰符通常和 static 修饰符一起使用来创建类常量。 关于final,首先想到的是一旦赋值后不...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 318,436
精华内容 127,374
关键字:

java定义final变量

java 订阅