查看: 74|回复: 0

给Python程序员的Java教程-4 为什么是Java?

[复制链接]

5

主题

8

帖子

18

积分

新手上路

Rank: 1

积分
18
发表于 2023-7-15 19:52:52 | 显示全部楼层 |阅读模式

  • Java 是最广泛传授的编程语言
  • Java 更受欢迎
  • Java 具有工业实力,被很多人用于大型系统
  • 如果你学过 Java,学习 C++ 很容易。
Java 是一种宏大的语言。在Java 6标准版中,有超过3700个不同的类。即使我们把一学期的2700分钟课时都用上,也不可能从这些类的表面开始研究。然而,Java 的功能非常强大,本学期我们将编写非常强大的程序。
4.1 让我们来看看一个Java程序

计算机科学的一个古老传统是编写一个名为 "hello world "的程序。"hello world" 程序简单而容易。它不会出任何逻辑错误,所以要想运行它,只能依靠对语法的理解。为了清楚起见,让我们看看一个“复杂”的 Python 版本的hello world。
def main():
    print("Hello World !")记住,我们可以在 Python 命令行中直接定义这个程序,然后运行它。
>>> main()
Hello World !现在让我们看看用Java编写的同一个程序。
public class Hello {
    public static void main ( String[] args ) {
        System.out.println("Hello World !");
    }
}我们看到的是,在核心部分有一些相似之处,如 main 和字符串"Hello World",然而,在边边角角还有很多东西,使我们更难看到程序的核心。不要担心!计算机科学家的一项重要技能是,通过对程序的分析和研究,了解程序的核心内容。计算机科学家的一项重要技能是学会忽略什么,仔细观察什么。你很快就会发现,当你习惯于看到Java 中的一些元素时,它们会逐渐消失在背景中。有一件事会对你有所帮助,那就是学习一下 Java 的命名规则。
关于这个小程序,你可能有的第一个问题是:"我怎样才能运行它?" 运行 Java 程序并不像运行 Python 程序那样简单。运行 Java 程序的第一件事就是编译它。Java 和 Python 之间的第一个重大区别是 Python 是一种解释语言。我们可以在 Python 解释器中运行我们的 Python 程序,我们很乐意这样做。运行 Java 程序需要两步过程。首先,我们必须把 hello world 程序输入到一个文件中,然后用 Hello.java 这个名字保存该文件,文件名必须与你在文件中定义的公共类相同。一旦我们保存了程序,我们就可以从命令行中编译它,如下所示。
% javac Hello.java
-rw-r--r--  1 user  staff  417 Feb 24 09:28 Hello.class
-rw-r--r--  1 user  staff  108 Feb 24 09:27 Hello.javajavac 命令将我们的 java 源代码编译成已编译的字节码,并将其保存在一个名为 Hello.class 的文件中。Hello.class 是一个二进制文件,所以如果你试图用编辑器来检查这个类文件,你看不明白什么东西。希望你没有犯任何错误,但如果你犯了错误,你可能想参考常见错误部分,以获得关于编译器错误的有用提示。
现在我们已经编译了我们的 Java 源代码,我们可以使用 java 命令运行编译后的代码。
% java Hello
Hello World !现在你可能想知道这额外的步骤有什么好处?编译对我们有什么作用?我们从编译中得到几个重要的好处。

  • 尽早发现错误
  • 更快的程序执行
编译器的工作是把你的 Java 代码变成 Java 虚拟机(JVM)可以理解的语言。我们把 JVM 能理解的代码称为字节码。JVM 对字节码的解释很像 Python 解释器对 Python 的解释。然而,由于字节码更接近于计算机的本地语言,它可以运行得更快。
当编译器进行翻译时,它可以发现许多不同类型的错误。例如,如果你犯了一个拼写错误,编译器就会发现这个错,并在你运行程序之前把它指出来。我们很快就会看到一些编译错误的例子。你也有可能很快就会发现自己的错误。
现在我们已经运行了我们的 hello world 程序,让我们回头仔细看看它,看看我们能学到什么关于 Java 语言的东东。这个简单的例子说明了一些非常重要的规则。

  • 每个 Java 程序都必须有类,所有的代码都在类里面。
  • Java 中的一切都必须有一个类型。
  • 每个 Java 程序都必须有一个函数叫做 public static void main(String[] args)
让我们以 hello world 的例子为例,一行一行地看看这些规则是如何应用的。在第1行,我们看到我们正在声明一个名为 Hello 的类。正如规则1所说,所有的 Java 代码都在类中。与 Python 不同的是,Python 程序可以是文件中的一堆语句,而 Java 程序必须在类中。所以,我们定义了类,Hello 不是一个非常有用的类,它没有实例变量,只有一个方法。你还会注意到大括号 { , 在 Java 中,代码块是由一对大括号标识的。代码块以 { 开始,以 } 结束。你会注意到,我缩进了左括号后面的代码,但在 Java 中,这只是按惯例的,而非强制的。
在下一行,我们开始我们的方法定义。这个方法的名称是:
public static void main(String[] args)!
这一行的所有内容都是重要的,有助于识别这个方法。例如,下面几行看起来很相似,但实际上被 Java 当作完全不同的方法来处理。

  • public void main(String[] args)
  • public static void main(String args)
  • public static void main()
  • void main(String args)
仅仅挖掘这一条线,就能让我们深入到 Java 的世界,所以我们要开始挖掘,但我们不会马上挖得太深。这一行所能揭示的很多东西,通过其他的例子可以更好地理解,所以要有耐心。
第一个词,public 向 Java 编译器表明,这是一个任何人都可以调用的方法。我们将看到,Java 对我们编写的方法实施了几种安全级别,包括 publicprotected private 方法。
下一个词,static 告诉 Java,这是一个属于类的方法,但不是该类任何一个实例的方法。 我们通常在 Python 中写的那种方法需要一个实例才能被调用。对于静态方法,点号( . )左边的对象是一个类,而不是一个类的实例。例如,我们直接调用main方法的方法是:Hello.main(parameter1)。现在你可以像看待 Python 模块中不需要实例的方法一样看待静态方法,例如数学模块中包含许多方法:sin、cos 等。你可能用 math.cos(90)math.sin(60) 的名字评估了这些方法。
下一个词,void 告诉 Java 编译器,方法 main 不会返回一个值。这大致上类似于在 Python 方法中省略返回语句。换句话说,这个方法将运行到完成并退出,但不会返回一个你可以在赋值语句中使用的值。当我们看其他的例子时,我们将看到每个 Python 函数都必须告诉编译器它将返回什么样的对象。这与 Java 中所有的东西都必须有一个类型的规则是一致的。在这个例子中,我们使用了一种特殊的类型,叫做 void,它意味着没有类型。
接下来我们要为这个方法起一个合适的名字:main。Java 中名字的规则与 Python 中的规则相似。名称可以包括字母、数字和_。Java中的名字必须以字母开头。
最后,我们看一下该方法的参数列表。在这个例子中,我们看到一个参数。这个参数的名字是 args,但是,由于在 Java 中所有的东西都必须有一个类型,我们还必须告诉编译器 args 的值是一个字符串的数组。目前,你可以把数组看作是与 Python 中的列表( list )相同的东西。这样声明有个实际好处:方法 main 必须接受一个参数,并且这个参数必须是一个字符串数组,如果你在代码的其他地方调用 main,并把一个整数数组甚至一个字符串传给它,编译器会把它标记为错误。
仅仅一行 Java 语句就有很多新知识需要消化。让我们继续看下一行。System.out.println("Hello World!");。这一行对你来说应该比较熟悉。Python和 Java 都使用点符号来寻找名字。在这个例子中,我们以 System 开始。System 是一个类。在 system 类中,我们找到名为 out 的对象。out 对象是这个程序的标准输出流。定位到 out 对象后,Java 将在该对象上调用名为 println(String s) 的方法。println 方法打印出一个字符串,并在结尾处添加一个换行符。在 Python 中的任何地方,只要你使用了 print 函数,就可以在 Java 中使用 System.out.println 方法。
现在,这一行还有一个重要的字符,那就是结尾处的 ; 。在 Java 中,; 表示一个语句的结束。与 Python 不同的是,在 Python 中,语句几乎总是只有一行长,而 Java 的语句可以分布在许多行。当编译器遇到 ; 时,它就知道已经到了语句的结尾。这是需要记住的一个非常重要的区别。在 Java 中,以下语句都是合法且等价的。我不鼓励你这样写你的代码,但你应该知道它是合法的。
System.out.println("Hello World");
System.out.println("Hello World")
;
System.out.println
   (
     "Hello World"
   ) ;
System.
  out.
     println
(
"Hello World"
)
     ;hello world 程序的最后两行简单地闭合了这两个块。第一个或外层块是类的定义。第二块或内层块是函数的定义。
如果我们想把 Java 翻译成 Python,我们会有如下的类定义。
class Hello:
    @staticmethod
    def main (args):
        print("Hello World !")注意到我们使用了装饰器 @staticmethod 来告诉 Python 解释器 main 将是一个静态方法。这样做的影响是,我们不必,事实上也不应该使用 self 作为 main 方法的第一个参数。使用这个定义,我们可以像这样在 Python 会话中调用 main 方法。
>>> Hello.main("")
Hello World !译注:

  • 原文标题为 Why Learn Java? Why not C or C++?,为了不引战,翻译省略了Why not C or C++;
  • Python 函数中如果省略了 return,会返回 None。
上一篇:Kk111:给Python程序员的Java教程-3 为什么要学习另一种编程语言?
下一篇:Kk111:给Python程序员的Java教程-5 Java数据类型
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表