zoukankan      html  css  js  c++  java
  • Java面试题04-final关键字详解

    Java面试题04-final关键字详解

      本篇博客将会讨论java中final关键字的含义,以及final用在什么地方,感觉看书总会有一些模糊,而且解释的不是很清楚,在此做个总结,以备准备面试的时候查看。针对每个解释,会在需要的地方给出代码说明,有兴趣的读者可自行实现。

      转载说明----------原文链接:随风浪子90:http://www.cnblogs.com/liun1994/p/6691094.html

    1. final关键字的含义

      final表面意思就是不可更改的,恒量的意思;类似于C语言中的const关键字,指的是无法改变的量,这与静态标量static是有区别的,静态变量指的是只有一份存储空间,值是可以改变的。使用final一定原因是出于软件设计的角度,因为别人看到final这个关键字就知道是什么意思,达到心领神会的效果,但也正是由于这种"语义"的存在,在程序设计中要谨慎使用,以免误用。

      在Java中final修饰的就是常量,而且变量名要大写;

    Math类:
    public static final double E = 2.7182818284590452354;
    public static final double PI = 3.14159265358979323846;
    ......java源码中好多变量都用final修饰

    2. final的作用

      final根据修饰位置的不同作用也不相同,针对三种情况:

      1)修饰变量,被final修饰的变量必须要初始化,赋初值后不能再重新赋值。

          注意:局部变量不在我们讨论的范畴,因为局部变量本身就有作用范围,不使用private、public等词修饰。

      2)修饰方法,被final修饰的方法代表不能重写。

      3)修饰类,被final修饰的类,不能够被继承。

          注意:final修饰的类,类中的所有成员方法都被隐式地指定为final方法。

      2.1 final修饰变量

        被final修饰的变量必须显示的初始化,初始化可以以三种方式:1)定义时初始化,2)在构造器中设置值,3)在非静态块中为final实例变量设置值。

        final修饰变量指的是:这个变量被初始化后便不可改变,这里不可改变的意思对基本类型来说是其值不可变,而对于对象变量来说其引用不可变,即不能再指向其他的对象

    public class Test01{
        final int x1= 10000;
        final int x2;
        final int x3;
        {
           x2 = 20000;
            }
        Public exe3(){
            this.x3 = 3000;
            }
    }  

      如果final修饰的变量是对象类型,那么不可更改指的是该变量不可以再指向别的对象,但是对象的值时可以更改的,比如:

    final Operate operate = new Operate() ;// operate有一个普通变量i初始化为10
    operate.i = 11;
    operate.i = 12;
    System.out.println(operate.i); //输出12
    上述是自定义类,即便是数组,List等集合类型,所保存的值也是可以更改的。

    3. final和static的区别

      static作用于成员变量用来表示只保存一份副本,而final的作用是用来保证变量不可变,看一下网上的一个例子:

    public class Test {
        public static void main(String[] args)  {
            MyClass myClass1 = new MyClass();
            MyClass myClass2 = new MyClass();
            System.out.println(myClass1.i);
            System.out.println(myClass1.j);
            System.out.println(myClass2.i);
            System.out.println(myClass2.j);
     
        }
    }
    class MyClass {
        public final double i = Math.random();
        public static double j = Math.random();
    }
    //运行结果,两次打印,j的值都是一样的,j是static类型的属于类,因此两次值相同。i不是static的因此属于对象,但是i的值是不可变的。

    4. 其他final相关的知识

      1)使用final关键字,如果编译器能够在编译阶段确定某变量的值,那么编译器就会把该变量当做编译期常量来使用。如果需要在运行时确定,那么编译器就不会优化相关代码。

    public class Test {
        public static void main(String[] args)  {
            String a = "hello2";  
            final String b = "hello";
            String d = "hello";
            String c = b + 2;  
            String e = d + 2;
            System.out.println((a == c));
            System.out.println((a == e));
        }
    }
    //final类型,在编译阶段能够确定值。
    //非final类型在编译阶段确定不了
    输出:
    true
    false
    public class Test {
        public static void main(String[] args)  {
            String a = "hello2";  
            final String b = getHello();
            String c = b + 2;  
            System.out.println((a == c));
     
        }
         
        public static String getHello() {
            return "hello";
        }
    }
    //即便是final类型,编译阶段也确定不了值。
    输出
    false

      2)注意不要将final与finally、finalize()等搞混。

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

      4)接口中的变量都是public static final 的。

  • 相关阅读:
    js window对象
    js 静态私有变量
    [WPF][ListBox]鼠标拖拽多选,(Shift Key、Ctrl Key多选有效)(转)
    GitLab关于SSH的使用
    Git命令--保存用户名和密码
    正则表达式
    WPF创建SignalR服务端(转)
    wpf学习之(IValueConverter)
    silverlight数据绑定模式TwoWay,OneWay,OneTime的研究
    WPF样式学习三
  • 原文地址:https://www.cnblogs.com/liun1994/p/6691094.html
Copyright © 2011-2022 走看看