网易首页 > 网易号 > 正文 申请入驻

老师,你确定注释不会被执行吗?

0
分享至

来源 | 沉默王二

责编 | Carol

头图 | CSDN 下载自 视觉中国

之前在 CSDN 上分享过一篇文章,涉及到 Java 中的注释,就信誓旦旦地写了一句话:“注释是不会被执行的!”结果,有小伙伴留言说,“老师,你确定吗?”

我这个人一直有个优点,就是能听得进去别人的声音,管你是赞美的还是批评的,从来都是虚心接受。因为我相信,大多数小伙伴都是出于善的目的。

况且,我在技术上从来没想过要成为多牛逼的大佬,就是喜欢分享的感觉,而已。很多文章中出现的错误,我都原封不动的保留,因为如果把修正了,那么留言中那些指出错误的人,在后来的读者眼里,就会觉得不合时宜。

那些 diss 我的小伙伴们,放心,我是不会介意的。

尽管如此,但对于注释这件事,真的是不能忍啊!注释肯定不会被执行啊,我想这位小伙伴一定是在讽刺我。于是我就私信问他为什么,然后他就甩给了我下面这段代码:

public class Test {
public static void main(String[] args) {
String name = "沉默王二";
// \u000dname="沉默王三";
System. out.println(name);
}
}

我拷贝到 IDEA 中跑了一下,结果程序输出的结果出乎我的意料:

沉默王三

竟然是王三,不是王二。看到这个结果,我算是彻底懵逼了。

那一刹那,我感觉这十来年的 Java 算是白学了。大学那会,老师说注释是不会执行的;就连《编程思想》里也说注释是不会执行的。那现在谁能告诉我这到底为什么?

不是说程序的世界很单纯吗?不是 0 就是 1?事情搞到这个地步,只能花心思好好研究一下了。

单纯从代码上来看,问题应该出在那串特殊的字符上——\u000d,如果不是它在作怪,把 name 的值由“沉默王二”修改为了“沉默王三”,就没有别的原因了——没别的,凭借多年的工作经验,找问题的根源我还是很得心应手的。

\u000d 虽然看上去比较陌生,但我知道它是一个 Unicode 字符。问了一下搜索引擎后,知道它代表一个换行符——一种恍然大悟的感觉啊。我知道,Java 编译器不仅会编译代码,还会解析 Unicode 字符。

我大致看了一眼上面这段代码编译后的字节码,它长下面这个样子:

// class version 58.65535 (-65478)
// access flags 0x21
public class com/cmower/dzone/secret/Test {

// compiled from: Test.java

// access flags 0x1
public ()V
L0
LINENUMBER 3 L0
ALOAD 0
INVOKESPECIAL java/lang/ Object. ()V
RETURN
L1
LOCALVARIABLE this Lcom/cmower/dzone/secret/Test; L0 L1 0
MAXSTACK = 1
MAXLOCALS = 1

// access flags 0x9
public static main([Ljava/lang/ String;)V
L0
LINENUMBER 5 L0
LDC "\u6c89\u9ed8\u738b\u4e8c"
ASTORE 1
L1
LINENUMBER 6 L1
LDC "\u6c89\u9ed8\u738b\u4e09"
ASTORE 1
L2
LINENUMBER 7 L2
GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
ALOAD 1
INVOKEVIRTUAL java/io/PrintStream.println (Ljava/lang/ String;)V
L3
LINENUMBER 8 L3
RETURN
L4
LOCALVARIABLE args [Ljava/lang/ String; L0 L4 0
LOCALVARIABLE name Ljava/lang/ String; L1 L4 1
MAXSTACK = 2
MAXLOCALS = 2
}

嗯,表示看不懂。不过没关系,把它反编译一下就行了,于是我看到下面这段代码:

public class Test {
public Test() {
}

public static void main(String[] args) {
String name = "沉默王二";
name = "沉默王三";
System. out.println(name);
}
}

咦,两个反斜杠 // 真的不见了,这可以确定一点——注释确实是不会执行的。只不过 \u000d 把 name="沉默王三"; 挤到了 // 注释的下一行,就好像下面这段代码的样子:

public class Test {
public static void main(String[] args) {
String name = "沉默王二";
//
name= "沉默王三";
System. out.println(name);
}
}

那这算不算是 Java 的 bug 呢?说算也不算。

因为通过允许 Java 源代码包含 Unicode 字符,可以确保在世界上任何一个区域编写的代码在其他地方执行。

老实说,这段话是我从网上找到,好像明白点啥,又好像不明白。那再来看一段代码:

double π = Math.PI;
System. out.println(\u03C0);

假如说程序员小王在创建周期率这个变量的时候,不知道 π 这个字符怎么敲出来,那么他就可以选择使用 \u03C0 来替代——编译器知道 \u03C0 就是 π 这个变量(编译器会在编译其他代码之前先解析 Unicode 字符)。

只能说 \u000d 是一种例外吧。

当然了,除非特殊情况,不要在源代码中包含 Unicode 字符,以免更改源代码的本意。

这篇文章没有别的意思,我也不想探究过于深奥的东西,纯粹是提高一下小伙伴们的认知:注释有可能被编译器执行。就好像,鲁迅如果不知道茴香豆的“茴”字有 4 种写法,那他就没办法让孔乙己在鲁镇的那家茶馆里装逼。

当然了,如果有小伙伴想体验一下装逼的感觉的话,可以把下面这段代码保存在一个名叫 Ugly.java 的文件中:

\u0063\u006c\u0061\u0073\u0073\u0020\u0055\u0067\u006c\u0079

\u007b\u0070\u0075\u0062\u006c\u0069\u0063\u0020\u0020\u0020

\u0020\u0020\u0020\u0020\u0073\u0074\u0061\u0074\u0069\u0063

\u0076\u006f\u0069\u0064\u0020\u006d\u0061\u0069\u006e\u0028

\u0053\u0074\u0072\u0069\u006e\u0067\u005b\u005d\u0020\u0020

\u0020\u0020\u0020\u0020\u0061\u0072\u0067\u0073\u0029\u007b

\u0053\u0079\u0073\u0074\u0065\u006d\u002e\u006f\u0075\u0074

\u002e\u0070\u0072\u0069\u006e\u0074\u006c\u006e\u0028\u0020

\u0022\u0048\u0065\u006c\u006c\u006f\u0020\u0077\u0022\u002b

\u0022\u006f\u0072\u006c\u0064\u0022\u0029\u003b\u007d\u007d

在命令行中先执行 javac Ugly.java,再执行 java Ugly 命令就可以看到程序结果了:

Hello world

体验过后,就拉到吧。反正写这样的代码谁也看不懂,除了机器。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
加拿大男篮世预赛23人大名单:SGA领衔,前广厦外援威尔哲在列

加拿大男篮世预赛23人大名单:SGA领衔,前广厦外援威尔哲在列

懂球帝
2026-06-02 10:31:22
省教育厅发文:高校横向科研项目普遍存在问题,倒查 3 年

省教育厅发文:高校横向科研项目普遍存在问题,倒查 3 年

生物学霸
2026-06-02 17:13:48
庆祝活动变成暴力现场,媒体社论直言国家“病了”,法国大规模骚乱引各方反思

庆祝活动变成暴力现场,媒体社论直言国家“病了”,法国大规模骚乱引各方反思

环球网资讯
2026-06-02 06:32:14
法网女单八强出炉!7位种子选手入围,淘汰郑钦文之人成最大黑马

法网女单八强出炉!7位种子选手入围,淘汰郑钦文之人成最大黑马

全景体育V
2026-06-02 05:23:58
美若天仙王楚然:肤白貌美,婀娜多姿。倾国倾城,美不胜收!

美若天仙王楚然:肤白貌美,婀娜多姿。倾国倾城,美不胜收!

十为先生
2026-05-09 15:19:03
美国展出文徵明89岁的行书,不愧是大才子,每个字都登峰造极!

美国展出文徵明89岁的行书,不愧是大才子,每个字都登峰造极!

书法网
2026-05-30 17:23:03
40多国离场,中方拒认裁决,菲防长回国前留下一句可笑的话

40多国离场,中方拒认裁决,菲防长回国前留下一句可笑的话

面包夹知识
2026-06-02 15:26:37
国乒也没料到,美国大满贯开赛之后,或许最先扛不住的,是孙颖莎

国乒也没料到,美国大满贯开赛之后,或许最先扛不住的,是孙颖莎

寒士之言本尊
2026-06-01 20:31:54
欧冠决赛惊现最孤独座位,哈维惊喜现身送温暖

欧冠决赛惊现最孤独座位,哈维惊喜现身送温暖

绿茵狂热者
2026-06-02 01:50:28
印度前驻华大使:边境和平时代终结,高消耗对峙,无力与中国抗衡

印度前驻华大使:边境和平时代终结,高消耗对峙,无力与中国抗衡

介知
2026-06-01 14:49:43
“崩老头”全链调查:1500元可购全套工具,视频、语音均能伪造身份

“崩老头”全链调查:1500元可购全套工具,视频、语音均能伪造身份

大象新闻
2026-06-01 16:54:53
NBA总决赛时间出炉!尼克斯抵达圣安东尼奥,马刺主场搭建完成

NBA总决赛时间出炉!尼克斯抵达圣安东尼奥,马刺主场搭建完成

薇说体育
2026-06-02 16:28:51
大暴雨、雷暴大风、冰雹!大范围强降水要来了

大暴雨、雷暴大风、冰雹!大范围强降水要来了

大象新闻
2026-06-02 11:55:05
下馆子千万别点这10道菜!全是预制菜“重灾区”,很多人天天在吃

下馆子千万别点这10道菜!全是预制菜“重灾区”,很多人天天在吃

房产衫哥
2026-05-31 14:01:04
李斌请到“高人”了

李斌请到“高人”了

虎嗅APP
2026-06-01 22:10:18
8888积分换一双Nike:麦当劳与球鞋联名改写了限量规则

8888积分换一双Nike:麦当劳与球鞋联名改写了限量规则

经济观察报
2026-06-01 17:02:23
ESPN:萨利巴周一将接受扫描,他参加世界杯的前景非常渺茫

ESPN:萨利巴周一将接受扫描,他参加世界杯的前景非常渺茫

懂球帝
2026-06-02 00:28:09
正式官宣!SGA领衔,12名NBA球员入选,“梦之队”最强对手诞生

正式官宣!SGA领衔,12名NBA球员入选,“梦之队”最强对手诞生

兵哥篮球故事
2026-06-02 15:26:52
广东佛山一女神好漂亮, 国色天姿,眉眼带笑 ,美的让人移不开

广东佛山一女神好漂亮, 国色天姿,眉眼带笑 ,美的让人移不开

TVB的四小花
2026-06-02 17:15:28
两个乌克兰姑娘,在广州找到了第二个家

两个乌克兰姑娘,在广州找到了第二个家

捣蛋窝
2026-06-02 13:25:06
2026-06-02 18:24:49
CSDN incentive-icons
CSDN
成就一亿技术人
26603文章数 242293关注度
往期回顾 全部

科技要闻

烧掉千亿后,美团、阿里、京东谁先止血?

头条要闻

商标被宣告无效 "壹号土猪"创始人:已向法院提起诉讼

头条要闻

商标被宣告无效 "壹号土猪"创始人:已向法院提起诉讼

体育要闻

1米74的业余联赛替补,在英超踢中卫

娱乐要闻

奚梦瑶何猷君补办婚礼超幸福

财经要闻

锂电“资源墙”高筑 全球性长期博弈开始

汽车要闻

星途神秘新车轮廓曝光 又一款性能SUV要来了?

态度原创

本地
手机
健康
公开课
军事航空

本地新闻

用剪纸的方式,打开江苏扬州

手机要闻

曝华为鸿蒙系统《王者荣耀》实况窗复活倒计时功能预计月底支持

干细胞临床研究向患者收费?别踩坑

公开课

李玫瑾:为什么性格比能力更重要?

军事要闻

伊朗媒体新发布最高领袖照片

无障碍浏览 进入关怀版