A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 史政法 中级黑马   /  2013-3-30 18:35  /  1601 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 史政法 于 2013-4-1 12:09 编辑
  1. class Demo
  2. {
  3. public static void main(String[] args)
  4. {
  5. System.out.println("Hello Java");
  6. }
  7. }
复制代码
首要问题:为什么主函数要接受一个字符串数组?干什么用的?

次要问题:解释主函数中的public static void main具体都是干什么用的?
不要说公有权限,静态修饰,无具体返回值类型,,,,,,,,,,,,,,,,
说说他们是干什么用的?
求指教。求细节达人。。。。。。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

6 个回复

倒序浏览

  (1)public关键字,这个好理解,声明主函数为public就是告诉其他的类可以访问这个函数。

  (2)static关键字,告知编译器main函数是一个静态函数。也就是说main函数中的代码是存储在静态存储区的,即当定义了类以后这段代码就已经存在了。如果main()方法没有使用static修饰符,那么编译不会出错,但是如果你试图执行该程序将会报错,提示main()方法不存在。因为包含main()的类并没有实例化(即没有这个类的对象),所以其main()方法也不会存。而使用static修饰符则表示该方法是静态的,不需要实例化即可使用。

  (3)void关键字表明main()的返回值是无类型。

  **(4)参数String[] args,这是本文的重点。

  第一、程序使用者可以在命令行状态下向某个类传递参数。看下面的例子:

  public class ArgsDemo {

  public static void main(String[] args) {

  String str = new String();

  for (int i = 0; i < args.length; i++) {

  System.out.println(args[i]);

  str += args[i];

  }

  System.out.println(str);

  }

  }

  使用javac ArgsDemo.java命令生成ArgsDemo.class文件;然后使用“java ArgsDemo 参数一 参数二 参数三 …”的格式向ArgsDemo类传递参数。该示例程序将首先输出参数,然后输出所有参数的和。比如java ArgsDemo a b c,将得到这样的输出:

  a

  b

  c

  abc

  需要注意的是,如果这里的循环条件不是i
  Exception in thread “main” java.lang.ArrayIndexOutOfBoundException:3

  at ArgsDemo.main(ArgsDemo.java:5)

  第二、可以在另一个类中向包含main()的类传递参数,如下例:

  public class A {

  public static void main(String[] args)

  {

  for(int i=0;i
  System.out.println(args[i]);

  }

  }

  public class B {

  public static void main(String[] args)

  {

  c = new A();

  String[] b = {"111","222","333"};

  c.main(b);

  }

  }

  首先定义一个class A,在A中定义一个main()函数,在该函数中输出参数args。然后定义一个classB,在B中初始化一个A的实例c,然后向c传递参数,并且调用c的main方法打印出传入的参数值。输出结果如下:

  111

  222

  333

  由于main()函数是静态函数,即不需要实例化也能使用,所以B使用下面的写法也能完成相同的功能:

  public class B {

  public static void main(String[] args)

  {

  //A c = new A();

  String[] b = {"111","222","333"};

  A.main(b);

  }

  }

  总结:参数args的主要作用是为程序使用者在命令行状态下与程序交互提供了一种手段。此外在其他类中直接使用main()函数,并传递参数也是可行的,虽然这种方法不太常用,但毕竟为我们提供了一种选择。

评分

参与人数 1技术分 +2 收起 理由
黄玉昆 + 2 鼓励鼓励

查看全部评分

回复 使用道具 举报
你要是问为什么要传入一个字符数组(其实传入的是new String[0]),我i认为这就是主函数的一中固定格式。就是能被虚拟机识别。
主函数是一个特殊的函数 ,它是整个程序的入口,是可以被虚拟机识别并调用的。
public:是代表该函数的访问权限最大;
static:说明主函数随着类的加载就已经存在了;
void:主函数没有具体的返回值;
main:不是关键字,只是一个可以被虚拟机识别的特殊单词;


评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1 赞一个!

查看全部评分

回复 使用道具 举报
如果要具体解释,可能我没办法做到,这估计要去剖析main这个主函数了。不过要是象征性的去理解,我觉得可以这样去思考:
1.首先我们知道class这个类中可以存放函数和变量值。那么public static void main(String[] args)就是该类中的一种公共的静态函数。
2.而main中的String[] args自然就是接受我们用户输入的String类型的代码并以数组形式存放到一起。最终还是要通过jvm解析。
3.而main为程序运行的主入口方法,每个程序只有一个。
这是我自己的理解!!

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
这是java程序的特殊用法,又称为main用法。
public:表示main方法可以被其他函对象和方法调用和使用。
static:是将main方法声明为静态的。
void:说明main方法不会返回任何内容。
String[]args:这是用来接收命令行传入的参数,String[]是声明args是可以存储字符串数组。
回复 使用道具 举报
本帖最后由 王俊杰 于 2013-3-30 20:21 编辑

一个简单实用的方案:

如果你刚开始学java,那么记住一点public static void main(String[] args)这句话中除了args可以更改之外,其他都是固定不变的。

args一般也不推荐改。习惯化了。

学习一段时间,对java有了一定层次把握后,这个问题就很容易理解了。

我个人不建议在语法细节上过度耗费时间。
所有的知识和细节都可以在资料中网络上找到,只要肯花时间去研究一定可以成为通晓原生语言细节的大家。

但是,人的精力是有限的。像孔乙己一样把精力用到研究回字的四种写法上面。。。。这可能不是我们所期望的。

附  关于String[] args的意义:

    String[] args表示main方法的入口参数,是一个字符串数组。此字符串数组中的元素是在执行程序时输入的命令行参数。

    其中的args是Java命令行参数,我们在DOS中执行Java程序的时候使用“java 文件名 args参数”。args这个数组可以接收到这些参数。

     static的意义

static 是为了保证在class loading的时候就能够调用main方法了。

需将main函数设为先于类的构造而执行,否则无法确定调用的构造函数。
假如,包含main方法的类本身又有自己的构造函数,而这时候如果main方法不是static的,JVM就会走投无路了。

如不是static,就一定要生成类实例。但如果没法调用main方法,又有谁能生成类实例呢?

在  http://blog.csdn.net/shenquanxi/article/details/6704315 里解释的特别详细。
回复 使用道具 举报
个人理解,求分:

1.为什么主函数要接受一个字符串数组?干什么用的?
   我觉得这种模式跟c语言的main函数是相同的,他们都是为了在shell下面通过这个程序名+参数来启动本程序。例如window下cmd里面的ipconfig /all  ,其中/all就是字符数组接受的数据。
2. 解释主函数中的public static void main具体都是干什么用的?
   public就不用说了,main函数要被系统调用,就不能设置为protected或者privates类型了。
   static便是mian函数不是一个类成员函数, 貌似很特殊,他也不是一个类公有函数。但每个类都可以有main函数,所有使用static标识还是可以接受的。
   void也不用说了吧, c语言里面的main函数都可以返回其他数据类型。java里面也能返回其他基本数据类型,然后再调用的时候系统会将这个数据返回给你。

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马