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

问题描述:

我做了一点网络搜索,并知道默认构造函数的访问修饰符与类的访问级别相同,但请看一下。继承构造函数的默认访问修饰符

这里是一个类

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都有p ublic访问,所以它们的构造函数也必须是隐式公开的。我在这里想念哪个概念? OO

+2

你在哪里读的构造函数的默认访问说明符和它的课程一样吗? – Codebender

+0

'默认构造函数!=构造函数的默认访问说明符。 JLS谈论隐式构造函数(如果你没有在类中定义任何构造函数,它会自动创建)。 – Codebender

+0

@Salim - 你也想提出答案! –

我做了一些网络搜索和才知道,默认的构造函数的 访问说明符是同级的访问级别

有默认的构造函数和一个之间的差异,你”已宣布。默认的构造函数是你不在类中声明的构造函数。

代码中的当前代码不是默认构造函数。并且,它具有缺省值(包私有---没有显式修饰符)acccess,因为你已经省略了访问修饰符。

我在这里遗漏了哪些概念?

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

+0

'default'是switch语句中的关键字,而不是访问修饰符,并且在Java中没有访问说明符。 – EJP

+0

@EJP - 对不起,访问说明符和访问修饰符之间的混淆让我失望了!感谢您的编辑。而且,从默认情况来看,我提到了package-private。 –

哦,它们是公开的,但仅适用于软件包(我们称之为默认访问修改器)!

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

移动MainClass到同一个包这样的:

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

class MainClass { 


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

,或使构造真正的公共

public TestClass2() 
... 

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

在你的例子中,你已经明确地写了构造函数并将其设置为默认值(默认意味着不公开或私有),这意味着它只能在同一个包中访问。如果你试图调用任何类,这是外面包这个构造函数,你会得到错误的构造是不可见,因为你的情况:

import package2.*; 

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