2010-11-13 64 views
3

您可以,请告诉我 1)为什么有可能将一个构造函数指定为公开的包可见类?例如:Java拼图:修饰符

class TestModifiers { 
    public TestModifiers() { 

    } 
} 

这个类不能在任何地方实例化,但在同一个包中。所以这不足以为构造函数使用包可见修饰符?在这样的一个类(公开)中的任何方法(包可见)也是如此。

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

关于第二个问题 - 这感觉怪怪及其事情是这样的:) ..其之前在这里讨论 - http://stackoverflow.com/questions/4075262/access-modifiers-inside-a-private-static-嵌套在java中的类 – 2010-11-13 20:29:07

+0

谢谢!没有看到这个。 – Dmitry 2010-11-13 20:45:06

回答

5

没有值在非公共类有一个公共构造函数,因为正如你正确状态,该类是不在该范围之外可以访问。它会编译 - 这就是事情的方式 - 但许多代码分析工具会产生警告。

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

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

代码可以获得MyRunnable实例(作为Runnable)并调用公共方法:

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

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

+0

这就是我需要的东西!非常感谢! – Dmitry 2010-11-13 21:47:48

-1

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

它可能会更方便。假设你有一个公共类,然后你明白你可以使它成为包私有,然后编译器告诉你有45个错误(在你的每个公共方法上)。


无法在你的第二个问题答复。我也认为这很奇怪。

+0

@Downvoter:留下评论。 – Roman 2010-11-13 20:00:36

+2

-1我看了这个答案的4倍,它仍然没有道理给我。 – Asaph 2010-11-13 20:01:17

+2

所以没有一请,提供更详细的解答 – Dmitry 2010-11-13 20:49:58

1

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

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

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

而不是强加在不对其它成员显示的构造的限制,公共构造是在类允许不管包含类的可见性。

+5

但你总是可以给一个重写的方法比超类中相应的方法更大的知名度。在你上面的例子,你可以离开了'public'关键字客'MyBaseClass.method()',一切仍然编译罚款。 – Asaph 2010-11-13 20:05:42

+0

该帖子再次提出了问题! – Dmitry 2010-11-13 20:46:42

1
  1. 它可能对继承有用。
  2. class BB.b1,b2属于A类,它们都在里面A.
+1

请你详细一点吗? – Dmitry 2010-11-13 20:50:32

+0

B类在A类内部。为什么B的私人成员不应该对A类可见? – khachik 2010-11-13 20:59:09

+0

1.)包访问也可以用于继承 - 如果类具有包访问权限,则必须位于同一包中才能进行扩展。 – 2010-11-13 21:10:52