Java Puzzle:修饰符

Dmi*_*try 3 java

请问,请告诉我1)为什么可以将构造函数指定为包公开类的公共?例如:

class TestModifiers {
    public TestModifiers() {

    }
}
Run Code Online (Sandbox Code Playgroud)

此类不能在任何地方实例化,而是在同一个包中.那么对于构造函数使用包可见修饰符是不够的呢?对于这样的类中的任何方法(公共)也是如此(包可见)

2)说,在内部类中我创建了两个私有变量.为什么我能从外层看到他们?不是很奇怪吗?例如:

class A {
  A(){}

  class B {
    private int b1;
    private int b2;
  }

  public static void main(String[] args) {
   new B().b1 = 1;
   new B().b2 = 2;
  }
 } 
Run Code Online (Sandbox Code Playgroud)

Sim*_*onJ 5

在具有公共构造函数的非公共类中没有任何值,因为正如您所说,该类在该范围之外是不可访问的.它将编译 - 这就是事情的方式 - 但许多代码分析工具将生成警告.

在具有公共方法的非公共类值,如果类扩展或实现公共类或接口,由于派生类可以站在基类或接口类型:

package mypackage;

class MyRunnable implements Runnable {
    private final String message;

    MyRunnable(String message) {
        this.message = message;
    }

    @Override
    public void run() {
        System.out.println(this.message);
    }
}

public class Surprises {
    public static Runnable getSurprise() {
        return new MyRunnable("boo!");
    }
}
Run Code Online (Sandbox Code Playgroud)

mypackage然后,代码可以获取一个MyRunnable实例(作为a Runnable)并调用公共方法:

Runnable r = Surprises.getSurprise();
r.run();
Run Code Online (Sandbox Code Playgroud)

我会忽略你的第二个问题,因为它在评论的其他地方得到了回答.