浅谈java main方法
public static void main(String[ ] arg){
……
}
这个方法是所有java程序员再熟悉不过的方法了,但这个方法又是最特殊的方法,它的名字必须是main,它的参数必须是一个字符串数组,它的类型必须是public static void,这么多必须让初学者对其充满充满了疑问却又无可奈何,现在让我们一点点的来分析一下main方法!
1. 关键字public
public是一个访问权限修饰符,与public相对应的还有protected、默认(没有任何权限修饰符)、private,四种修饰符如其名称所示,分别对应公有、受保护、缺省、私有四种访问级别。外部类仅能处于公有与缺省级别,而内部类、变量、方法可根据需要处于四种级别中任意一种。四种修饰符修饰的类、变量与方法的可见性表1所示:
表1:
访问级别
|
同类
|
同包
|
子类
|
其他地方
|
公有
|
可访问
|
可访问
|
可访问
|
可访问
|
受保护
|
可访问
|
可访问
|
可访问
|
|
缺省
|
可访问
|
可访问
|
|
|
私有
|
可访问
|
|
|
|
注:空白处均为不可访问
2. 关键字static
通常我们想要使用某个类的属性或方法时,我们需要创建一个类的对象,并用new为该类分配数据空间。但当我们需要让所有对象共用一个属性时,或让某个属性/方法不与包含它的类的任何对象关联在一起,能在没有创建对象时直接调用时,这种方法显然不再适用,而static关键字却很好的解决了这一问题。让我们来看一段小程序
public class Test{
public static String s="这是一个静态变量";
public static void output(){
System.out.println(s);
}
}
接着我们在mian方法中执行
Test.s="静态变量被初始化了";
Test.output();
System.out.println("*************");
Test f01=new Test();
Test f02=new Test();
f01.s="第一次改变静态变量";
f01.output();
f02.s="第二次改变静态变量";
System.out.println(f01.s);程序运行后得到输出:
静态变量被初始化了
*************
第一次改变静态变量
第二次改变静态变量
从这段程序中可以看见,调用静态方法或变量有两种方法,第一种:通过类名与点运算符调用;第二种:通过对象与点运算符调用。但推荐使用第一种方法,它强调了静态变量与方法的静态性。另外对象f02对s作了修改,可以看见f01.s值也发生了改变,这对普通变量是不可理喻的,但在这里,静态变量只有一份存储空间,在加载类的过程完成静态变量的内存分配,因此任何一个对象对静态变量的修改,都可以反应到其他对象中。
基于静态方法可在没有创建对象时直接调用的特殊性,对其也有一些限制
a. 静态方法不能调用非静态属性或方法
b. 静态方法中不能引用this 、super关键字
3. 关键字void
void修饰方法时,该方法的没有返回值,注意:没有返回值与返回值为空(return null)是不同的两个概念,返回值为空它有返回值,并且返回值为null。
4. String[ ] arg
这是一个简单的字符串数组的定义,可根据自己的习惯写为String[ ] arg或String arg[ ],其中arg为自己写的数组名。
说了这么多,大家对main方法格式中出现的关键字应该都有了大致了解,现在我们回到main方法上来看看为什么是public static void main(String[ ] arg)。
首先,main方法是JVM(java虚拟机)自动调用,JVM调用main方法的位置自然不会在某个类中、或某个包中,因此只有当main方法在公有级别上时,才对JVM可见,所以mian方法需要public修饰,同理,main方法所在的类也需要public修饰符。由于main方法是所有程序的入口,也就是main被调用时没有任何对象创建,不通过对象调用某一方法,只有将该方法定义为静态方法,所以main方法是一个静态方法,既需要static修饰。JVM对于java程序已经是最底层,由它调用的方法的返回值已经没有任何地方可去,因此,main方法返回值为空,既需用void修饰。至于main方法的参数String[ ] arg我们现在已经很少有机会去用它了,它用于在接受命令行传入的参数,试一下面的小程序吧:
public class Test{
public static void main(String[] arg){
System.out.println("输出在命令行接受的参数");
for(int i=0;i<arg.length;i++){
System.out.println(arg[i]);
}
}
}
将其保存为Test.java文件,然后在命令行转到该文件目录,并输入:
javac Test.java
java Test 1st 2nd
1st 2nd用空格隔开,运行结果:
输出在命令行接受的参数
1st
2nd
虽然我们现在很少用到String[] arg 这个参数,但JVM仍然只认有这个参数的为main方法,写入其他参数则视为对main方法的重载,自己试试吧!
终上所述,main方法的格式必须是public static void main(Sting[ ] arg)。
补充:
想一下没有main方法的程序能不能运行呢?试着去掉main方法,写上一个静态块:
static{
//在此写入你想要运行的代码
}
运行一下,看看效果吧!
分享到:
相关推荐
在Java编程语言中,`main`方法是程序的入口点,它是任何Java应用程序开始执行的地方。当我们在命令行中执行一个包含`main`方法的Java应用程序时,通常使用`java`命令来启动JVM(Java虚拟机)。对于独立的可执行Java...
Java方法参数传值是Java编程中的基础知识点,涉及变量、数据类型和方法调用的机制。在Java中,数据类型分为基本数据类型和引用数据类型。基本数据类型包括布尔型(boolean)、字节型(byte)、短整型(short)、整型...
本文将详细介绍Java语言中的三种数据输入方法,分别是使用main方法命令行参数、使用java.util.Scanner类和使用java.io.BufferedReader类。 1. 使用main方法命令行参数 在Java语言中,main方法的原型是`public ...
### 浅谈Java包的使用 #### 一、引言 在Java开发过程中,随着项目的逐渐庞大和复杂,良好的组织结构对于代码管理至关重要。而Java包(Package)就是用来实现这种逻辑分组的一种机制。通过将相关的类放入同一个包中...
Java 程序中的构造方法调用 Java 程序设计语言中的构造方法是一个特殊的成员方法,它专门用于创建对象和对所创建的对象进行初始化。正确调用构造方法是我们设计程序的关键所在。构造方法的调用方式有三种:一是在...
### 浅谈Java代理机制 #### 一、引言 在深入探讨Java代理机制之前,我们首先需要了解代理模式的基本概念及其应用场景。代理模式是一种结构型设计模式,它为其他对象提供了一种代理以控制对这个对象的访问。在Java...
Java JVM 调优浅谈 Java 虚拟机(JVM)是 Java 语言的核心组件之一,负责加载、验证、执行 Java 字节码。JVM 的调优对于 Java 程序的性能和稳定性至关重要。下面对 JVM 调优的相关知识点进行了详细的解释。 数据...
Java NIO(New Input/Output)是一种用于处理I/O操作的非阻塞I/O模型,与传统的Java IO相比,它提供了更高的性能和更灵活的编程方式。NIO的核心概念包括Channel、Selector、SelectionKey和Buffer。 1. **Channel...
Java文件执行顺序主要指的是Java文件的编译和执行过程中,JVM(Java虚拟机)是如何寻找入口点,并执行main方法的。 首先,当我们编译Java文件时,JVM会首先寻找入口点,也就是main方法。main方法是Java程序的入口...
### Java输入输出流基础知识 #### 一、引言 Java作为一种广泛应用的编程语言,其强大的输入输出(IO)处理能力是其重要的特性之一。通过Java IO库,开发者能够轻松地处理各种类型的输入输出操作,包括但不限于文件...
通过main方法中调用兔子和乌龟线程的start()方法,模拟了它们的赛跑过程。最终结果是乌龟赢了比赛,这表明尽管兔子速度快,但不连续的执行方式导致了最终的落后。 其次,作者还介绍了通过实现Runnable接口来实现多...
### 浅谈Java内部类的四个应用场景 #### 一、引言 在Java语言中,内部类(Inner Class)作为一种特殊的存在,为开发者提供了更为灵活的面向对象编程方式。通过本文,我们将深入探讨Java内部类的四个典型应用场景,...
Java 中方法参数传递的问题 Java 中方法参数传递的问题是 Java 编程语言中一个非常重要的概念。方法参数传递是指在方法调用过程中,将指定的数值传递给方法中的参数,使得方法中的参数拥有了这个指定的值,可以使用...
Java 递归算法浅谈 Java 递归算法是 Java 编程中的一种常见算法,通过自调用函数实现复杂问题的解决。下面是 Java 递归算法的相关知识点。 一、递归函数的定义 递归函数是指在函数体内直接或间接地调用自己,即...
首先,创建Java线程有两种主要方式:直接实例化`Thread`类或者创建一个新的类去继承`Thread`类并重写`run()`方法。例如,你可以创建一个名为`CalculatePrimes`的类,继承自`Thread`,并在`run()`方法内实现计算素数...
浅谈Java线程join方法使用方法 Java中的线程join方法是一种实现线程同步的方式,可以将原本并行执行的多线程方法变成串行执行的。在Java中,线程join方法的作用是使当前线程等待另一个线程的结束,然后再继续执行...
在本资料"浅谈为什么java命令运行class文件出现异常共7页.pdf"中,可能详细讨论了这些常见问题及其解决方法。由于提供的压缩包中仅有一个名为"赚钱项目"的文件,这似乎与Java编程无关,因此可能不是解决上述问题的...
"浅谈Java多线程处理中Future的妙用" 在Java多线程处理中,Future是一个非常重要的概念,它可以帮助我们更好地处理并发任务。Future是一个未来对象,里面保存着线程处理结果,它像一个提货凭证,拿着它你可以随时去...
当在`main`方法中调用`max`时,Java编译器会根据传递的参数类型选择正确的方法。 方法重载的规则包括: 1. **方法名必须相同**:重载的方法必须拥有相同的名称。 2. **参数列表必须不同**:这可以通过改变参数的...
在《浅谈Java String内幕(1)》 中,字符串变量(非final修饰)通过 “+” 进行拼接,在编译过程中会转化为StringBuilder对象的append操作,注意是编译过程,而不是在JVM中。 public class StringTest { ...