jjzjj

Declaration

全部标签

java - 为什么不能在内部类中为静态变量使用初始化程序 block ?

这个问题在这里已经有了答案:WhydoesJavaprohibitstaticfieldsininnerclasses?(12个答案)关闭7年前。为什么java不允许在非静态内部类中使用静态初始化block进行静态声明?在下面的代码中,outer2会工作而inner2不会,尽管做同样的事情。有任何想法吗?我不是在寻找解决方法,我只是想了解为什么java无法做到这一点。publicclassWhyUNoStatic{publicstaticfinalStringouter1="snth";//okpublicstaticfinalStringouter2;//okstatic{outer

java - 为什么可以声明一个没有初始值的变量?

我正在阅读GillesDowek的PrinciplesofProgrammingLanguanges:他说也可以声明一个变量而不给它一个初始值,而且我们必须小心不要使用一个声明没有初始值并且没有被赋值的变量。这会产生错误。注意:该书的作者提到了在Java上声明没有初始值的变量的可能性。那么,为什么这个变量声明有效?我什么时候使用它? 最佳答案 许多不同的语言有许多不同的原因。内存当你声明一个变量时,你需要一些内存来保存变量。这涉及向操作系统的内核请求内存,或者某种跟踪内存的监控程序。简而言之,这可能是一个昂贵的操作。因此,在许多情况

java - 泛型通配符实例化

前几天我在审查别人的代码时,遇到了引起一些关注的一行。为简化起见,假设我有一个通用类A和一个抽象类B。是否允许以下​​实例化?如果允许,为什么?Objectobj=newA();我个人从来没有见过像上面这样的实例化,尽管像这样的声明Aobj=null;肯定会持有。我一直在泛型中使用通配符来声明方法参数,所以我可能没有经验。 最佳答案 实际上newA()不编译。自Java5以来,它一直是非法的。但我猜你的原始示例类似于newA>().后者在最新版本的Java中是合法的。这个想法是,当实例化一个对象时,类型参数的值可以是任何非通配符类型

java - 在 Java 中,变量应该总是用接口(interface)声明吗?

人们经常看到这样的建议,即变量应该用某个接口(interface)声明,而不是实现类。例如:Listlist=newArrayList();但是,假设我将此列表用于一种算法,该算法确实依赖于ArrayList的O(1)随机访问(例如Fisher-Yates改组)。在那种情况下,ArrayList对我来说代表的关键抽象是它类似数组的性质,而不仅仅是它的列表性质。换句话说,如果有人出现并将list更改为LinkedList,这将是有问题的,即使代码可以编译。在这种情况下,是否可以让声明使用实现类型?例如:ArrayListlist=newArrayList();

java - 使用抽象类实现接口(interface)时要声明什么(不)?

我有一个接口(interface)A,我必须为它提供一些不同的实现。但是,这些实现共享一些辅助方法,因此我将这些方法移到了一个抽象基类中。InterfaceA{voiddoX();}abstractClassBimplementsA{protectedvoidcommonY(){//...}@OverridepublicabstractvoiddoX();}ClassCextendsB{@OverridepublicvoiddoX(){//...}}ClassDextendsB{@OverridepublicvoiddoX(){//...}}我的代码按预期工作,但我有几个问题:我应该在

Java - 对象声明和初始化

在构建新对象时,我使用了以下代码。在这段代码中,对象是否引用了变量“a”?BankAcca=newBankAcc();此外,出于兴趣,如果上面为变量a构造了一个新对象,下面的代码会做什么?它只是创建一个没有变量/对象引用的新对象吗?newBankAcc();谢谢! 最佳答案 是的,是的。当您只想使用匿名对象而不关心是否有引用时,第二个可能很有用。喜欢:newThread(newRunnable(){publicvoidrun(){}}).start(); 关于Java-对象声明和初始化,

java - 智能 : move variables at method start

我使用IntelliJUltimate来处理Java。有这么多有用的功能,但有一个可能对我来说非常好,但我找不到......有时我会在没有事先声明的情况下使用变量(第一次)。然后,我在未声明的变量上使用ctrl+Enter功能打开菜单并选择自动声明的选项。有时只是速度更快。效果很好,问题是变量会在使用的那一行自动声明。现在,我想要IntelliJ中的一个函数,它可以自动将所有声明移动到方法开头的位置。它存在吗?或者我该如何实现? 最佳答案 没有将所有声明移动到方法开始的功能(并且没有计划添加它,因为大多数编码指南建议声明变量尽可能接

HashSet 或其他实现的 Java 变量类型集合?

我经常看到类似Listlist=newArrayList();的声明或Setset=newHashSet();对于类中的字段。对我来说,使用变量类型的接口(interface)来提供实现的灵active是非常有意义的。上面的例子仍然定义了哪种Collection必须分别使用s,分别允许哪些操作以及在某些情况下它应该如何表现(由于文档)。现在考虑实际上只有Collection的功能的情况。(甚至Iterable)接口(interface)需要使用类中的字段和Collection的种类实际上并不重要,或者我不想过度指定它。所以我选择例如HashSet作为实现并将该字段声明为Collecti

Java 枚举 : Implementing methods After Declaration?

考虑下面在枚举中实现方法的简单示例。这种方法的一个问题是,当您有很多枚举实例时,您无法再在视觉上将它们作为一个列表一次全部看到。也就是说,如果我们有很多玩具,我希望在一个长列表中一起看到“DOLL、SOLDIER、TEDDYBEAR、TRAIN、ETC”,然后在该列表之后我可以实现任何需要的方法,例如在枚举本身中是抽象的方法。有什么办法吗?或者您是否必须在声明各个枚举实例时实现这些方法,如下例所示?publicenumToy{DOLL(){@Overridepublicvoidexecute(){System.out.println("I'madoll.");}},SOLDIER(){

java - "Object[] x"和 "Object x[]"之间有什么区别吗?

我正在用Java更新遗留代码库,我发现了这样一行:Objectarg[]={newInteger(20),newInteger(22)};那一行引起了我的注意,因为我已经习惯了这种代码:Object[]arg={newInteger(20),newInteger(22)};数组的内容在这里并不重要。我很好奇变量名旁边的括号与类名旁边的括号。我在Eclipse(使用Java5)中尝试过,这两行都对编译器有效。这些声明之间有什么区别吗? 最佳答案 两者都是合法的,而且都有效。但建议将[]放在数组名称之前。来自Javadocs:Youca