Java程序的输出 |第 24 组(最终修改器)
难度级别:简单
先决条件: Java的final关键字
预测以下Java程序的输出:
- 以下程序的输出是什么?
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 1500Ans. a) Compilation error
说明:正如我们所知,我们也可以在构造函数中初始化一个空白的 final 变量,但是如果有多个构造函数,则必须在所有构造函数中初始化所有final 变量。这是因为我们可以通过调用任何一个构造函数来创建类的对象,但是如果该构造函数没有初始化任何一个声明的最终变量,那么就会出现问题。
- 以下程序的输出是什么?
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
1500Ans. c)
说明: final 变量只能通过初始化程序或赋值语句初始化一次。另外你可能认为在上面的程序中, MAXIMUM被初始化了两次。这是错误的。输出基于这样一个事实,即 JVM 首先使用它的默认类型值初始化任何(最终或正常)变量,然后查看赋值语句(如果有)。
- 以下程序的输出是什么?
// 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,因为它们旨在在派生类中实现。请看接口和继承
- 以下程序的输出是什么?
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 3Ans. c) 1 2 3
解释:由于变量i在循环的每次迭代中超出范围,实际上在每次迭代后都会重新声明它,从而允许使用相同的标记(即i )来表示多个变量。
- 以下程序的输出是什么?
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) GeeksForGeeksAns. d) GeeksForGeeks
说明:在引用最终变量(此处为sb )的情况下,可以更改该引用变量指向的对象的内部状态。请注意,这不是重新分配。 final 的这个属性称为非传递性。