Tag: jls

在并发代码中返回赋值运算符的值

鉴于以下课程: class Foo { public volatile int number; public int method1() { int ret = number = 1; return ret; } public int method2() { int ret = number = 2; return ret; } } 并给予多个线程在同一个Foo实例上同时调用method1()和method2() ,那么对method1()的调用是否会返回除1之外的任何内容?

Java类名的区分大小写

如果在不同的目录中写入两个具有相同大小写不敏感的公共Java类,那么这两个类在运行时就不可用。 (我在Windows,Mac和Linux上用HotSpot JVM的几个版本testing过,如果有其他的JVM在同一时间使用,我不会感到惊讶)。例如,如果我创build一个名为a A类, : // lowercase/src/testcase/a.java package testcase; public class a { public static String myCase() { return "lower"; } } // uppercase/src/testcase/A.java package testcase; public class A { public static String myCase() { return "upper"; } } 包含上面代码的三个eclipse项目可以从我的网站上获得 。 如果尝试我这样调用两个类的myCase : System.out.println(A.myCase()); System.out.println(a.myCase()); typechecker成功,但是当我直接运行上面的代码生成的类文件时,我得到: 线程“main”中的exceptionjava.lang.NoClassDefFoundError:testcase / A(错误名称:testcase / a) 在Java中,名称通常是区分大小写的。 一些文件系统(如Windows)不区分大小写,所以我不惊讶上述行为发生,但似乎是错误的 。 不幸的是,Java规范很奇怪,不能确定哪些类是可见的。 […]

Java中参数执行顺序的保证?

在C给出以下函数调用: fooFunc( barFunc(), bazFunc() ); 没有指定barFunc和BazFunc的执行顺序,因此可以在C barFunc()之前的bazFunc()或bazFunc()之前barFunc() 。 Java是否指定了函数参数expression式的执行顺序,还是像C那样未指定?

为什么Java在编译时绑定variables?

考虑下面的示例代码 class MyClass { public String var = "base"; public void printVar() { System.out.println(var); } } class MyDerivedClass extends MyClass { public String var = "derived"; public void printVar() { System.out.println(var); } } public class Binding { public static void main(String[] args) { MyClass base = new MyClass(); MyClass derived = new MyDerivedClass(); System.out.println(base.var); System.out.println(derived.var); […]

为什么Interfaces中没有静态方法,但静态字段和内部类可以吗?

为什么不能在接口中定义静态方法,这里有几个问题,但是没有一个解决基本的不一致:为什么你可以在一个接口中定义静态字段和静态内部types,而不是静态方法? 静态的内部types可能不是一个公平的比较,因为这只是语法糖产生一个新的类,但为什么字段,而不是方法? 在接口中反对静态方法的一个参数是它打破了JVM使用的虚拟表格parsing策略,但不应该同样适用于静态字段,也就是说,编译器可以内联它吗? 一致性是我所希望的,Java应该在界面中不支持任何forms的静态,或者它应该是一致的,并允许它们。

为什么Integer.MAX_VALUE + 1 == Integer.MIN_VALUE?

System.out.println(Integer.MAX_VALUE + 1 == Integer.MIN_VALUE); 是真的。 我知道在Java中的整数是32位,不能超过2 ^ 31-1,但我不明白为什么加1到MAX_VALUE结果在MIN_VALUE而不是某种exception。 没有提到像透明转换到更大的types,就像Ruby一样。 这种行为指定的地方? 我可以依靠吗?

Lambdaexpression式和方法重载疑惑

好的,所以方法重载是一件坏事。 现在,这已经解决了,让我们假设我真的想重载像这样的方法: static void run(Consumer<Integer> consumer) { System.out.println("consumer"); } static void run(Function<Integer, Integer> function) { System.out.println("function"); } 在Java 7中,我可以用非歧义的匿名类作为参数轻松地调用它们: run(new Consumer<Integer>() { public void accept(Integer integer) {} }); run(new Function<Integer, Integer>() { public Integer apply(Integer o) { return 1; } }); 现在在Java 8中,我想用lambdaexpression式来调用这些方法,我可以! // Consumer run((Integer i) -> {}); // Function run((Integer i) -> 1); […]

如何创build一个已知types的类文字:Class <List <String >>

采取以下措施: public Class<List<String>> getObjectType() { // what can I return here? } 什么类字面expression式可以从这个方法返回,这将满足generics和编译? List.class不会编译, List.<String>class也不会。 如果你想知道“为什么”,我正在写一个Spring的FactoryBean<List<String>> ,它需要我实现Class<List<String>> getObjectType() 。 但是,这不是一个spring的问题。 编辑:我的哀号已经被SpringSource的权力所听到,所以Spring 3.0.1将getObjectType()的返回types更改为Class<?> ,这很好地避免了这个问题。