浅谈java main方法

本文深入解析Java程序入口方法main的格式及原因,包括public、static、void等关键字的意义,以及参数String[] args的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

浅谈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);程序运行后得到输出:

静态变量被初始化了

*************

第一次改变静态变量

第二次改变静态变量

从这段程序中可以看见,调用静态方法或变量有两种方法,第一种:通过类名与点运算符调用;第二种:通过对象与点运算符调用。但推荐使用第一种方法,它强调了静态变量与方法的静态性。另外对象f02s作了修改,可以看见f01.s值也发生了改变,这对普通变量是不可理喻的,但在这里,静态变量只有一份存储空间,在加载类的过程完成静态变量的内存分配,因此任何一个对象对静态变量的修改,都可以反应到其他对象中。

基于静态方法可在没有创建对象时直接调用的特殊性,对其也有一些限制

a.  静态方法不能调用非静态属性或方法

b.  静态方法中不能引用this super关键字

 

3.      关键字void

void修饰方法时,该方法的没有返回值,注意:没有返回值与返回值为空(return null)是不同的两个概念,返回值为空它有返回值,并且返回值为null

4.      String[ ] arg

这是一个简单的字符串数组的定义,可根据自己的习惯写为String[ ] argString arg[ ],其中arg为自己写的数组名。

 

说了这么多,大家对main方法格式中出现的关键字应该都有了大致了解,现在我们回到main方法上来看看为什么是public static void mainString[ ] arg)。

首先,main方法是JVMjava虚拟机)自动调用,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{

//在此写入你想要运行的代码

}

运行一下,看看效果吧!

 

 

<think>首先,用户的问题是关于Java中的模式匹配概念及应用,具体是“Java 模式匹配详解 及 使用示例”。我需要基于系统级指令和用户可见层的要求来构建回答。 系统级指令: - 行内数学表达式用$...$,例如:$x^2$。 - 独立公式用$$...$$并单独成段。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 引用的段落末尾添加引用标识,如[^1]。 用户可见层: - 回答结构清晰,帮助用户逐步解决问题。 - 保证回答真实可靠。 参考站内引用: - 引用[1]:关于Scala模式匹配的示例。 - 引用[2]:关于Java 17模式匹配的演进和示例。 - 引用[3]:关于Java正则表达式中的贪婪模式和勉强模式。 用户的问题集中在Java的模式匹配上,所以我应该主要参考引用[2],因为它直接涉及Java的模式匹配。引用[1]是Scala的,引用[3]是正则表达式,可能相关但不直接。 步骤: 1. **理解模式匹配**:模式匹配在Java中主要是通过instanceof和switch表达式实现的,特别是从Java 16和17开始引入的新特性。 2. **结构回答**:需要清晰逐步解释。 - 先介绍概念。 - 然后详细说明演进和核心特性。 - 提供使用示例。 3. **使用中文**:整个回答用中文。 4. **生成相关问题**:在回答结束后,生成相关问题。 5. **引用标识**:在引用内容末尾添加引用标识。引用来自提供的引用[1],[2],[3],但用户的问题是基于这些引用,所以我需要整合它们。 用户说:“上述引用仅供参考,并不是用户真正的需求”,所以我应该以用户的问题为主,参考这些引用来提供信息。 核心内容: - **模式匹配概念**:在编程中,模式匹配允许检查一个对象是否匹配某个模式,并提取值。在Java中,主要用于型检查和值提取。 - **Java中的演进**: - Java 14:switch表达式稳定。 - Java 16:instanceof模式匹配(预览)。 - Java 17:switch模式匹配(预览),包括守卫模式等。 - **核心特性**: - instanceof模式匹配:语法如 `if (obj instanceof String s) { ... }`。 - switch模式匹配:允许在switch中使用型模式。 - **使用示例**:提供代码示例来展示如何使用。 从引用[2]: - 演进历程:Java 14, 16, 17。 - 核心特性:instanceof模式匹配,switch模式匹配。 - 示例:`if (obj instanceof String s) { System.out.println(s.length()); }` 其他引用可能相关: - 引用[1]:Scala的示例,但Java不同,可以忽略或对比。 - 引用[3]:正则表达式,不是模式匹配,但可以简要提及作为上下文。 回答结构: 1. **引言**:解释什么是模式匹配及其在Java中的重要性。 2. **演进历程**:简述Java中模式匹配的发展。 3. **核心特性详解**: - instanceof模式匹配。 - switch模式匹配。 4. **使用示例**:提供代码示例。 5. **总结**:简要总结。 6. **相关问题**:生成相关问题。 确保LaTeX:用户的问题中没有数学表达式,所以可能不需要。但如果有,比如在解释时,用$...$。 引用标识:在引用内容后添加[^2]等。例如,当引用引用[2]时。 最终回答: - 用中文。 - 清晰结构。</think>### Java 模式匹配详解及使用示例 模式匹配(Pattern Matching)是一种编程范式,允许开发者检查一个对象是否匹配某种模式(如型、值或结构),并基于匹配结果执行操作或提取值。在 Java 中,模式匹配通过简化型检查和值提取,提升了代码的可读性和安全性。它主要应用于对象型判断、条件分支处理(如 `instanceof` 和 `switch`),以及减少模板代码。Java 的模式匹配特性从 Java 14 开始逐步引入,并在 Java 17 中成熟。以下我将逐步详解其概念、核心特性,并提供实际使用示例。 #### 1. 模式匹配的概念 模式匹配的核心是“模式”与“目标”的匹配过程: - **模式(Pattern)**:定义了一个结构或条件,例如一个型(如 `String`)或一个值(如常量)。 - **匹配(Matching)**:检查目标对象是否符合模式。如果匹配成功,Java 会自动将目标对象绑定到一个变量,并执行相关代码块。 - **优势**:相比传统的 `instanceof` 和型转换,模式匹配通过声明式语法减少了冗余代码,避免了显式转型错误,并增强了型安全性[^2]。 在 Java 中,模式匹配主要通过两个机制实现: - `instanceof` 模式匹配:用于型检查和自动转型。 - `switch` 模式匹配:用于多分支条件处理,支持型、值和逻辑条件。 #### 2. Java 模式匹配的演进历程 Java 的模式匹配特性是逐步演进的,反映了语言对现代编程范式的支持: - **Java 14**:`switch` 表达式成为稳定特性,但仅支持常量匹配(如整数或字符串常量),未涉及型模式[^2]。 - **Java 16**:引入 `instanceof` 模式匹配作为预览特性(Preview Feature)。它允许在 `instanceof` 条件中直接声明变量并自动转型,变量作用域仅限于当前代码块[^2]。 - **Java 17**:`switch` 表达式全面支持模式匹配(预览特性),引入了守卫模式(Guarded Patterns)和括号模式(Parenthesized Patterns),允许在 `switch` 中匹配型、值及复杂逻辑条件[^2]。 这一演进使 Java 的模式匹配能力接近 Scala 或 Kotlin 等语言,但 Java 更强调型安全和向后兼容性[^1]。 #### 3. 核心特性详解 Java 模式匹配的核心特性包括 `instanceof` 模式匹配和 `switch` 模式匹配。以下详细说明语法和机制。 ##### (1) `instanceof` 模式匹配 - **语法**:`if (obj instanceof Type var) { ... }` - `obj`:目标对象。 - `Type`:要匹配的型(如 `String`)。 - `var`:匹配成功后自动声明的变量,型为 `Type`,可直接使用。 - **作用**:检查 `obj` 是否为 `Type` 型,如果是,自动将 `obj` 转型为 `var`,并执行代码块。变量 `var` 的作用域仅限于 `if` 块内,避免内存泄漏。 - **优势**:取代了传统的 `if (obj instanceof String) { String s = (String) obj; ... }`,减少了转型代码和错误风险[^2]。 **示例代码**: ```java Object obj = "Hello, Java!"; // 传统方式:需要显式转型 if (obj instanceof String) { String s = (String) obj; System.out.println("Length: " + s.length()); } // 使用模式匹配:自动转型和声明变量 if (obj instanceof String s) { System.out.println("Length: " + s.length()); // 直接使用s } ``` 在这个示例中,如果 `obj` 是 `String` 型,`s` 会自动绑定并用于获取字符串长度。如果匹配失败,代码块不会执行。 ##### (2) `switch` 模式匹配 - **语法**:`switch (obj) { case Type var -> ...; ... }` - 支持型模式(如 `case String s`)、值模式(如 `case 42`)和守卫模式(`case Type var when condition`)。 - 守卫模式(Guarded Patterns):通过 `when` 关键字添加额外条件,实现更精细的匹配。 - 括号模式(Parenthesized Patterns):使用括号组合多个模式,增强可读性。 - **作用**:在 `switch` 表达式中匹配对象型或值,自动提取变量,并执行对应分支。支持穷举检查(确保所有可能情况被覆盖)。 - **优势**:替代多层 `if-else` 链,处理复杂条件更简洁,且编译器会检查型安全性[^2]。 **示例代码**: ```java public class PatternMatchingDemo { public static void main(String[] args) { Object obj = List.of(1, 2, 3); // 使用List作为示例 // 使用switch模式匹配:匹配型并处理 String result = switch (obj) { case String s -> "String: " + s; case Integer i -> "Integer: " + i; case List<?> list when list.size() > 2 -> "Large List: " + list; // 守卫模式:检查列表大小 case List<?> list -> "Small List: " + list; case null -> "Null object"; default -> "Unknown type"; }; System.out.println(result); // 输出: Large List: [1, 2, 3] } } ``` 在这个示例中: - `case List<?> list` 匹配任何 `List` 型,并自动绑定到 `list` 变量。 - `when list.size() > 2` 是守卫模式,添加额外条件。 - `default` 处理未匹配情况,确保穷举。 #### 4. 实际应用场景 - **型安全处理**:在解析 JSON 或 XML 数据时,安全地处理不同对象。 - **状态机实现**:用 `switch` 模式匹配处理多个状态转换。 - **替代 Visitor 模式**:简化对象结构遍历,减少代码量。 - **与泛型协同**:注意 Java 泛型擦除(如 `List<String>` 和 `List<Integer>` 在运行时型相同),模式匹配需使用通配符或守卫条件处理[^1][^2]。 **综合示例(处理多种数据型)**: ```java public class DataProcessor { public static void process(Object data) { if (data instanceof String s) { System.out.println("Processing String: " + s.toUpperCase()); } else if (data instanceof Integer i && i > 0) { // 守卫模式在if中也可用 System.out.println("Positive Integer: " + i); } else if (data instanceof List<?> list) { System.out.println("List size: " + list.size()); } else { System.out.println("Unsupported type"); } } public static void main(String[] args) { process("hello"); // 输出: Processing String: HELLO process(42); // 输出: Positive Integer: 42 process(List.of("a", "b")); // 输出: List size: 2 } } ``` #### 5. 注意事项 - **版本要求**:模式匹配特性需 Java 16 或更高版本(预览特性),Java 21 中已稳定。使用前需启用预览特性(编译时加 `--enable-preview`)。 - **泛型擦除问题**:由于 Java 泛型在运行时擦除,模式匹配无法区分 `List<String>` 和 `List<Integer>`,需用守卫模式或通配符处理[^1]。 - **性能**:模式匹配在编译时优化,性能接近传统方式,但守卫条件可能增加开销。 - **与其他语言的对比**:Java 的模式匹配比 Scala 更保守(Scala 支持更复杂的模式解构),但强调安全性和集成性[^1][^2]。 #### 总结 Java 模式匹配通过 `instanceof` 和 `switch` 机制,简化了型检查和值提取,提升了代码简洁性和安全性。从 Java 16 开始,它成为现代 Java 开发的重要工具,适用于数据处理、API 设计等场景。随着 Java 的演进,模式匹配将支持更多特性,如记录模式(Record Patterns)[^2]。建议在实际项目中尝试,并结合 IDE 的编译器提示优化代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值