📜  Java程序的输出|设置 7

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

Java程序的输出|设置 7

难度级别:中级

预测以下Java程序的输出。

程序 1:

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();
    }
}

选项 :
一)20
B) 100
三)1000
D) 2
答案:A) 20
解释:这里的类实例变量 name(num) 与calc()方法局部变量 name(num) 相同。因此,对于从calc()方法引用类实例变量,使用this关键字。所以在语句this.num = num * 10中, num表示方法的局部变量,其值为 2, this.num表示类实例变量,其初始值为 100。现在在printNum()方法中,因为它没有局部变量name 与类实例变量相同,所以我们可以直接使用num来引用实例变量,虽然this.num可以使用。

方案二:

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() 合同。

答案: C) 输出为真并且 MyStuff 不履行 Object.equals() 合同。
解释:作为 Object 类中的equals(Object obj)方法,根据等价关系比较两个对象。但是这里我们只是确认对象是否为空,所以它不履行 Object.equals() 合同。由于m1不为 null,因此将打印 true。

程序 3:

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) 阿尔法贝塔 bb
B) 阿尔法贝塔 ab
C) beta alpha bb
D) beta alpha ab

答案: A) alpha beta bb
解释 :语句new Beta().go()分两个阶段执行。在第一阶段Beta类构造函数被调用。 Beta类中不存在实例成员。所以现在执行Beta类构造函数。由于Beta类扩展了Alpha类,因此调用Alpha类构造函数作为默认的第一条语句(由编译器放置)是Beta类构造函数中的super() 。现在,由于Alpha类中存在一个实例变量( type ),所以它将获取内存,现在执行Alpha类构造函数,然后调用 return to Beta类构造函数下一条语句。所以打印了alpha beta
在第二阶段,对该对象调用go()方法。因为对象中只有一个变量( type ),其值为a 。所以会改成b ,打印两次。这里的 super 关键字没有用。

程序 4:

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);
    }
}

选项 :
一)-1
B) 3
三)4
D) 在运行时抛出StringIndexOutOfBoundsException
答案: C) 4
说明: append(String str)方法,将 str 连接到s1substring(int index)方法将字符串从给定索引返回到末尾。但是由于没有任何 String 变量来存储返回的字符串,所以它会被销毁。现在indexOf(String s2)方法返回第一次出现s2的索引。所以 4 打印为 s1=”JavaLove”。

方案 5:

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) 写作……
B) 写书
C) 编写代码
D) 编译失败

答案: B) 写书
解释:由于静态方法不能被覆盖,所以创建哪个类对象并不重要。由于aAuthor引用类型,所以总是调用Author类方法。如果我们从Author类中删除write()方法,则会调用Writer类方法,因为Author类扩展了Writer类。