Tag: 语言function

Java语言规范 – 无法理解’BlockStatement’

我一直在这里检查Java语言规范(相反,我应该喝啤酒),我很好奇一个方法可以包含什么。 规范声明方法体可以包含块 MethodBody: Block ‘Block’包含’BlockStatements’的地方。 ‘BlockStatement’规则如下所示: BlockStatement : LocalVariableDeclarationStatement ClassOrInterfaceDeclaration [Identifier :] Statement 我可以理解’LocalVariableDeclarationStatement’ [final] int x, y, z; 但是,我不明白为什么 ‘ClassOrInterfaceDeclaration’规则存在。 此规则如下所示: ClassOrInterfaceDeclaration: ModifiersOpt (ClassDeclaration | InterfaceDeclaration) ClassDeclaration: class Identifier [extends Type] [implements TypeList] ClassBody InterfaceDeclaration: interface Identifier [extends TypeList] InterfaceBody 这里发生了什么 – 你肯定不能在一个块中声明一个类或接口? 有人可以帮助解释这种混乱吗? 更新 :我可以在方法中定义一个类,但以下方法不起作用: public class Foo { public void doFoo() { […]

在java 1.8中的接口中添加静态方法

我们知道在java 1.8接口中允许使用静态方法,我已经看到了一些答案,比如jdk 1 8接口中定义的静态方法,为什么他们需要这样做 但我不满意。 此外,我认为它可能会导致以下问题: public interface MyInterface{ public static void myMethod(); } class MyClass{ MyInterface.myMethod(); // since myMethod is static but a huge error is waiting for us here ? } 但我仍然认为有一种方法可以解决这个问题,因为这是由专业人士添加的 ,所以任何人都可以解释一下oracle如何解决这个问题以及需要添加它的是什么? 谢谢你。 我没有使用java 1.8所以我从来不知道java中的静态方法需要定义而不仅仅是声明 ,我总是把接口看作是一个纯抽象类我认为这就是为什么定义一个方法的想法对我来说似乎很奇怪。 谢谢您的帮助 ! 。

为什么op-assign运算符在java中不安全?

我不确定问题的措辞是否明确,但一个例子会更清晰。 我发现它在Java中不起作用: int a = …; a = 5.0; 但这会: int a = …; a += 5.0; 即,似乎=运算符是类型安全的,但+ =不是。 这有什么深刻的理由,还是设计师必须采用的另一种任意决策语言。

Java声明断了吗?

在探讨问题时,我最近在Java中发现了assert关键字。 起初,我很兴奋。 我还不知道有用的东西! 一种更有效的方法来检查输入参数的有效性! 耶老师! 但后来我仔细研究了一下,我的热情并没有像一个简单的事实那样“完全被扼杀”而变得“脾气暴躁”:你可以关闭断言。* 这听起来像是一场噩梦。 如果我断言如果输入listOfStuff为null ,我不希望代码继续运行,为什么我想要忽略该断言呢? 听起来好像我正在调试一段生产代码并怀疑listOfStuff可能错误地传递了null但是没有看到任何触发该断言的日志文件证据,我不能相信listOfStuff实际上已经发送了一个有效的值; 我还必须考虑断言可能完全被关闭的可能性。 这假设我是调试代码的人。 不熟悉断言的人可能会看到并且(非常合理地)假设如果断言消息没有出现在日志中,则listOfStuff可能不是问题。 如果你第一次遇到assert是在野外,你甚至会发现它可以完全被关闭吗? 毕竟,它不像是一个允许你禁用try / catch块的命令行选项。 所有这些都让我想到了我的问题(这是一个问题,而不是一个咆哮的借口!我保证!): 我错过了什么? 是否有一些细微差别使得Java的assert实现远比我给它的功劳更有用? 在某些情况下,从命令行启用/禁用它的能力实际上是非常有价值的吗? 当我设想在生产代码中使用它来代替if (listOfStuff == null) barf();等语句时,我是否误解了它if (listOfStuff == null) barf(); ? 我觉得这里有一些重要的东西,我没有得到。 *好的,从技术上讲,它们实际上是默认关闭的; 你必须不遗余力地打开它们。 但是,你仍然可以完全击败他们。 编辑:启蒙要求,启示收到。 assert首先是一个调试工具的概念需要很长时间才能使它对我有意义。 我仍然认为应该在生产环境中禁用输入检查非平凡私有方法的概念,因为开发人员认为不可能输入错误。 根据我的经验,成熟的生产代码是一种疯狂的,庞大的东西,多年来由具有不同技能的人们开发,其目标是快速变化的不同程度的理智要求。 即使糟糕的输入确实是不可能的,从现在起六个月后的一段邋maintenance的维护编码也可以改变这一点。 提供的链接gustafc (谢谢!)包括这个例子: assert interval > 0 && interval <= 1000/MAX_REFRESH_RATE : interval; 禁用如此简单的生产检查让我感到愚蠢乐观。 然而,这是编码哲学的差异,而不是破碎的特征。 另外,我绝对可以看到这样的价值: […]

java部分类

小序言。 我是1.4 jdk的优秀java开发人员。 在它之后,我已经切换到另一个平台,但在这里我遇到问题所以问题强烈关于jdk 1.6(或更高:))。 我有3个耦合类,与本机方法有关的耦合性质。 贝娄是这三class的榜样 public interface A { public void method(); } final class AOperations { static native method(. . .); } public class AImpl implements A { @Override public void method(){ AOperations.method( . . . ); } } 所以有接口A,由AOperations以本机方式实现,而AImpl只是将方法调用委托给本机方法。 这些关系是自动生成的。 一切都好,但我有问题。 有时像A这样的接口需要暴露迭代器function。 我可以影响接口,但不能改变实现(AImpl)。 在C#中说我可以通过简单的部分解决问题:(C#sample) partial class AImpl{ … //here comes auto […]

是否使用+串联创建的字符串存储在字符串池中?

例如 String s = “Hello” + ” World”; 我知道池中有两个字符串“Hello”和“World”但是,“Hello World”进入字符串池吗? 如果是这样,怎么样? String s2 = new String(“Hola”) + new String(” Mundo”); 每种情况下池中有多少个字符串?