我正在学习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类内部运行的。
答案 0 :(得分:3)
//不添加访问修饰符会使其公开。
不正确。不添加访问修饰符将为其提供package default
访问修饰符,这意味着它只能从同一个类中访问。
java有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)
默认公共可见性仅适用于属于接口的方法,而不属于类。