Java 程序输出|第二集
原文:https://www.geeksforgeeks.org/output-of-java-program-set-2/
预测以下 Java 程序的输出。
问题 1:
Java 语言(一种计算机语言,尤用于创建网站)
package main;
class Base {
public void Print()
{
System.out.println("Base");
}
}
class Derived extends Base {
public void Print()
{
System.out.println("Derived");
}
}
class Main {
public static void DoPrint(Base o)
{
o.Print();
}
public static void main(String[] args)
{
Base x = new Base();
Base y = new Derived();
Derived z = new Derived();
DoPrint(x);
DoPrint(y);
DoPrint(z);
}
}
输出:
Base
Derived
Derived
预测第一行输出很容易。我们创建一个 Base 类型的对象,并调用 DoPrint()。DoPrint 调用 Print 函数,我们得到第一行。
DoPrint(y)导致第二行输出。像 C++一样,在 Java 中允许将派生类引用分配给基类引用。因此,表达式 Base y = new Derived()在 Java 中是有效的语句。在 DoPrint()中,o 开始引用与 y 引用的对象相同的对象。此外,与 C++不同,函数在 Java 中默认是虚拟的。因此,当我们调用 o.print()时,派生类的 print()方法被调用,这是由于 Java 中默认存在运行时多态性。
DoPrint(z)导致第三行输出,我们传递一个派生类的引用,再次调用派生类的 Print()方法。这里需要注意的一点是:与 C++不同,对象切片在 Java 中不会发生。因为非基元类型总是通过引用赋值的。
问题 2:
Java 语言(一种计算机语言,尤用于创建网站)
package main;
// filename Main.java
class Point {
protected int x, y;
public Point(int _x, int _y)
{
x = _x;
y = _y;
}
}
public class Main {
public static void main(String args[])
{
Point p = new Point();
System.out.println("x = " + p.x + ", y = " + p.y);
}
}
输出:
Compiler Error
在上面的程序中,没有访问权限问题,因为点和主在同一个包中,并且一个类的受保护成员可以在同一个包的其他类中访问。代码的问题是:Point 中没有默认构造函数。
像 C++ 一样,如果我们自己编写参数化的构造函数,那么 Java 编译器不会创建默认的构造函数。所以对 Point 类有以下两个修改可以修复上面的程序。
- 移除参数化构造函数。
- 添加不带任何参数的构造函数。
Java 不支持默认参数,所以这不是一个选项。 如果您发现任何答案/解释不正确,或者想分享更多关于上述讨论主题的信息,请写评论。
版权属于:月萌API www.moonapi.com,转载请注明出处