【问题标题】:Java Puzzle: modifiersJava 谜题:修饰符
【发布时间】:2011-05-09 15:09:01
【问题描述】:

你能告诉我吗 1)为什么可以将构造函数分配为公共的包可见类?例如:

class TestModifiers {
    public TestModifiers() {

    }
}

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

2) 比如说,在一个内部类中,我创建了两个 private 变量。为什么我可以从外面的班级看到他们?是不是很奇怪??例如:

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;
  }
 } 

【问题讨论】:

标签: java


【解决方案1】:

在具有公共构造函数的非公共类中存在 no 值,因为正如您正确指出的那样,在该范围之外无法访问该类。它会编译——事情就是这样——但许多代码分析工具会产生警告。

在具有公共方法的非公共类中有值如果该类扩展或实现公共类或接口,因为派生类可以代替基类或接口类型:

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!");
    }
}

mypackage 之外的代码然后可以获得MyRunnable 实例(作为Runnable)并调用公共方法:

Runnable r = Surprises.getSurprise();
r.run();

我将忽略您的第二个问题,因为它已在 cmets 的其他地方得到回答。

【讨论】:

  • 这就是我所需要的!非常感谢!
【解决方案2】:

在非公共类上允许使用公共修饰符,因为在这些类中定义的公共方法可能需要在公共子类中被覆盖。例如

abstract class MyBaseClass {
  public abstract void method();
}

public class MySubClass extends MyBaseClass {
  @Override public void method() { ... }
}

与其对不出现在其他成员上的构造函数施加限制,不如在类上允许公共构造函数,而不管包含类的可见性。

【讨论】:

  • 但是你总是可以给一个被覆盖的方法比超类中的相应方法更大的可见性。在上面的示例中,您可以将 public 关键字从 MyBaseClass.method() 中删除,并且一切仍然可以正常编译。
  • 那篇文章又提出了问题!
【解决方案3】:
  1. 它可能对继承有用。
  2. class BB.b1,b2属于A类,在A里面。

【讨论】:

  • 能不能说的详细点?
  • B 类在 A 类中。为什么 B 的私有成员不应该对 A 类可见?
  • 1.) 包访问也适用于继承 - 如果类具有包访问权限,您必须在同一个包中才能对其进行扩展。
  • (我打算建议一个公共构造函数对反射有影响,但事实并非如此)
【解决方案4】:

1) 为什么可以分配一个 构造函数作为公共的 包可见类?

这样方便多了。

想象一下你有一个公共类,然后你明白你可以将它设为包私有,然后编译器告诉你有 45 个错误(在你的每个公共方法上)。


无法回答您的第二个问题。我也觉得很奇怪。

【讨论】:

  • -1 我读了这个答案 4 次,但对我来说仍然没有意义。
  • 我也是。请给出更详细的答案
  • 如果你有 45 个不同的构造函数,我会说你还有其他问题。
猜你喜欢
  • 1970-01-01
  • 2013-05-25
  • 1970-01-01
  • 1970-01-01
  • 2011-02-15
  • 2014-10-20
  • 2013-12-01
相关资源
最近更新 更多