当我定义一个抽象类而不是声明时会发生什么。

时间:2015-07-03 04:36:58

标签: java abstract

public class Temp {
public static void main(String args[]) {
    A ref;
    B objB = new B();
    C objC = new C();
    ref = objB;
    ref.show();
    ref = objC;
    ref.show();

}

}

abstract class A {

abstract void show();

 {
    System.out.println("In Class A");
 }
}

class B extends A {

void show() {
    System.out.println("In class B");
   }
 } 
class C extends B {

void show() {
    System.out.println("In Class C");
 }
}

在上面的代码中,抽象方法包含了方法的定义。但是在书中说明抽象方法应该只包含该方法的声明而非定义。当我执行此程序时,它会导致以下输出没有任何错误。请解释我如何显示以下输出。

In Class A
In Class A
In class B
In Class C

2 个答案:

答案 0 :(得分:8)

您的抽象类不包含该方法的定义。您的抽象类包含一个抽象方法和一个初始化块。

abstract class A {
    // Abstract method
    abstract void show();

    // Initializer block, completely unrelated to show
    {
        System.out.println("In Class A");
    }
}

初始化程序块在构造对象时运行 - 与构造函数类似(但是您可以有多个,并且它们不能有参数)。它和你写的完全一样:

abstract class A {
    // Abstract method
    abstract void show();

    // Constructor
    public A()
    {
        System.out.println("In Class A");
    }
}

输出来自:

A ref;
B objB = new B(); // calls B's constructor, then A's constructor which prints "In Class A"
C objC = new C(); // calls C's constructor, then A's constructor which prints "In Class A"
ref = objB;
ref.show(); // prints "In Class B"
ref = objC;
ref.show(); // prints "In Class C"

答案 1 :(得分:4)

这个abstact方法在A类中没有实现:

abstract void show();

分号在没有实现的情况下结束方法声明。

以下块是一个实例初始化块(在执行构造函数的代码之前创建类的isntance时执行),与抽象方法无关:

{
    System.out.println("In Class A");
}

如果您尝试为抽象方法提供实现,它将如下所示并且无法编译:

abstract void show()
{
    System.out.println("In Class A");
}

至于你得到的输出:

In Class A // new B() causes the instance initialziation block of A to be executed before the (default) constructor of A 
In Class A // new C() causes the instance initialziation block of A to be executed before the (default) constructor of A 
In class B // first ref.show() executes B's show, since you assigned objB to ref
In Class C // second ref.show() executes C's show, since you assigned objC to ref
相关问题