当前位置: 首页>编程语言>正文

android_main函数 安卓程序主函数

 

public static voidmain(String[] args){}

那么我们就来说一说上述代码的含义。

1. 主函数的作用

主函数是一个特殊的函数,作为程序的入口,可以被jvm(Java虚拟机,简称虚拟机,下同)调用。

2. 主函数的含义

public:  由于主函数需要被Java虚拟机访问,因此主函数的访问权限必须最大——public。

static:   表示主函数随着类的加载就已经存在于方法区内存中了。

void:     表示主函数没有返回值。这是因为,主函数的调用者是Java虚拟机,它的目的就是调用主函数,使得真个程序能够正常执行,不需要任何的返回值。

main:    大家注意“main”作为主函数名,并不是关键字,但是作为一个特殊的单词,可以被主函数识别。

String[]args:这是主函数的形参列表,参数类型是字符串类型的数组

 

以上就是主函数中每个单词所表示的含义,大家要注意主函数的写法是固定的,必须按照上述的写法,否则Java虚拟机无法识别。

思考下面的代码能否编译通过,代码1:

<pre name="code" class="java">class Demo
{
	public static void main(String[] args)
	{
		System.out.println(“Hello World!”);
	}
	public static void main(int x){}
}



答案是可以编译通过。这是因为,虽然主函数因其特殊的作用,而具有特殊的地位,但是它首先还是一个一般的函数或方法,既然是方法就能够实现

重载,我们再来看上述代码,上下两个“main”方法,方法名及其修饰符完全相同,就是形参列表不同,这就是重载,并没有任何错误,因此可编译通过。

当然,无论主函数如何重载,Java程序的入口永远是上面的那个主函数,因为虚拟机只识别这个写法的主函数。所以,及时一个类中由很多函数名为“main”的方法,但是形参列表都不是String[]args,那么即使能够编译,也会因为不被虚拟机识别而无法运行。

 

小知识点1:

       上面我们说了主函数的在写法上的固定格式及其含义,不过实际上,主函数在写法并不是完全固定的,它的形式参数——String[]的变量名是可以改变的。也就是说它不一定定义为arges。

       那么为什么通常都要将这个变量名定义为args呢?其实,args是arguments的缩写,意思是参数,这是由早期Java开发者们习惯性的定义。后来开发者们觉得arguments写法过长,比较麻烦就简化为现在常用的args。

 

3. 主函数形式参数的作用

下面我们来说说虚拟机在调用主函数时的一些原理。大家都知道,不论通过对象还是类名调用某个方法,很多时候是要向调用的方法中传入一些与之对应的实际参数。主函数也不例外,因为主函数是有形参列表的。而主函数的调用者是虚拟机,那么就应该由虚拟机向主函数传入一个字符串类型的数组,那么虚拟机到底向主函数传入的参数是什么呢?我们下面的代码进行分析,代码2:

class MainDemo
{
	public static void main(String[] args)
	{
		System.out.println(args);
		System.out.println(“长度= ”+args.length);
	}
}

运行结果:

[Ljava.lang.String;@1db9742(这个结果不是固定值,仅用于说明问题)

长度 = 0

关于第一行结果的含义我们再来复习一下。“[”表示这个引用型变量指向了一个数组;Ljava.lang.String表示数组中存放的是字符串类型的数据,而这个String类存在于java包下的lang包内;“@”是固定格式,大家也可以理解为一个介词“在”;后面的十六进制数表示这个引用指向的数组对象在堆内存中的地址值(实际上称之为地址值是不准确的,因为它是把地址值通过哈希算法进行变换后计算出来的)。

通过第一行运行结果我们知道了,虚拟机在调用主函数时确实向主函数传入了一个数组实体,并不是“null”。而第二行结果表示,这个数组的长度为0。

综合上述两行结果,我们可以推断,虚拟机在调用主函数时传入了一个长度为0的字符串类型的数组。实际上,虚拟机在调用主函数时是可以接受用户传入的一些参数的,而这些参数的类型是String。

那么如何实现向主函数传入参数呢?通过向命令行输入下面的命令,以代码3为例:

class MainDemo2
{
	public static void main(String[] args)
	{
		for(int x = 0; x<args.length; x++)
		{
			System.out.println(args[x]);
		}
	}
}

命令行命令为:java MainDemo HelloWorld

运行结果为:

Hello

World

上述命令的含义是:通过java启动虚拟机,将需要启动的类的类名MainDemo传给虚拟机,虚拟机运行MainDemo类的同时,将接收到的Hello和World两个数据自动整合成一个长度为2的字符串数组,并将这个数组作为实际参数传给主函数。

 

小知识点2:

       如果觉得每次运行java类的同时,向主函数传入参数比较麻烦可以这样做。

代码4:

class Arguments
{
	publi cstatic void main(String[] args)
	{
		args = new String[]{"A", "B", "C", "D","E"};
 
		MainDemo.main(args);
	}
}
class MainDemo
{
	public static void main(String[] args)
	{
		for(int x = 0; x<args.length; x++)
		{
			System.out.println(args[x]);
		}
	}
}

运行结果为:

A

B

C

D

E

简单说一下这段代码的原理:通过虚拟机调用Arguments类,内部定义了一个字符串类型的数组,并通过MainDemo类名调用MainDemo类的主函数,并将这个数组传给MainDemo的主函数,最终将数组的内容输出。



https://www.xamrdz.com/lan/5ah1957316.html

相关文章: