很多朋友想靠Java进阶视频来帮助自己突破瓶颈,没问题,千锋教育的视频就不错。不信?千锋杭州Java程序培训老师带你了解这些技术细节?
1.没有检查过的异常
那就对了! JVM不知道任何这样的事情,只有Java语言。
今天,大家都同意检查异常是一个错误。 AsBruce Eckel在布拉格GeeCON闭幕主题演讲中表示,Java在使用已检查的异常之后没有其他语言,甚至Java 8也不再支持它们在新的Streams API中(这实际上可能有点痛苦,当 你的lambdas使用IO或JDBC)。
你想证明JVM不知道这样的事情吗? 试试下面的代码:
这不仅是编译,这实际上也抛出SQLException。
2.你可以让方法重载仅在返回类型中有所不同
这不会编译,对吧?
对。 Java语言不允许两个方法在同一个类中被“重写 - 等价”,而不管它们可能有不同的Throws型或返回类型。
但等一下。查看Javadoc ofClass.getMethod(String,Class ...)。 它写道:
请注意,类中可能有多个匹配方法,因为虽然Java语言禁止类声明具有相同签名但返回类型不同的多个方法,但Java虚拟机不会。虚拟机中增加的灵活性可用于实现各种语言功能。 例如,协变回报可以用桥接方法来实现; 桥接方法和被覆盖的方法将具有相同的签名但不同的返回类型。
原文:
Note that there may be more than one matching method in a class because while the Java language forbids a class to declare multiple methods with the same signature but different return types, the Java virtual machine does not. This increased flexibility in the virtual machine can be used to implement various language features. For example, covariant returns can be implemented with bridge methods; the bridge method and the method being overridden would have the same signature but different return types.
哇,是的,这是有道理的。事实上,当你编写以下代码时,会发生这种情况:
检查Child中生成的字节码:
所以,Tis真的只是对象的字节码。 这很好理解。
合成桥接方法实际上是由编译器生成的,因为在特定的呼叫站点上,可能预期toParent.x()签名的返回类型为Object。 在没有这种桥接方法的情况下添加泛型将不可能以二进制兼容的方式进行。所以,改变JVM以允许此功能是较小的痛苦(这也允许协变覆盖作为副作用...)聪明,是吧?
3.所有这些都是二维数组!
对,是真的。即使你的心理分析器不能立即理解上述方法的返回类型,它们也是一样的! 类似于下面的一段代码:
你觉得那很疯狂?想象一下在上面使用JSR-308 / Java 8类型注释。 句法可能性的数量爆炸!
4.你没有得到条件表达式
那么,当你使用条件表达式时,你认为你知道吗?让千锋老师告诉你,你没有。 你们大多数人会认为下面的两个片段是相同的:
...与此相同?
不。让千锋老师们进行一个快 速测试。
这个计划将打印:
1.01
是的!如果“需要”,条件运算符将实现数字类型提升,并在该“需要”上引用一组非常非常强大的引号。 因为,你会期望这个程序抛出一个NullPointerException吗?
5.你也没有得到复合赋值操作符
有什么古怪呢?千锋老师们来考虑以下两段代码:
直观地说,它们应该是等价的,对吗?但猜猜怎么了。 他们不是! JLS规定:E1 op = E2形式的复合赋值表达式等价于E1 =(T)((E1)op(E2)),其中T是E1的类型,只是E1只计算一次。
这是如此的......,千锋老师想引用Peter Lawrey的这个堆栈溢出问题:演员很好的例子是使用* =或/ =
或者
或者
或者
多精彩,仅仅在:千锋Java视频教程平台:http://video.mobiletrain.org/java/
相关文章
了解千锋动态
关注千锋教育服务号
扫码关注千锋互联
身边的移动开发导师