学员作品 学员心得 技术园地 潮人地 Android(安卓)培训 杭州电脑(计算机)培训 杭州网络营销培训杭州JAVA培训
返回首页
当前位置: 主页 > 学员天地 > 杭州JAVA培训 >

关于java你不知道的这几件事?

时间:2017-08-04 11:37来源:未知 作者:杭州华育 点击:
关于java你不知道的这几件事? 在Java发布的时候就开始使用了吗?还 记得那时它叫Oak,面向对象也 (Object Oriented, OO )还 是个热门话题, C++ 程序员们觉得 Java 不可能有机会成功 ,Applet的出现也是一件新鲜大事? 下面这些文章至少一半的内容估计不

                           关于java你不知道的这几件事?

在Java发布的时候就开始使用了吗?还记得那时它叫“Oak”,面向对象也 (Object Oriented, OO )还

是个热门话题,C++ 程序员们觉得 Java 不可能有机会成功,Applet的出现也是一件新鲜大事?

下面这些文章至少一半的内容估计不少人都不清楚,让我们来看看令人意外惊喜的java细节吧。

1. 受检异常(checked exception)这件事是不存在的

异常检查被公认为是个错误,正如 Brue Eckel 在布拉格的 GeeCON 大会上的闭幕词中所说, Java 后的其

他语言都不再使用异常检查了,就连 Java 8 都不愿在新的 Stream API 中使用它了(当你在 lambda 表达

式中使用 IO 或者 JDBC 时,是很痛苦的)。

是这样的,JVM 完全不知道这件事,都是Java语言做的。

你想要证明 JVM 知不知道异常检查这件事吗?看这些代码可以;

JAVA语言代码
这个不仅会编译,还会抛出 SQLException ,甚至都需要 Lombok 的 @SneakyThrows 标签。

2 不同的返回值类型来重载的方法
 
下面这些代码是编译过不去的,对吧?


java语言代码

是的,Java 不允许在一个类中通过不同的返回值类型和异常语句来重载方法。

不过稍等,Java 文档中关于 Class.getMethod(String, Class…) 这样写道:

请注意,在一个分类中又很多匹配的方式,虽然 Java 语法规则禁止一个类中存在多个方法函数签

相同仅仅返回类型不同,但 JVM 允许。这样提高了 JVM 的灵活性以实现各种语言特性。例如,可以

用桥接方法(bridge method)来实现方法的协变返回类型,桥接方法和被重载的方法可以有相同的函

数签名和不同的返回值类型。

这种说法是合理的;事实证明。下图;


JAVA语言代码
child类编译后的字节码是这样呈现出来的;

JAVA语言代码

图中有T字节码就是object,这个不难理解;
 
合成桥接方法是编译器自动生成的,因为 Parent.x() 签名的返回值类型被认为是 Object。如果没有这样
 
的桥接方法是无法在兼容二进制的前提下支持泛型的。因此,修改 JVM 是实现这个特性最简单的方法了
 
(同时实现了协变式覆盖)。这个方法不错吧。
 
你搞明白了java语言的内部特行了吗?这里有更多细节;
 
3 下面的代码都是二维数组

java语言代码
有没有觉的很惊喜?假如使用 JSR-308 / Java 8 类型注解的话,语句的数量会呈现爆炸式增长的!

java语言代码
类型注解,它的诡异性只是被他强大的功能掩盖了。
 
换一种方式表达;
 
当在4周假期之前的最后一次代码提交中这么做的话;look!
 
JAVA语言代码
4 你懂条件表达式吗
 
你以为你很了解条件表达式吗?我告诉你,不是的。大多数人会认为下面的两个代码片段是等效的:
Object o1 = true ? new Integer(1) : new Double(2.0);

这个和下面的等效吗?

Object o2;
 
if (true)
    o2 = new Integer(1);
else
    o2 = new Double(2.0);

揭秘,并非如此,检测一下;

System.out.println(o1);
System.out.println(o2);

程序的输出是这样的;
1.0
1

是的,在确实有必要的情况下,条件表达式会升级数字类型,你认为这样的程序会抛出一个空指针吗?
 
Integer i = new Integer(1);
if (i.equals(1))
    i = null;
Double d = new Double(2.0);
Object o = true ? i : d; // NullPointerException!
System.out.println(o);

更多精彩的细节请看这里?
 

5 请问 你懂复合赋值运算符吗?
 

很奇怪吗?我们来看下两段代码;
i += j;
i = i + j;
主观上认为他们是等价的吧!其实不是的!java语言规范的写法(Java Language Standard,
 
JLS)里这样写道:

和符合赋值表达的方式 E1 op= E2 与 E1 = (T)((E1) op (E2)) 是等价的,这里  E1 的类型,期
 
 E1 只被求值一次。

很带劲吧,我想引用 Peter Lawrey 在 Stack Overflow 上回复
 
这种形状转换很好的一个例子是是用了*= or /=

byte b = 10;
b *= 5.7;
System.out.println(b); // prints 57

或;

byte b = 100;
b /= 2.5;
System.out.println(b); // prints 40

又或;

char ch = 'A';
ch *= 1.5;
System.out.println(ch); // prints 'a'


这个是不是很有用?要把它运用到程序里。原因你懂得!

文章来自杭州java培训机构
(责任编辑:杭州华育 ;杭州java培训,网络营销培训,杭州计算机培训,it培训,详询客服报名咨询
分享到:
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
提交报名信息

2017年杭州将加大力度经济转型,吸纳更多的技术人才落户杭州,软件人才需求量更是大幅提升,针对目前杭州IT行业人才需求“井喷”现象,华育软件杭州实训基地与杭州155家IT名企合作,建立人才培养与输送关系,启动“Eduask国家高端IT紧缺人才培养工程”。7月针对杭州地区18-28岁大中专生待业青年发放68个技能实训名额(应届大中专毕业生优先),经短期专业岗前实训后推荐进入企业,起薪4500-8000元,五险一金。

姓名: * 性别:
学历: 电话: *
所在地: *
您目前状况:
留言:
*
推荐内容