📜  Java程序的输出 20(继承)

📅  最后修改于: 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中的继承