Java的隐藏特征?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (10)
  • 关注 (0)
  • 查看 (112)

阅读C#的隐藏特征后我想知道,Java的一些隐藏特性是什么?

提问于
用户回答回答于

在枚举中允许方法和构造函数让我感到惊讶。 例如:

enum Cats {

FELIX(2), SHEEBA(3), RUFUS(7);

private int mAge;

Cats(int age) {

mAge = age;

}

public int getAge() {

return mAge;

}

}

你甚至可以有一个“常量特定的类体”,它允许一个特定的枚举值来覆盖方法。

用户回答回答于

在finally块中传输控制权将抛出任何异常。 下面的代码不会抛出RuntimeException - 它会丢失。

public static void doSomething() {

try {

//Normally you would have code that doesn't explicitly appear

//to throw exceptions so it would be harder to see the problem.

throw new RuntimeException();

} finally {

return;

}

}

来自 http://jamesjava.blogspot.com/2006/03/dont-return-in-finally-clause.html

用户回答回答于

还没有见过任何人提到instanceof正在执行的方式,检查null是没有必要的。

而不是:

if( null != aObject && aObject instanceof String )
{
    ...
}

只需使用:

if( aObject instanceof String )
{
    ...
}
用户回答回答于

从JDK 1.5开始,协变式返回类型如何呢? 这是相当不好的宣传,因为这是一个不合理的补充,但据我所知,是泛型工作绝对必要的。

实际上,编译器现在允许一个子类将重写的方法的返回类型缩小为原始方法的返回类型的子类。 所以这是允许的:

class Souper {
    Collection<String> values() {
        ...
    }
}

class ThreadSafeSortedSub extends Souper {
    @Override
    ConcurrentSkipListSet<String> values() {
        ...
    }
}

您可以调用子类的values方法并获得排序线程安全。SetString而不必被淘汰ConcurrentSkipListSet...

用户回答回答于

对于我为Java开发人员采访的大多数人来说,标记块是非常令人惊讶的。 这里是一个例子:

// code goes here

getmeout:{
    for (int i = 0; i < N; ++i) {
        for (int j = i; j < N; ++j) {
            for (int k = j; k < N; ++k) {
                //do something here
                break getmeout;
            }
        }
    }
}

谁说goto在java中只是一个关键字?*)

用户回答回答于

自Java 6以来的Classpath通配符。

java -classpath ./lib/* so.Main

另一种方法

java -classpath ./lib/log4j.jar:./lib/commons-codec.jar:./lib/commons-httpclient.jar:./lib/commons-collections.jar:./lib/myApp.jar so.Main

http://java.sun.com/javase/6/docs/tech/tools/windows/classpath.html

用户回答回答于

JDK 1.6_07 +包含一个名为VisualVM(bin / jvisualvm.exe)的应用程序,它是许多工具的一个很好的GUI。 看起来比JConsole更全面。

用户回答回答于

前几天我对实例初始化器感到惊讶。我删除了一些代码折叠的方法,最后创建了多个实例初始化器:

public class App {
    public App(String name) { System.out.println(name + "'s constructor called"); }

    static { System.out.println("static initializer called"); }

    { System.out.println("instance initializer called"); }

    static { System.out.println("static initializer2 called"); }

    { System.out.println("instance initializer2 called"); }

    public static void main( String[] args ) {
        new App("one");
        new App("two");
  }
}

执行main方法将显示:

static initializer called
static initializer2 called
instance initializer called
instance initializer2 called
one's constructor called
instance initializer called
instance initializer2 called
two's constructor called

我想如果您有多个构造函数,并且需要通用代码,这将是有用的。

它们还为初始化类提供了语法糖:

List<Integer> numbers = new ArrayList<Integer>(){{ add(1); add(2); }};

Map<String,String> codes = new HashMap<String,String>(){{ 
  put("1","one"); 
  put("2","two");
}};
用户回答回答于

联合类型参数方差:

public class Baz<T extends Foo & Bar> {}

例如,如果您想要采用Comparable和Collection两个参数:

public static <A, B extends Collection<A> & Comparable<B>>
boolean foo(B b1, B b2, A a) {
   return (b1.compareTo(b2) == 0) || b1.contains(a) || b2.contains(a);
}

如果给定的两个集合是相等的,或者它们中的任何一个包含给定的元素,则此方法返回true,否则返回false。 需要注意的是,您可以在参数b1和b2上调用Comparable和Collection的方法。

用户回答回答于

双支撑初始化在几个月前让我吃了一惊,当时我第一次发现它,从来没有听说过它。

线迹通常并不是广为人知的存储每个线程状态的方法。

由于jdk 1.5 java拥有非常好的实现和强大的并发工具,而不仅仅是锁,所以它们存在于java.util.并发一个特别有趣的例子是java.util.concurrent.原子子包,该包包含实现比较和交换操作,并可以映射到这些操作的实际本机硬件支持的版本。

扫码关注云+社区

领取腾讯云代金券