Tag: 内部类

为什么内部类不能使用静态初始化器?

Quoth JLS#8.1.3 : 内部类可能不会声明静态初始化器 (第8.7节 )…… 这表现如下: class A { class B { static { // Compile-time Error: Cannot define static initializer in inner type AB System.out.println(“Class is initializing…”); } } } 既然Java的内部(非静态)类是由类加载器加载的 ,就像其他类一样,为什么我们不能为它们安装静态初始化器? 这种限制背后的原因是什么?

Lambda vs匿名内部类性能:减少ClassLoader的负载?

我想知道lambdas在Java 8中有多大的好处。我同意有时使用lambdas可能更具可读性,但是它对性能方面有多大影响吗? 或者主要是作为语法糖? 我有时喜欢匿名的内部课程; 当我不经常使用lambda时,我真的会失去很多好处吗? 唯一的?大? 在我看来,性能提升是我们实际上并没有创建类加载器必须在程序开始时加载的类 – 例如创建许multithreading: Thread t = new Thread(new Runnable() { public….. }); 创建Sample$1.class等类。 除此之外, 除了代码的可读性或可维护性等之外 , 还有任何性能或其他隐藏的收益吗? 隐藏在JVM的某个地方? 我见过类似的问题,但大多数都集中在视觉方面; 我对此不感兴趣。 在观看使用Venkat Subramaniam的Java 8 Lambdas Hacking之后,问题出于好奇。

为什么类不能扩展其中出现的静态嵌套类?

这个class: public class OuterChild extends OuterChild.InnerParent { public static class InnerParent { } } 无法编译: $ javac OuterChild.java OuterChild.java:1: error: cyclic inheritance involving OuterChild public class OuterChild extends OuterChild.InnerParent { ^ 1 error 因为OuterChild会“依赖”它本身,因为( 根据Java语言规范 ,Java SE 8版的§8.1.4“超类和子类” )类直接依赖于“[]中提到的任何类型的extends或implements子句[…]作为超类或超界面名称的完全限定forms的限定符。“ 但我真的不明白这里的动机。 什么是有问题的依赖? 它只是为了与InnerParent是非static的情况保持一致(并因此最终得到一个词法封闭的自身实例)?

我为什么要使用嵌套类?

什么时候嵌套类是可行的? 我看到它最常见的优点是“共享范围”(跨类使用变量)。 这不是一个最好的做法,而不仅仅是将嵌套类放在它自己的文件中,并通过构造函数传递参数?

无法在内部类中声明Public static final String s = new String(“123”)

我试图声明一个类,如下所示 class Outer{ private final class Inner{ public static final String s1 = new String(“123”); public static final byte[] bytes = new byte[]{0x00, 0x01}; public static final String s2 = “123”; public static final byte byte1 = 0x02; } } 在上面的代码中,s1和bytes不会编译,但是s2和byte1编译。 如果我将整个常量声明放在外部类中它可以正常工作。 我错过了什么 有帮助吗?

当涉及内部类时,Javainheritance如何工作

当内部类存在时,我无法理解inheritance在Java中的工作原理。 我正在研究一个子类需要稍微改变它的父类内部类的function的东西。 我在下面提出了一个更简单,更讽刺的例子。 我希望这段代码打印“我是一个ChildClass.InnerClass”,而是打印“我是一个ParentClass.InnerClass”。 为什么是这样? 此外,如果我将main中的obj对象更改为ChildClass类型,则输出将更改为“我是ChildClass.InnerClass”。 为什么是这样? 一般来说,改变对象父类内部对象行为的推荐方法是什么? class InnerClassTest { //———————————————————————– // PARENT CLASS class ParentClass { public ParentClass() { x = new InnerClass(); } InnerClass x; class InnerClass { public void speak() { System.out.println(“I am a ParentClass.InnerClass”); } } } //———————————————————————– // CHILD CLASS class ChildClass extends ParentClass { public ChildClass() { x […]

在Scala中实现内部特征,就像在Java中使用内部接口一样

Java中的这段代码编译时没有错误: interface T { interface Q { } } class C implements TQ { } 而Scala中的此代码不会: trait T { trait Q { } } class C extends TQ { } Scala中Java代码列表的正确翻译(如果存在)是什么? 关于语言设计的理论解释是受欢迎的。

Java停止了内部类中非final变量的错误(java 8)

Java 7在下面的代码中说“不能引用封闭范围中定义的非最终局部变量消息”: public class Runner { public static void main(String[] args) { String message = “Hello world”; new Runnable() { @Override public void run() { System.out.println(message); } }.run(); } } Java 8没有。 怀疑这是关于向Java添加函数式编程function。 它是否同样处理代码?

Java范围规则和内部类

所有疯狂的Java范围规则都让我头疼,而公共静态无效的废话并没有帮助。 到目前为止,我使用的所有编程语言都是词法作用域或者它的一些近似,没有任何访问修饰符,即内部东西捕获外部东西,并且只要内部东西存在就可以访问外部东西。 那么我如何理解Java中内部类的作用域规则呢? 他们是否可以访问在外部类中声明的变量,或者是否有一些奇怪的边缘情况我不得不担心因为所有公共静态私有东西浮动?

Scala无法访问Java内部类?

我有一个看起来像这样的java类: public class Constants { public class Commands { public static final String CreateOrder = “CreateOrder”; } } 我想访问“CreateOrder”常量,在java中我可以像这样轻松访问它: String co = Constants.Commands.CreateOrder 但在Scala这不起作用为什么??? 如何从Scala访问“CreateOrder”,我无法改变Java代码。 谢谢。