📅  最后修改于: 2020-03-24 01:15:22             🧑  作者: Mango
先决条件 Java继承
预测以下Java程序的输出。
程序1:
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(" ");
}
}
输出:编译失败
说明:因为A中没有no-arg构造函数,所以无法满足B的构造函数中隐含的super()调用。仅当该类没有显式定义构造函数时,编译器才会生成默认的no-arg构造函数。详细信息请参见: Java中的构造方法
程序2:
class Clidder
{
private final void flipper()
{
System.out.println("芒果");
}
}
public class Clidlet extends Clidder
{
public final void flipper()
{
System.out.println("芒果文档");
}
public static void main(String[] args)
{
new Clidlet().flipper();
}
}
输出:
芒果文档
说明:尽管无法重写final方法,但是在这种情况下,该方法是私有的,因此是隐藏的。结果是创建了一个新的、可访问的方法触发器。因此在此示例中,不会发生多态性,所调用的方法仅是子类的方法,并且不会发生错误。
程序3:
class Alpha
{
static String s = " ";
protected Alpha()
{
s += "芒果 ";
}
}
class SubAlpha extends Alpha
{
private SubAlpha()
{
s += "文档 ";
}
}
public class SubSubAlpha extends Alpha
{
private SubSubAlpha()
{
s += "两个芒果 ";
}
public static void main(String[] args)
{
new SubSubAlpha();
System.out.println(s);
}
}
输出:
芒果 两个满难过过
说明: SubSubAlpha扩展了Alpha!由于代码不会尝试创建SubAlpha,因此SubAlpha中的private构造函数是可以的。
计划4:
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()从未运行过。
计划5:
class Grandparent
{
public void Print()
{
System.out.println("祖父类 Print()");
}
}
class Parent extends Grandparent
{
public void Print()
{
System.out.println("父类 Print()");
}
}
class Child extends Parent
{
public void Print()
{
super.super.Print();
System.out.println("子类 Print()");
}
}
public class Main
{
public static void main(String[] args)
{
Child c = new Child();
c.Print();
}
}
输出: super.super.Print()中的编译器错误
说明:在Java中,不允许执行super.super。我们只能使用父母访问祖父母的成员。请参见Java中的继承