📜  Java程序的输出 |第 24 组(最终修改器)

📅  最后修改于: 2022-05-13 01:56:10.794000             🧑  作者: Mango

Java程序的输出 |第 24 组(最终修改器)

难度级别:简单
先决条件: Java的final关键字

java中的final关键字

预测以下Java程序的输出:

  1. 以下程序的输出是什么?
    class Test 
    {
        final int MAXIMUM;
        final double PI;
      
    public Test(int max)
        {
            MAXIMUM = max;
        }
      
    public Test(double pi)
        {
            PI = pi;
        }
      
    public static void main(String[] args)
        {
            Test t1 = new Test(1500);
            Test t2 = new Test(3.145);
      
            System.out.println("MAXIMUM : " + t1.MAXIMUM + " PI : " + t2.PI);
        }
    }
    

    a) 编译错误
    b) 运行时错误
    c) 1500 3.145
    d) 3.145 1500

    Ans. a) Compilation error

    说明:正如我们所知,我们也可以在构造函数中初始化一个空白的 final 变量,但是如果有多个构造函数,则必须在所有构造函数中初始化所有final 变量。这是因为我们可以通过调用任何一个构造函数来创建类的对象,但是如果该构造函数没有初始化任何一个声明的最终变量,那么就会出现问题。

  2. 以下程序的输出是什么?

    class Test 
    {
        final int MAXIMUM = m1();
      
    private int m1()
        {
            System.out.println(MAXIMUM);
            return 1500;
        }
      
    public static void main(String[] args)
        {
            Test t = new Test();
      
            System.out.println(t.MAXIMUM);
        }
    }
    

    a) 编译错误
    b) 运行时错误
    c) 0
    1500
    d) 1500
    1500

    Ans. c)

    说明: final 变量只能通过初始化程序或赋值语句初始化一次。另外你可能认为在上面的程序中, MAXIMUM被初始化了两次。这是错误的。输出基于这样一个事实,即 JVM 首先使用它的默认类型值初始化任何(最终或正常)变量,然后查看赋值语句(如果有)。

  3. 以下程序的输出是什么?
    // filename : Test1.java
    final interface Test
    {
        int MAXIMUM = 1500;
      
        void m1();
    }
      
    class Test1 implements Test {
      
        @Override public void m1()
        {
            System.out.println("From Test1 m1 method");
        }
      
    public static void main(String[] args)
        {
            new Test1().m1();
        }
    }
    

    a) 编译错误
    b) 运行时错误
    c) 来自 Test1 m1 方法

    Ans. a) Compilation error

    说明:永远不能将接口声明为 final,因为它们旨在在派生类中实现。请看接口和继承

  4. 以下程序的输出是什么?
    class Test {
    public static void main(String[] args)
        {
            int arr[] = { 1, 2, 3 };
      
            // final with for-each statement
            for (final int i : arr)
                System.out.print(i + " ");
        }
    }
    

    a) 编译错误
    b) 运行时错误
    c) 1 2 3

    Ans. c) 1 2 3

    解释:由于变量i在循环的每次迭代中超出范围,实际上在每次迭代后都会重新声明它,从而允许使用相同的标记(即i )来表示多个变量。

  5. 以下程序的输出是什么?
    class Test {
    public static void main(String[] args)
        {
            final StringBuilder sb = new StringBuilder("Geeks");
      
            sb.append("ForGeeks");
      
            System.out.println(sb);
        }
    }
    

    a) 编译错误
    b) 运行时错误
    c) 极客
    d) GeeksForGeeks

    Ans. d) GeeksForGeeks

    说明:在引用最终变量(此处为sb )的情况下,可以更改该引用变量指向的对象的内部状态。请注意,这不是重新分配。 final 的这个属性称为非传递性