我啥时候想让我的私人课程成为静态的?
Posted
技术标签:
【中文标题】我啥时候想让我的私人课程成为静态的?【英文标题】:When would I want to make my private class static?我什么时候想让我的私人课程成为静态的? 【发布时间】:2011-09-07 13:29:42 【问题描述】:一般来说,将私有类声明为静态有什么好处?
在什么情况下我希望使用以下其中一种而不是另一种?
private static class Foo
...
对
private class Foo
...
【问题讨论】:
java-inner-class-and-static-nested-class 可能有帮助。 您可能会发现这篇文章中的第二个答案很有帮助:***.com/questions/1844355/java-static-class 【参考方案1】:如果您需要访问封闭类的成员变量/方法,请使用非静态形式。如果不这样做,请使用静态表单。
【讨论】:
这是一个糟糕的答案。即使是静态类,如果我获得对父类对象的引用,我也可以访问私有成员。 但是你为什么要这么做?如果您需要访问私有变量并且它是一个内部类,只需将其设为非静态,而不是将其设为静态并将引用传递给父级。 它们是不同的概念。非静态(即内部)类具有对父类对象的隐式引用。因此,如果没有父类的对象,则不能拥有内部类的对象。这方面的一个例子是 Map.Entry (或更好的迭代器) - 它需要引用父地图对象。静态嵌套类的一个示例是 Builder,它需要访问父级的私有构造函数 但是这些类(例如 Map.Entry)不是私有的。 OP询问了私人课程。 @Jeff Storey,也许接口不是私有的,但实现是可能的,并且私有/受保护是好的。即当您说 myList.getIterator() 时,您将获得一些私有或受保护的 Iterator iface 实现【参考方案2】:静态类与普通类的不同之处仅在于它们可以在不创建实例的情况下进行访问。因此,如果您需要每次都可以访问某个类,请使用静态
【讨论】:
【参考方案3】:我假设您指的是内部类。
我认为动机将来自您希望如何关联您的内部阶级。如果您希望您的内部类与其外部类的特定实例相关联,您可以使用private class
,否则,请使用private static class
。
【讨论】:
我很确定private
和 "inner" 类是同义词。【参考方案4】:
我认为这是一个很好的起点: http://java67.blogspot.fi/2012/10/nested-class-java-static-vs-non-static-inner.html
1) 嵌套静态类不需要外部类的引用,但不需要 静态嵌套类或内部类需要外部类引用。你 不能创建内部类的实例而不创建实例 外班。这是迄今为止要考虑的最重要的事情 将嵌套类设为静态或非静态。
2) 静态类实际上是类的静态成员,可用于 静态上下文,例如Outer 类的静态方法或静态块。
3) 静态和非静态嵌套类的另一个区别是 您无法访问非静态成员,例如方法和领域 直接嵌套静态类。如果你这样做,你会得到像“非 静态成员不能在静态上下文中使用”。而内部类 可以访问 Outer 类的静态和非静态成员。
【讨论】:
但是,我们使用了private
,它仍然可以访问吗?
它只能在嵌套类内部访问,而不是外部世界,因为它是嵌套类的私有对象【参考方案5】:
我发现它在通用抽象类中具有特定异常时很有用。即:
public abstract class AbstractClass <T>
private void doSomethingOrThrowException() throws SpecificException
....
if ( ! successful)
throw new SpecificException();
private static class SpecificException extends Exception
如果我忽略静态,编译器会给我一个错误,指出:The generic class AbstractClass<T>.SpecificException may not subclass java.lang.Throwable
【讨论】:
【参考方案6】:如果我理解正确,那么问题是 private class vs private static class。所有的回答通常都是关于内部类,并不是 100% 应用于那个问题。所以首先要做的事情:
来自geeksforgeeks:
嵌套类 -> 另一个类中的一个类 静态嵌套类 -> 声明为静态的嵌套类称为静态嵌套类 内部类 -> 内部类是非静态嵌套类。正如接受的回复所说,静态与非静态嵌套类在访问外部类之外的方法/字段的方式和可能性上有所不同。但如果是 A 类中的私有类 B,则不会出现此问题,因为 B 无论如何都无法在 A 之外访问。
现在,从 A 类内部,对于非静态字段/方法,您始终可以通过说 new A.B()
或只是 new B()
来引用 B 类,如果 B 是无关紧要(没有编译/运行时错误) 私有类或私有静态类。对于静态字段/方法,您需要使用 私有静态类。
此外,如果您想从 B 内部访问 A 的非静态字段,那么您不能将 B 作为 私有静态类。
我一般更喜欢私有静态类,除非我不能像以前那样使用它,否则intellij会给出警告。
【讨论】:
答案还可以,唯一的问题是内部类可以是静态/非静态的,基于同一篇 geekforgeeks 文章以上是关于我啥时候想让我的私人课程成为静态的?的主要内容,如果未能解决你的问题,请参考以下文章