Java程序的输出|设置 9
难度级别:中级
预测以下Java程序的输出。
方案一:
class Gfg
{
// constructor
Gfg()
{
System.out.println("Geeksforgeeks");
}
static Gfg a = new Gfg(); //line 8
public static void main(String args[])
{
Gfg b; //line 12
b = new Gfg();
}
}
输出:
Geeksforgeeks
Geeksforgeeks
解释:
我们知道静态变量是在加载类时调用的,而静态变量只调用一次。现在第 13 行导致创建对象,该对象又调用构造函数,并且第二次打印“Geeksforgeeks”。
如果在第 8 行中没有使用静态变量,则该对象将被无限递归地调用,从而导致 StackOverFlow 错误。请参阅此示例运行。
方案二:
class Gfg
{
static int num;
static String mystr;
// constructor
Gfg()
{
num = 100;
mystr = "Constructor";
}
// First Static block
static
{
System.out.println("Static Block 1");
num = 68;
mystr = "Block1";
}
// Second static block
static
{
System.out.println("Static Block 2");
num = 98;
mystr = "Block2";
}
public static void main(String args[])
{
Gfg a = new Gfg();
System.out.println("Value of num = " + a.num);
System.out.println("Value of mystr = " + a.mystr);
}
}
输出:
Static Block 1
Static Block 2
Value of num = 100
Value of mystr = Constructor
解释:
当类加载到内存中时,静态块被执行。一个类可以有多个静态块,它们按照它们被写入程序的相同顺序执行。
注意:静态方法可以在不使用类对象的情况下访问类变量。由于在创建新实例时调用构造函数,因此首先调用静态块,然后调用构造函数。如果我们在不使用对象的情况下运行相同的程序,构造函数就不会被调用。
方案 3:
class superClass
{
final public int calc(int a, int b)
{
return 0;
}
}
class subClass extends superClass
{
public int calc(int a, int b)
{
return 1;
}
}
public class Gfg
{
public static void main(String args[])
{
subClass get = new subClass();
System.out.println("x = " + get.calc(0, 1));
}
}
输出:
Compilation fails.
解释:
superClass 类中的方法 calc() 是 final 的,因此不能被覆盖。
程序 4:
public class Gfg
{
public static void main(String[] args)
{
Integer a = 128, b = 128;
System.out.println(a == b);
Integer c = 100, d = 100;
System.out.println(c == d);
}
}
输出:
false
true
说明:在 Integer 对象的源代码中,我们会找到一个方法 'valueOf',在该方法中我们可以看到 Integer 对象的范围是从 IntegerCache.low(-128) 到 IntegerCache.high(127)。因此,127 以上的数字不会给出预期的输出。 IntegerCache 的范围可以从 IntegerCache 类的源码中观察到。详情请参考这里。