继承中构造函数的默认访问修饰符

时间:2016-09-05 04:24:09

标签: java inheritance constructor access-modifiers default-constructor

我进行了一些网络搜索,并且发现默认构造函数的访问修饰符与类的访问级别相同,但请看一下。

这是一个班级

package package2;
public class TestClass1 {
    TestClass1()
    {
        System.out.println("In parent's contructor");
    }
}

这是继承自前一个

的另一个
package package2;

public class TestClass2 extends TestClass1 {

      TestClass2()
     {
         System.out.println("In TestClass2's contructor");
     }

}

但是当我尝试创建TestClass2

的对象时
import package2.*;

class MainClass {


    public static void main(String[] args) 
    {
        TestClass2 t2 = new TestClass2(); //Says the constructor TestClass2() is not visible.

    }
 }

我不明白,类TestClass1TestClass2都有公共访问权限,因此它们的构造函数也必须是隐式公共的。我在这里错过了哪个概念? o.O

3 个答案:

答案 0 :(得分:2)

  

我做了一点网页搜索,然后才知道默认构造函数   访问说明符与类

的访问级别相同

默认构造函数与您声明的构造函数之间存在差异。默认构造函数是您不在类中声明的构造函数。

代码中的当前版本不是默认构造函数。并且,它具有默认值(package-private --- no explicit modifier)acccess,因为你已经从中省略了任何访问修饰符。

  

我在这里错过了哪个概念?

因此,由于默认访问的限制,您的其他包中的类无法找到它。

答案 1 :(得分:1)

哦,他们是公开的,但仅限于包(我们称之为default-access-modifier)!

access-modifiers在构造函数和方法与字段之间没有区别。

将MainClass移动到同一个包中:

package package2; // <-- !
import package2.*;

class MainClass {


    public static void main(String[] args) 
    {
        TestClass2 t2 = new TestClass2(); //OK!
    }
}

或让构造者真正公开

public TestClass2()
...

答案 2 :(得分:0)

当您不编写任何构造函数时,隐式构造函数是构造函数。在您的代码中,您已明确编写了构造函数,因此它们不是隐式的。 隐式构造函数由Java在内部提供,并且不可见。例如:

package package2;
public class TestClass1 {
}

在上面的类中,我们没有编写任何构造函数。

package main;
class MainClass {
        public static void main(String[] args) 
        {
            TestClass1 t2 = new TestClass1(); //Although we have not written any constructor for TestClass1, but we are able to create object for it. This object creation is done by calling TestClass1's costructor, which is an implicit, invisible constructor provided by java when we explicitly do not write any constructor. 
        }
}

上面,虽然我们没有为TestClass1编写任何构造函数,但我们能够为它创建对象。这个对象的创建是通过调用TestClass1的costructor来完成的,当我们明确地不写任何构造函数时,它是java提供的隐式隐形构造函数。

在您的示例中,您已明确编写构造函数并将其设置为默认值(默认值表示不公开或私有),这意味着它只能在同一个包中访问。如果您尝试从包外部的任何类调用此构造函数,您将收到构造函数在您的情况下不可见的错误:

import package2.*;

    class MainClass {
        public static void main(String[] args) 
        {
            TestClass2 t2 = new TestClass2(); //Says the constructor TestClass2() is not visible.
        }
     }