2015-07-28 84 views
1

我有三个类是这样的:在这种情况下是否需要执行标准构造函数(Java)?

public abstract class ClassA extends ClassX { 
    protected ClassA() { 
     super(); 
    } 
    // more code 
} 
public class ClassB extends ClassA { 
    public ClassB() { 
     super(); 
    } 
    // more code 
} 
public abstract class ClassC extends ClassB { 
    public ClassC() { 
     super(); 
    } 
    // more code 
} 

我要说的是,对于ClassC标准构造函数是没有必要的,因为Java将在编译过程中插入,因为在这个类别中没有其他构造函数,对不对? 如果属实,我可以简化ClassC代码到这一点:

public abstract class ClassC extends ClassB { 
    // more code 
} 

现在我想说的是,因为构造函数的可访问性,从protected增加到public我不能ClassB这样做。

我问,因为我不是100%肯定这件事,以为我可能失去了一些东西。特别是关于标准构造函数,如果我没有自己实现,将插入ClassC。在这种情况下,它将具有可访问性public,因为它从ClassB继承。那是对的吗?

所以我的问题是:我可以删除ClassC构造,而无需代码被改变(尤其是构造函数的可访问性),并且是正确的,我不能删除ClassB的的构造函数。

+0

你可能应该问个别的问题:) –

+0

长话短说。你的假设看起来正确 – cjds

+0

你是对的:-)。所以我的问题主要是:我可以删除ClassC中的构造函数,而不必更改代码(将编辑问题)。 –

回答

3

现在我会说我无法对ClassB做同样的事情,因为构造函数的可访问性从保护到公共增加。

这是无关紧要的,因为它是一个抽象类。构造函数不能直接调用 - 仅在从子类构造函数进行链接时使用。

因此,尽管这将是技术上不同,你的代码将有效相同的,如果你删除了所有的构造函数声明。

但在默认构造函数的获取方面,JLS 8.8.9是这里的权威:

如果一个类不包含任何构造函数声明,那么默认的构造函数是隐式声明。顶级类,成员类或本地类的默认构造函数的形式如下:

  • 默认构造函数与类(§6.6)具有相同的可访问性。
  • ...
+0

“默认的构造函数与类有相同的可访问性” - >这有很大的帮助,非常感谢! –

+0

我的困惑是因为我认为默认构造函数继承了其父类的无参数,无throws-statement构造函数的可访问性。由于文档说它继承了*类本身*的可访问性,现在很明显。 –

+0

有关ClassA被抽象的好评 - 你是对的,那么我也可以在那里删除构造函数。想知道是谁把它放在那里:-) –

0

Java specification on default constructor

如果一个类不包含构造函数声明,那么隐式声明了一个没有形式参数且没有throws子句的默认构造函数。

如果类被声明为原始类对象,那么默认的构造函数有一个空的机构。否则,默认构造函数只是简单地调用没有参数的超类构造函数。

所以你应该很好,不包括任何这些构造函数。

1

一个类的默认构造函数具有与类本身相同的访问修饰符的规则很简单直观。但是,请注意,这并不意味着只要该类可访问,构造函数就可以访问。

  1. 如果不使一个构造中,default empty constructor is automatically created
  2. 如果任何构造函数没有显式调用super或此构造函数作为它的第一条语句,则返回call to super() is automatically added

这意味着,如果你的构造与在子类的范围定义,那么就没有必要调用super()明确。正如你的情况,你可以删除所有的构造函数。你的程序仍然会编译并运行。

希望这会有所帮助。有关更多请看看共享链接,它有一些更美丽的例子。

相关问题