main方法尝试访问var,但会导致调用模糊.为什么?无论如何,无法从静态上下文访问(可见?)Base1中的实例变量var.
class Base1 {
int var;
}
interface Base2 {
public static final int var = 0;
}
class Test extends Base1 implements Base2 {
public static void main(String args[]) {
System.out.println("var:" + var);
}
}
Run Code Online (Sandbox Code Playgroud) class A {}
class B extends A {}
class Holder<T> {
T object;
Holder(T object) {
this.object = object;
}
}
Run Code Online (Sandbox Code Playgroud)
有一个Holder类来保存一些使用泛型创建的对象.在main()中,当使用菱形运算符初始化时,它不会编译(Java 7),派生类传递给Holder的构造函数(需要A /找到B):
public static void main(String[] args) {
Holder<A> holder = new Holder<>(new B());
}
Run Code Online (Sandbox Code Playgroud)
但是,如果在右侧部分指定了基本类型,它将编译并运行:
public static void main(String[] args) {
Holder<A> holder = new Holder<A>(new B());
}
Run Code Online (Sandbox Code Playgroud)
为什么?钻石操作员是否使用与左侧相同的类型参数定义赋值的右侧部分?
下面是一个简单的示例,该方法不使用同步并导致数据竞争及其"改进"版本没有此问题
class Counter {
public static long count = 0;
}
class UseCounter implements Runnable {
public static void increment() {
Counter.count++;
System.out.print(Counter.count + " ");
}
public void run() {
increment();
increment();
increment();
}
}
class SynchronizedUseCounter implements Runnable {
public static synchronized void increment() {
Counter.count++;
System.out.print(Counter.count + " ");
}
public void run() {
increment();
increment();
increment();
}
}
public class DataRaces {
public static void main(String[] args) {
UseCounter c = new UseCounter();
Thread t1 = …Run Code Online (Sandbox Code Playgroud)