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

Default access modifier of constructor in Inheritance

我做了一点网络搜索,了解到默认构造函数的访问修饰符与 class 的访问级别相同,但请看一下。

这是一个class

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.

    }
 }

我不明白,classes TestClass1TestClass2 都具有 public 访问权限,因此它们的构造函数也必须是隐式的 public。我在这里缺少哪个概念? o.O

I did a little web search and came to know that default constructor's access specifier is same as the access level of class

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

您代码中的当前构造函数不是默认构造函数。并且,它具有默认的(package-private --- 没有显式修饰符)访问权限,因为您已经省略了它的任何访问修饰符。

Which concept am I missing here ?

因此,由于默认访问的限制,您的 class 来自其他包的文件无法找到它。

哦,它们是 public,但仅限于包(我们称之为默认访问修饰符)!

访问修饰符在构造函数、方法和字段之间没有区别。

像这样将 MainClass 移动到同一个包中:

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

class MainClass {


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

或者让构造函数成为真实的public

public TestClass2()
...

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

package package2;
public class TestClass1 {
}

上面class我们还没有写任何构造函数

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 的构造函数来完成的,它是一个隐式的、不可见的构造函数,由 java 当我们明确地不写任何构造函数时提供。

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

import package2.*;

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