我正在尝试学习Java,这是一个hello world程序,它已经开始让我感到困惑。我习惯了python,我发现this教程(电子书)对于拥有python背景的程序员来说简单而简洁。
Java中的Hello world程序:
public class Hello {
public static void main (String[] args) {
System.out.println("Hello World!");
}
}
正如书中所说,python中的等效代码是:
class Hello(object):
@staticmethod
def main(args):
print "Hello World!"
我完全理解python代码。但是,我遇到了Java代码的问题,在进一步开发之前我想明确一点,这样我才能掌握大脑中的语言知识。
这本书说(从书中复制):
...我们有一个参数。但参数的名称是args, 因为Java中的所有内容都必须具有类型,我们也必须告诉它 编译器,args的值是一个字符串数组。目前 您可以将数组视为与列表相同的内容 蟒蛇。声明方法主要必须的实际好处 接受一个参数,参数必须是一个字符串数组 如果你在代码中的其他地方调用main并传递它 一个整数数组甚至一个字符串,编译器将标记 这是一个错误。
这对我没有任何意义。为什么我不能传递任何东西,因为我的功能不需要任何东西?如果我只是传递(String args)会发生什么。
由于我是Java的新手,请耐心等待。
答案 0 :(得分:6)
args
参数传入,因此即使您不使用它们也需要接受它们。
答案 1 :(得分:4)
嗯,这里有两件事。首先,是函数签名 - 因为你声明main
只期望并接受一个字符串数组,如果你尝试传递其他东西,它会引发错误。但不是因为函数拒绝接受它,而是因为编译器不知道你要调用的是什么。请参阅,您可以使用相同名称但不同参数的多个函数。因此,如果您尝试调用main(1)
,编译器将查找接受一个(或多个)整数的函数main,而不是找到它,并引发异常。
这里发生的另一件事是,当你启动一个程序时,编译器会查找这个特定的签名 - public static void main (String[] args)
,而不是其他任何东西。找不到了吗?该程序将无法运行。
答案 2 :(得分:2)
如你所知,Python使用“鸭子打字”:什么类型的东西并不重要,只有它可以做什么。因此,您永远不需要为变量声明类型。
在Java中,情况并非如此:每个变量都有一个声明的类型,编译器会强制执行该类型。例如,尝试在String
声明的变量中存储int
引用将产生编译时错误。鸭子打字的支持者声称这降低了灵活性,但强类型爱好者指出编译时错误比运行时错误更容易解决。
但是你的方法参数也是如此。由于您的方法需要类型为String[]
的参数,因此必须提供类型为String[]
的参数。没有别的办法。
幸运的是,由于它是main
方法,Java解释器负责传入一个参数:具体来说,是一个用于执行程序的命令行参数的数组。如果您想忽略它,请随意。你的程序运行得很好而不注意参数,但是如果没有传入则它是无效的。
(顺便说一句,如果这是除了main
方法之外的任何方法,你可以自由地用你想要的任何参数类型来声明它,包括根本没有参数。但是因为Java解释器将传递一个命令行参数的数组,这个特定的方法必须准备好接受它们。)
答案 3 :(得分:2)
在Java中,没有像Python中那样的顶级代码(即没有直接等同于
print('Hello world')
)。然而,Java程序需要某种入口点才能开始执行代码。与许多其他语言(即C / C ++,C#,Haskell)一样,function with the name main
用于此目的,并由运行时调用(即Java解释器)。
调用main
函数时,运行时使用certain number (and types) of arguments。该功能必须与这些匹配。您可以随意使用您喜欢的任何签名调用其他方法:
public class Hello {
public static void hi() {
System.out.println("Hello World!");
}
public static void main (String[] args) {
hi();
}
}
答案 4 :(得分:2)
每个程序都有一个入口点/起点,从它的执行开始。 Java会搜索一个特定的方法签名,它将从一个类开始运行你的应用程序,这是一种“主要”方法。
public static void main(String args[]);
必须执行此操作才能启动程序(在您想要开始的课程中)。由于这个规则/限制,我们必须传递字符串数组(类似于Python中的字符串列表)作为参数。
现在对于第二部分,如果您的程序在启动时不需要任何参数,则不要传递任何参数。您将在main方法中将args作为空String数组。以下行将打印传递给main方法的参数长度。
System.out.println("Length of arguments = " + args.length);
您可能还想查看Sun's Java guide for starters。 我希望这能回答你的问题。
答案 5 :(得分:1)
如果你的函数不需要任何东西(所以它没有参数)那么你可以避免传递任何东西,这可以通过声明为
来完成。void noArgumentsFunction() {
// body
}
但是main
函数,即锅炉板,必须接受String
的数组。这就是为什么你被迫宣布签名接受它(然后忽略它的情况)。函数必须接受此参数,因为它是程序的entry point,并且任何Java程序都必须支持使用命令行传递的参数数组(正如每个C / C ++程序一样,如果您不被强制执行它)。
答案 6 :(得分:1)
首先,请注意JVM调用main方法来启动程序并传递命令行参数。它可以被Java代码调用,但很少这样做。
无论如何,这是该方法的签名:
public static void main (String[] args)
它说它需要一个参数,这是一个字符串数组。如果你这样称呼它:
main(new String[1]);
或者这个:
main(methodThatReturnsAStringArray());
它会起作用。但这些会导致编译错误:
main(new int[0]);
main("test");
因为调用中参数的类型与方法签名所需的类型不匹配。你可以传递一个空指针:
main(null);
因为数组是引用类型,null
是所有引用类型的有效值。但是该方法必须测试该情况,否则在尝试访问该数组时会抛出NullPointerException
。
您可以做的另一件事是重载,通过声明另一个方法:
public static void main (String args)
所以当你打电话
main("test");
编译器将确定存在具有匹配签名的方法并调用该方法。
基本上,所有这一点的重点在于许多程序员错误都是由编译器而不是在运行时捕获的(如果它是很少执行的代码路径,它们可能只在某些特殊情况下被发现)。
答案 7 :(得分:0)
从命令行执行程序时,Commandline参数可以是多个字符串。
例如
Java myprogramme param1 param2 param3
所有这些参数 - param1,param2,param3作为字符串[]传递。
这对于通过零,一个或多个参数的所有程序都是通用的。
作为程序员,您有责任检查这些命令行参数。