Java程序的输出|设置 20(继承)
先决条件 - Java的继承
预测以下Java程序的输出。
程序一:
class A
{
public A(String s)
{
System.out.print("A");
}
}
public class B extends A
{
public B(String s)
{
System.out.print("B");
}
public static void main(String[] args)
{
new B("C");
System.out.println(" ");
}
}
输出:编译失败
prog.java:12: error: constructor A in class A cannot be applied to given types;
{
^
required: String
found: no arguments
reason: actual and formal argument lists differ in length
1 error
说明: B 的构造函数中隐含的 super() 调用无法满足,因为 A 中没有无参数构造函数。仅当类没有显式定义的构造函数时,编译器才会生成默认的无参数构造函数。对于详细信息请参阅 - Java的构造函数
方案二:
class Clidder
{
private final void flipper()
{
System.out.println("Clidder");
}
}
public class Clidlet extends Clidder
{
public final void flipper()
{
System.out.println("Clidlet");
}
public static void main(String[] args)
{
new Clidlet().flipper();
}
}
输出:
Clidlet
说明:虽然不能覆盖 final 方法,但在这种情况下,该方法是私有的,因此是隐藏的。结果是创建了一个新的、可访问的方法翻转器。因此,在这个例子中没有发生多态,调用的方法只是子类的方法,不会发生错误。
程序 3 :
class Alpha
{
static String s = " ";
protected Alpha()
{
s += "alpha ";
}
}
class SubAlpha extends Alpha
{
private SubAlpha()
{
s += "sub ";
}
}
public class SubSubAlpha extends Alpha
{
private SubSubAlpha()
{
s += "subsub ";
}
public static void main(String[] args)
{
new SubSubAlpha();
System.out.println(s);
}
}
输出:
alpha subsub
说明: SubSubAlpha 扩展了 Alpha!由于代码不会尝试创建 SubAlpha,因此 SubAlpha 中的私有构造函数是可以的。
程序四:
public class Juggler extends Thread
{
public static void main(String[] args)
{
try
{
Thread t = new Thread(new Juggler());
Thread t2 = new Thread(new Juggler());
}
catch (Exception e)
{
System.out.print("e ");
}
}
public void run()
{
for (int i = 0; i < 2; i++)
{
try
{
Thread.sleep(500);
}
catch (Exception e)
{
System.out.print("e2 ");
}
System.out.print(Thread.currentThread().getName()+ " ");
}
}
}
输出:无输出
说明:在 main() 中,start() 方法从未被调用来启动“t”和“t2”,因此 run() 从未运行过。
有关详细信息:请参阅Java的多线程
程序 5 :
class Grandparent
{
public void Print()
{
System.out.println("Grandparent's Print()");
}
}
class Parent extends Grandparent
{
public void Print()
{
System.out.println("Parent's Print()");
}
}
class Child extends Parent
{
public void Print()
{
super.super.Print();
System.out.println("Child's Print()");
}
}
public class Main
{
public static void main(String[] args)
{
Child c = new Child();
c.Print();
}
}
输出: super.super.Print() 中的编译器错误
说明:在Java,不允许做 super.super。我们只能使用 Parent 访问祖父母的成员。请参见Java的继承
相关文章: Java继承测验