开始学Java之2 源代码和字节码 与 解析代码

具体内容看文章。。j

源代码与字节码

源代码(Source code)

字节码(Bytecode)

总的来说源代码是给人看的,字节码是给机器看的

在上一篇文章中,Hello.java 是源代码, Hello.class 是字节码

字节码是由源代码编译出来的

简单解析Hello World

第一行-类

上代码(Hello.java):

1
2
3
4
5
6
7
class Hello 
{
public static void main ( String[] args )
{
System.out.println("Hello World!");
}
}
  1. 文件名字必须与类名相同,比如说上面的 class Hello *必须等于 *Hello.java(在Java,文件和文件名的大小写都很重要)

  2. class Hello 第一行,定义了类名为Hello (类是程序的一部分,小的程序一般都只有一个类,后面会详细学到。。)

  3. 编译源代码文件 Hello.java 后会出现一个字节码文件 Hello.class

  4. 所有代码在类里面都是在{}之中

    1
    2
    3
    4
    class Hello 
    {
    //代码放这里(好吧我暂时不清楚注释是哪个,好像是这个)
    }
  5. 类,和文件名必须有英文字母和数字组成,第一个字符必须是字母,不能出现空格,类名一般都用大写字母开头(比如说这里的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
2
3
4
5
6
7
class Hello 
{
public static void main ( String[] args )
{
System.out.println("Hello World!"); //看这行
}
}

这个程序的main method 由一行代码组成

System.out.println("Hello World!"); (←就是我)

这个语句将引号内的字符写入计算机系统的监视器(也就是输出到屏幕吧),不包括引号。

“Hello World!” 这部分叫String字符串(俺晓得),也就是字符”们“的序列

小问题

Q:Hello.java包含了程序例子,文件在硬盘 C:\Temp 文件夹里,想要运行这个程序,需要完成哪两件事?

A:1. 编译成Hello.class;2.用Java 解释器运行Hello.class

语法错误

这里是一个故意写错的程序

1
2
3
4
5
6
7
Class Hello
{
public static void main ( String[] args )
{
System.out.println("Hello World!");
}
}

class “不小心”变成了 Class,这是一个 ”Syntax Error” ,也就是语法错误

语法错误(Syntax Error)是编程语言解释 “语法错误” (呃。。)时用的词语

小问题

  1. 怎么修改这个错误,并且运行文件

    先把Class改成class,再编译,运行Hello.class

  2. 如果你修改了语法错误后忘记保存了,并且直接运行了程序,会发生什么?

    你会编译旧的错误版本,并且得到相同错误信息,当你在用“记事本”软件,或者其他文本编辑器,你在修改main memory里的代码。Javac编译器会编译已经保存在硬盘上的文件

Bugs

上代码(我看不出来bug。。)

1
2
3
4
5
6
7
class Hello
{
public static void main ( String[] args )
{
System.out.println("Hello Neptune!");
}
}

一个程序成功编译与运行不等于这是正确的。举个栗子,上面的代码,这个代码

当一个代码编译时没有任何语法错误,但是并没有按照预期执行,这就叫有bug(快修快修)

小问题

  1. 这个程序编译时有没有错误

  2. 这个程序可以不可以运行

    可以

  3. 这个程序跟Hello World要求相同不相同?(噢我知道为啥了,这是跟上面Hello World找不同,World 改成了 Neptune 。

    不,这有bug(理直气壮)

长一点的程序例子

可以先写短一点的程序,这样更好找出语法错误和bugs;然后拼接成,或者再写长一点的程序

上代码:

1
2
3
4
5
6
7
8
9
10
class Emily 
{
public static void main ( String[] args )
{
System.out.println("A bird came down the walk:");
System.out.println("He did not know I saw;");
System.out.println("He bit an angle-worm in halves");
System.out.println("And ate the fellow, raw.");
}
}

这个程序应该被命名为Emily.java,然后编译器会创建一个字符码为Emily.class

小问题

Q:这个程序会在显示器上写入啥?当他运行

A:每一个System.out.println 语句会输出引号内的字符

1
2
3
4
A bird came down the walk:
He did not know I saw;
He bit an angle-worm in halves
And ate the fellow, raw.

另一个例子

问题

一个很像Hello World的例子,但是 main method 有更多语句。

1
2
3
4
5
6
7
8
class Haiku 
{
public static void main ( String[] args )
{
System.out.println(_______________________________);
System.out.println(_______________________________);
System.out.println(_______________________________);
}

要输出:

On a withered branch
A crow has just alighted:
Nightfall in autumn.

答案

1
2
3
4
5
6
7
8
class Haiku 
{
public static void main ( String[] args )
{
System.out.println("On a withered branch");
System.out.println("A crow has just alighted:");
System.out.println("Nightfall in autumn.");
}

如果您一直在创建示例程序并编译和运行它们,您可能已经注意到程序中的空格和新行并不重要。(但是,不能将空格放在单词中间,引号内的空格很重要。)例如,以下版本的程序将正确编译,并在运行时执行完全相同的操作:

1
2
3
4
5
6
7
class                Haiku{
public static void main(String[] args )
{
System.out. println( "On a withered branch");
System . out.println("A crow has just alighted:" );
System.out.println("Nightfall in autumn.");
}}

编译器“看不到”程序的二维外观,编译器将程序视为字符流,一个接一个。

无论如何,人对文字的布局很敏感,写代码保持整齐是很重要的,虽然最后一个乱七八糟的代码也能运行,但是看起来就秃头

小问题

Q:如果在这个布局不好的程序中有一个小错误,很容易找到吗?

A:不好找到,看起来一团糟,很容易错过一个错误的地方

注释

注释(Comment)是人类读者写的一个笔记,或者就是注释(呃。。)

在Java,注释由 //开始 ,跟在后面的文字会被编辑器忽略

上代码(呃。。)

1
2
3
4
5
6
7
8
9
10
// Write three lines of a poem to the computer monitor
class Haiku
{
public static void main ( String[] args )
{
System.out.println("On a withered branch" );
System.out.println("A crow has just alighted:");
System.out.println("Nightfall in autumn.");
}
}

加没加注释,运行起来都一个样儿,上方橙色(不知道你那里显示啥颜色)就是注释的颜色,大多数程序编辑器可以把不同代码变为不同的颜色,但是啥颜色都没关系,源代码文件不会有这些代码。。

小问题

Q:注释会不会包含在字节码文件内

A:不会,编译器会忽略注释

一堆注释

下代码(哈哈):

1
2
3
4
5
6
7
8
9
class Haiku 
{
public static void main ( String[] args )
{
System.out.println("On a withered branch" ); // Write first line of the poem
System.out.println("A crow has just alighted:"); // Write 2nd line of the poem
System.out.println("Nightfall in autumn."); // Write 3rd line of the poem
}
}

注释可以放在语句的后面,来解释这是干啥的,所有注释都是在//后面的,注释前面的语句不会被注释影响到

小问题

Q:有没有可能写一大段注释

A:有可能

多行注释

来,代码!(shua~):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/* Program 1 
Write out three lines of a poem.
The poem describes a single moment in time,
using 17 syllables.
*/

class Haiku
{
public static void main ( String[] args )
{
System.out.println("On a withered branch" );
System.out.println("A crow has just alighted:");
System.out.println("Nightfall in autumn.");
}
}

/* 和 */ 之间的所有字符,都会被编辑器忽略(也就是全都是注释的意思)

/ 和 * 中间不能有任何字符

/* 和 */ 中间可能隔着好几行

小问题

Q:你为啥要用注释帮助别人了解你的程序

A:这人可能是你,注释经常告诉你这是啥,或者为啥你用这个方法做了一些事情(呃。。就是那个意思)

大括号

还有一个要注意的地方,就是每一个左大括号{都会跟着一个右大括号}

一般大括号都会像套娃一样,一套包着一套,举例子

1
2
3
4
5
6
7
8
9
class Haiku
{
public static void main ( String[] args )
{
System.out.println( "On a withered branch" );
System.out.println( "A crow has just alighted:" );
System.out.println( "Nightfall in autumn." );
}
}

这样排版可以让人读起来舒服,和有逻辑一些

结束

不止有{},还有()和[]

大程序有一对上面的括号,用来组成程序的不同部分

1
2
3
4
5
6
7
8
9
class Haiku
{
public static void main ( String[] args )
{
System.out.println( "On a withered branch" );
System.out.println( "A crow has just alighted:" );
System.out.println( "Nightfall in autumn." );
}
}
评论

:D 一言句子获取中...

加载中,最新评论有1分钟缓存...