难度等级: 中等
预测以下 Java 程序的输出:
问题
问题一
public class Calculator { int num = 100; public void calc(int num) { this.num = num * 10; } public void printNum() { System.out.println(num); } public static void main(String[] args) { Calculator obj = new Calculator(); obj.calc(2); obj.printNum(); } }
选项:
A) 20
B) 100
C) 1000
D) 2
点此跳转到答案
问题二
public class MyStuff { String name; MyStuff(String n) { name = n; } public static void main(String[] args) { MyStuff m1 = new MyStuff("guitar"); MyStuff m2 = new MyStuff("tv"); System.out.println(m2.equals(m1)); } @Override public boolean equals(Object obj) { MyStuff m = (MyStuff) obj; if (m.name != null) { return true; } return false; } }
选项:
A) 输出为真,MyStuff 履行 Object.equals() 合同。
B) 输出为假并且 MyStuff 履行 Object.equals() 合同。
C) 输出为真并且 MyStuff 不履行 Object.equals() 合同。
D) 输出为假并且 MyStuff 不履行 Object.equals() 合同。
点此跳转到答案
问题三
class Alpha { public String type = "a "; public Alpha() { System.out.print("alpha "); } } public class Beta extends Alpha { public Beta() { System.out.print("beta "); } void go() { type = "b "; System.out.print(this.type + super.type); } public static void main(String[] args) { new Beta().go(); } }
选项:
A) alpha beta bb
B) alpha beta ab
C) beta alpha bb
D) beta alpha ab
点此跳转到答案
问题四
public class Test { public static void main(String[] args) { StringBuilder s1 = new StringBuilder("Java"); String s2 = "Love"; s1.append(s2); s1.substring(4); int foundAt = s1.indexOf(s2); System.out.println(foundAt); } }
选项:
A) -1
B) 3
C) 4
D)在运行时抛出StringIndexOutOfBoundsException。
点此跳转到答案
问题五
class Writer { public static void write() { System.out.println("Writing..."); } } class Author extends Writer { public static void write() { System.out.println("Writing book"); } } public class Programmer extends Author { public static void write() { System.out.println("Writing code"); } public static void main(String[] args) { Author a = new Programmer(); a.write(); } }
选项:
A) Writing…
B) Writing book
C) Writing code
D) Compilation fails
点此跳转到答案
放张可爱妹子的图缓解一下眼睛疲劳,文章后半部分是程序的输出及解析
输出及解析
问题一答案
A) 20
解释:
这里的类实例变量名(num) 与calc()方法的局部变量名(num) 相同。所以为了从calc()方法引用类实例变量,使用了这个关键字。所以在this.num = num * 10语句中,num代表方法的局部变量,其值为 2,this.num代表类实例变量,其初始值为 100。现在在printNum()方法中,因为它没有局部变量name 与类实例变量相同,所以我们可以直接使用num引用实例变量,虽然可以使用this.num。
问题二答案
答案:
C) 输出为真,MyStuff 不履行 Object.equals() 合同。
说明:
作为Object类中的equals(Object obj)方法,根据等价关系比较两个对象。但是这里我们只是确认对象是否为空,所以它不履行Object.equals()合同。由于m1不为空,因此将打印 true。
问题三答案
答案:
A) alpha beta bb
解释:
语句new Beta().go()分两个阶段执行。在第一阶段Beta类构造函数被调用。Beta类中不存在实例成员。所以现在执行Beta类构造函数。由于Beta类扩展了Alpha类,因此调用Alpha类构造函数,因为默认情况下(编译器放置的)第一条语句是Beta类构造函数中的super()。现在,由于Alpha类中存在一个实例变量(type),因此它将获得内存,现在Alpha类构造函数被执行,然后调用返回到Beta类构造函数的 next 语句。所以打印了alpha beta。
在第二阶段,在这个对象上调用go()方法。由于对象中只有一个变量(类型),其值为a。所以会改成b,打印两次。这里的super 关键字没有用。
问题四答案
答案:
C) 4
说明:
append(String str)方法,将 str 连接到s1。的子(INT指数)方法从给定的索引到端返回字符串。但是由于没有任何 String 变量来存储返回的字符串,所以它会被销毁。 现在indexOf(String s2)方法返回s2第一次出现的索引。所以 4 被打印为 s1="JavaLove"。
问题五答案
答案:
B) Writing book
说明:
由于静态方法不能被覆盖,创建哪个类对象并不重要。由于a是Author引用类型,所以总是调用Author类方法。如果我们从Author类中删除write()方法,则调用Writer类方法,因为Author类扩展了Writer类。