gpt4 book ai didi

java - 不使用访问修饰符和将访问修饰符与构造函数一起使用时会产生不同的结果

转载 作者:行者123 更新时间:2023-12-01 16:53:17 25 4
gpt4 key购买 nike

我正在学习java,终于达到了继承的地步。我在我读的书中了解到,没有必要在方法/变量上放置“public”访问修饰符。

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 类 main 方法时,结果如下:

A constructor initiated

仅运行 A 构造函数。然而,当我在 A 和 B 构造函数前面加上 public 时,结果就是这样。

B constructor initiated
A constructor initiated

为什么会发生这种情况?我认为不添加访问修饰符会默认将其公开。这有什么原因吗?我可以推测的唯一原因是因为 main 方法是从 A 类内部运行的。

最佳答案

// not adding an access modifier will make it public.

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

有 4 个访问修饰符(从最严格到最宽松):

  • private :从同一个类访问
  • default :从包中访问(不需要指定,default是一个保留关键字,有其他用途
  • protected :从包和子类访问
  • public:从任何地方访问
<小时/>

When I run the class A main method, this is the result:

A constructor initiated Only the A constructor runs. However, when I precede public in front of both the A and B constructor, this is the result.

B constructor initiated

A constructor initiated

实际发生的情况如下

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

关于java - 不使用访问修饰符和将访问修饰符与构造函数一起使用时会产生不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36229384/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com