开始学Java之2 源代码和字节码 与 解析代码
具体内容看文章。。j
源代码与字节码
源代码(Source code)
字节码(Bytecode)
总的来说源代码是给人看的,字节码是给机器看的
在上一篇文章中,Hello.java 是源代码, Hello.class 是字节码
字节码是由源代码编译出来的
简单解析Hello World
第一行-类
上代码(Hello.java
):
1 | class Hello |
文件名字必须与类名相同,比如说上面的 class Hello *必须等于 *Hello.java(在Java,文件和文件名的大小写都很重要)
class Hello
第一行,定义了类名为Hello (类是程序的一部分,小的程序一般都只有一个类,后面会详细学到。。)编译源代码文件
Hello.java
后会出现一个字节码文件Hello.class
。所有代码在类里面都是在{}之中
1
2
3
4class Hello
{
//代码放这里(好吧我暂时不清楚注释是哪个,好像是这个)
}类,和文件名必须有英文字母和数字组成,第一个字符必须是字母,不能出现空格,类名一般都用大写字母开头(比如说这里的class Hello ,但是不强制要求。 源代码文件只能以.java结尾,并且都是小写字母
小问题
Q:Java程序第一行是 class AddUpNumbers
,源代码和字节码的文件名应该是什么?
A: AddUpNumbers.java 和 AddUpNumbers.class
第二行-大括号
- 所有东西都是在类的俩大括号{}之间(不知道咋描述。。。)
- 开始学Java,最好每个源代码文件仅放一个类,后面一个源代码文件可能包含多个类
第三行-文件开始处
public static void main ( String[] args )
显示了文件从哪里开始- 上面的
main
代表了这是“main method”(不知道咋翻译),也就是程序入口的意思 - https://www.cnblogs.com/cac2020/p/5049315.html (好奇熊)
问题:Java main方法为什么是 public static void main(String[] args)???
序号 | 场景 | 编译 | 运行 | 解释 |
---|---|---|---|---|
1 | public修改为private protected或者去掉 | 正常 | Main Method not public | 只有当main方法在公有级别上时才对JVM可见,所以需要使用public修饰 |
2 | 去掉static | 正常 | Exception in thread “main” java.lang.NoSuchMethodError:main | 如果要使main方法作为程序入口,不必要先去创建该类实例而是直接调用,所以该方法需要用static修饰 |
3 | 修改返回值类型 | 正常 | Exception in thread “main” java.lang.NoSuchMethodError:main | JVM对Java程序已经是最底层,由它调用的方法返回值没有任何地方可去,因此main方法不需要返回值,所以使用void修饰 |
4 | 修改参数类型或添加多个参数 | 正常 | Exception in thread “main” java.lang.NoSuchMethodError:main | main方法需要接收命令行传入的参数(参数之间使用空格分隔),java规范使用字符串数组作为main方法的唯一入参,参数名可以不是args,如果不穿参数,该数组是empty而不是null |
5 | 修改方法名 | 正常 | Exception in thread “main” java.lang.NoSuchMethodError:main | 含有main方法的类是Java应用程序,JVM只识别main作为程序入口,所以只能使用main作为方法名 |
6 | 添加throw Exception | 正常 | 正常 | main方法可以抛出异常 |
7 | public与static互换位置 | 正常 | 正常 |
小问题
Q:public static void main(String[] args)
能不能作为开始(也就是那些空格有没有关系)
A:没关系,编辑器显示正常,但是人看起来有点不舒服就是了。。
第五行-输出
重新给一下代码Hello.java
:
1 | class Hello |
这个程序的main method 由一行代码组成
System.out.println("Hello World!");
(←就是我)
这个语句将引号内的字符写入计算机系统的监视器(也就是输出到屏幕吧),不包括引号。
“Hello World!” 这部分叫String字符串(俺晓得),也就是字符”们“的序列
小问题
Q:Hello.java包含了程序例子,文件在硬盘 C:\Temp 文件夹里,想要运行这个程序,需要完成哪两件事?
A:1. 编译成Hello.class;2.用Java 解释器运行Hello.class
语法错误
这里是一个故意写错的程序
1 | Class Hello |
class “不小心”变成了 Class,这是一个 ”Syntax Error” ,也就是语法错误
语法错误(Syntax Error)是编程语言解释 “语法错误” (呃。。)时用的词语
小问题
怎么修改这个错误,并且运行文件
先把Class改成class,再编译,运行Hello.class
如果你修改了语法错误后忘记保存了,并且直接运行了程序,会发生什么?
你会编译旧的错误版本,并且得到相同错误信息,当你在用“记事本”软件,或者其他文本编辑器,你在修改main memory里的代码。Javac编译器会编译已经保存在硬盘上的文件
Bugs
上代码(我看不出来bug。。)
1 | class Hello |
一个程序成功编译与运行不等于这是正确的。举个栗子,上面的代码,这个代码
当一个代码编译时没有任何语法错误,但是并没有按照预期执行,这就叫有bug(快修快修)
小问题
这个程序编译时有没有错误
无
这个程序可以不可以运行
可以
这个程序跟Hello World要求相同不相同?(噢我知道为啥了,这是跟上面Hello World找不同,World 改成了 Neptune 。
不,这有bug(理直气壮)
长一点的程序例子
可以先写短一点的程序,这样更好找出语法错误和bugs;然后拼接成,或者再写长一点的程序
上代码:
1 | class Emily |
这个程序应该被命名为Emily.java,然后编译器会创建一个字符码为Emily.class
小问题
Q:这个程序会在显示器上写入啥?当他运行
A:每一个System.out.println
语句会输出引号内的字符
1 | A bird came down the walk: |
另一个例子
问题
一个很像Hello World的例子,但是 main method 有更多语句。
1 | class Haiku |
要输出:
On a withered branch
A crow has just alighted:
Nightfall in autumn.
答案
1 | class Haiku |
如果您一直在创建示例程序并编译和运行它们,您可能已经注意到程序中的空格和新行并不重要。(但是,不能将空格放在单词中间,引号内的空格很重要。)例如,以下版本的程序将正确编译,并在运行时执行完全相同的操作:
1 | class Haiku{ |
编译器“看不到”程序的二维外观,编译器将程序视为字符流,一个接一个。
无论如何,人对文字的布局很敏感,写代码保持整齐是很重要的,虽然最后一个乱七八糟的代码也能运行,但是看起来就秃头
小问题
Q:如果在这个布局不好的程序中有一个小错误,很容易找到吗?
A:不好找到,看起来一团糟,很容易错过一个错误的地方
注释
注释(Comment)是人类读者写的一个笔记,或者就是注释(呃。。)
在Java,注释由 //开始 ,跟在后面的文字会被编辑器忽略
上代码(呃。。)
1 | // Write three lines of a poem to the computer monitor |
加没加注释,运行起来都一个样儿,上方橙色(不知道你那里显示啥颜色)就是注释的颜色,大多数程序编辑器可以把不同代码变为不同的颜色,但是啥颜色都没关系,源代码文件不会有这些代码。。
小问题
Q:注释会不会包含在字节码文件内
A:不会,编译器会忽略注释
一堆注释
下代码(哈哈):
1 | class Haiku |
注释可以放在语句的后面,来解释这是干啥的,所有注释都是在//后面的,注释前面的语句不会被注释影响到
小问题
Q:有没有可能写一大段注释
A:有可能
多行注释
来,代码!(shua~):
1 | /* Program 1 |
/* 和 */ 之间的所有字符,都会被编辑器忽略(也就是全都是注释的意思)
/ 和 * 中间不能有任何字符
/* 和 */ 中间可能隔着好几行
小问题
Q:你为啥要用注释帮助别人了解你的程序
A:这人可能是你,注释经常告诉你这是啥,或者为啥你用这个方法做了一些事情(呃。。就是那个意思)
大括号
还有一个要注意的地方,就是每一个左大括号{都会跟着一个右大括号}
一般大括号都会像套娃一样,一套包着一套,举例子
1 | class Haiku |
这样排版可以让人读起来舒服,和有逻辑一些
结束
不止有{},还有()和[]
大程序有一对上面的括号,用来组成程序的不同部分
1 | class Haiku |