不使用和使用带有构造函数的访问修饰符时的不同结果

时间:2016-03-25 22:56:54

标签: java inheritance constructor

我正在学习java并最终达到了继承的目的。我从书中了解到,我从中读到了没有必要把公众"方法/变量的访问修饰符。

int showDim() { ... };        // both are the same because by default
public int showDim() { ... }; // not adding an access modifier will make it public.

因此,为了对构造函数的继承主题进行一点评论,我创建了这个小程序:

A.java

package Default;

class A extends B {

    A() { System.out.println("A constructor initiated"); }

    public static void main(String ... args) {
        A obj = new A();
    }
}

B.java

package Default; 

class B {

    B() { System.out.println("B constructor initiated"); }
}  

当我运行A类主要方法时,结果如下:

A constructor initiated

仅运行A构造函数。但是,当我在A和B构造函数前面的public之前,这就是结果。

B constructor initiated
A constructor initiated 

为什么会这样?我认为默认情况下不添加访问修饰符会使其公开。有什么理由吗?我理论上唯一的原因是因为main方法是从A类内部运行的。

2 个答案:

答案 0 :(得分:3)

  

//不添加访问修饰符会使其公开。

不正确。不添加访问修饰符将为其提供package default访问修饰符,这意味着它只能从同一个类中访问。

有4个访问修饰符(从限制最多到限制较少):

  • private:从同一个班级访问
  • default:从包中访问(您无需指定它,default是另一个使用的保留关键字
  • protected:从包和子类访问
  • public:从任何地方访问
  

当我运行A类主要方法时,结果如下:

     

启动的构造函数只运行A构造函数。但是,当我   在A和B构造函数前面的public之前,这是   结果

     

B构造函数已启动

     

启动构造函数

实际发生的是以下

A() {
    super(); <--- THIS IS ADDED AT COMPILATION CALLING B's CONSTRUCTOR
    System.out.println("B constructor initiated");
}

如果您使用的是其他软件包,代码将无法编译,您将收到以下编译错误

Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
    The constructor B() is not visible

    at A.<init>(A.java:7)
    at A.main(A.java:11)

当然,解决方案是将构造函数的访问修饰符更改为public

答案 1 :(得分:2)

默认公共可见性仅适用于属于接口的方法,而不属于类。