一、前言
记录时间 [2024-05-01]
系列文章简摘:
Java 笔记 01:Java 概述,MarkDown 常用语法整理
Java 笔记 02:Java 开发环境的搭建,IDEA / Notepad++ / JDK 安装及环境配置,编写第一个 Java 程序
Java 笔记 09:Java 流程控制相关,常见的三种控制结构(顺序、选择、循环)
Java 笔记 10:Java 流程控制内容补充,常见的跳转语句,以及一些小案例
更多 Java 相关文章,请参考上面专栏哦。
本文对 Java 方法进行简单介绍,从输出语句 print 引入对方法的介绍,讲述方法的设计原则和命名规范,以及方法定义和调用的一些要点。
二、方法概述
1. 思考引入
在之前的学习中,我们接触过 System.out.println();
这个 Java 语句,它是用来在控制台输出信息的命令。
在 Java 中,System.out
是一个代表标准输出流的对象,而 println()
是一个方法,它会在控制台输出括号内的内容,并在最后自动换行。如果括号内没有任何内容,它将输出一个空行。
System
:这是 Java 中的一个类,位于java.lang
包中。它提供了与系统相关的方法和属性,包括标准输入、标准输出等。out
:这是System
类的一个静态属性,类型为PrintStream
,PrintStream
是 Java 中用于打印输出的类。println()
:这是一个方法,它会在控制台输出括号内的内容,并在最后自动换行。
2. 何谓方法
在 Java 中,方法是用来执行特定任务的一组语句的集合,它们在一起执行一个功能。方法可以接受参数,执行操作,并返回一个值。
- 方法是解决一类问题的步骤的有序组合;
- 方法包含于类或对象中;
- 方法在程序中被创建,在其他地方被引用。
3. 方法设计原则
方法的本意是功能块,就是实现某个功能的语句块的集合。设计方法时,应遵循一些原则,以确保方法的可读性、可维护性和可重用性。
- 单一职责原则:一个方法应该只有一个明确的功能或职责(原子性)。使方法更加清晰和易于理解,降低方法的复杂性。
- 开放封闭原则:方法应该对扩展开放,对修改封闭。当需要修改方法时,应该通过扩展,而不是修改现有方法来实现。
- 参数数量原则:尽量避免方法接受过多的参数。参数数量过多会增加方法的复杂性和理解难度。如果方法需要大量参数,可以考虑将这些参数封装成对象或者使用构建器模式。
- 清晰明确的命名原则:方法的名称应该清晰、明确地描述方法的功能。
- 提高可见性原则:在设计方法时,应该尽量将方法的可见性设置为最小化。如果可能,应该将方法设置为私有
private
,只有在需要在类的外部调用时,才将方法设置为公共public
或受保护protected
。 - 避免副作用原则:方法应该尽量避免对外部状态的修改,即所谓的副作用。副作用会增加方法的复杂性,降低方法的可预测性和可维护性。
- 一致性原则:方法的设计应该保持一致性,即相似的功能应该采用相似的方法设计。这样做可以提高代码的可读性和可维护性。
- 错误处理原则:方法应该提供良好的错误处理机制,包括抛出异常、返回错误码等。良好的错误处理可以增强方法的健壮性和可靠性。
4. 方法命名原则
在 Java 中,方法的命名应该遵循一定的规则和约定,以提高代码的可读性和可维护性。
以下是一些常用的方法命名规则:
- 使用动词或动词短语:方法名称应该能够清楚地描述方法执行的操作。通常使用动词或动词短语来命名方法。例如:
calculateTotal()
、getUserInfo()
。 - 采用驼峰命名法:首字母小写,后续单词的首字母大写,没有下划线或其他分隔符。例如:
calculateTotalAmount()
。 - 清晰明确:方法名应该尽可能清晰和明确,避免使用缩写或简写,以确保其他开发者能够准确理解方法的作用。
- 使用一致的命名风格:在整个代码库中,应该保持一致的命名风格。以提高代码的可读性,降低沟通成本。
- 避免使用保留字:方法名不应该与 Java 中的保留字相同,以免引起歧义或编译错误。
- 根据约定命名特殊方法:一些特殊用途的方法,例如构造方法、getter 和 setter 方法,有一定的命名约定。例如,构造方法应该与类名相同,getter 方法应该以
get
开头,setter 方法应该以set
开头。 - 反映方法的功能:方法名应该反映方法的功能,而不是具体的实现细节或内部实现。
- 具有一定的描述性:避免使用过于简单或过于通用的名称,以免造成混淆或命名冲突。
三、方法定义
1. 定义语法
以下是定义方法的一般语法:
<访问修饰符> <返回类型> <方法名>(<参数列表>) {
// 方法体
<语句>;
// 可选的返回语句
return <返回值>;
}
-
<访问修饰符>
:指定了谁可以调用这个方法以及在什么情况下可以调用。常见的访问修饰符包括:public
:公共的,任何类都可以访问;private
:私有的,只有同一个类中的其他方法可以访问;protected
:受保护的,只有同一个包内的类和子类可以访问;- 默认:没有修饰符,只有同一个包内的类可以访问。
-
<返回类型>
:指定了方法返回的数据类型:- 如果方法不返回任何值,则返回类型应为
void
; - 如果方法返回一个值,则返回类型应该是具体的数据类型,如
int
、double
、String
等。
- 如果方法不返回任何值,则返回类型应为
-
<方法名>
:方法的名称,用来唯一标识方法。 -
<参数列表>
:方法可以接受零个或多个参数,参数是方法执行时需要的输入值。参数列表是用括号括起来的,多个参数之间用逗号分隔。- 形参:定义方法时写的参数,指明类型;
- 实参:调用方法时传入的参数,参数按照定义时的类型。
-
<方法体>
:方法体包含了方法执行的实际操作。这里是方法中的语句集合。 -
return <返回值>;
:可选的返回语句,用于将结果返回给调用者。return
语句会结束方法的执行并返回一个值给调用者。如果方法的返回类型是void
,则不需要返回语句。
2. 简单示例
以下是一个简单的 Java 方法示例:
public class MyClass {
public static void main(String[] args) {
int sum = addNumbers(5, 3);
System.out.println("Sum: " + sum);
}
public static int addNumbers(int a, int b) {
return a + b;
}
}
在这个例子中,addNumbers
方法接受两个整数作为参数,并返回它们的和。main
方法调用了 addNumbers
方法,并将返回的结果打印到控制台。
3. 形参与实参
在 Java 中,形参和实参是函数或方法中的两个概念,用于传递数据。
形参和实参之间的关系:形参是函数或方法定义中声明的参数,而实参是在函数或方法调用时传递给函数或方法的实际数据。
以下是它们的定义和区别:
形式参数(形参)
- 形式参数是函数或方法定义中声明的参数。
- 它们位于函数或方法的参数列表中,并且用于标识函数或方法将要接收的数据类型和数量。
- 在函数或方法内部,形式参数充当占位符,用于表示传递给函数或方法的实际数据。
示例:在这个例子中,add
方法有两个形式参数 a
和 b
。
// 形式参数:用来定义作用的
public void add(int a, int b) {
int sum = a + b;
System.out.println("Sum: " + sum);
}
实际参数(实参)
- 实际参数是在函数或方法调用时传递给函数或方法的实际数据。
- 它们是调用函数或方法时提供的具体值,用于填充函数或方法定义中的形式参数。
- 实际参数的数量、顺序和数据类型必须与函数或方法的形式参数相匹配。
示例:在这个例子中,add
方法被调用时传递了两个实际参数 5
和 3
,分别对应于方法定义中的形式参数 a
和 b
。
public class Main {
public static void main(String[] args) {
Main obj = new Main();
// 实际参数:实际调用方法,传递给他的参数
obj.add(5, 3);
}
// 形式参数:用来定义作用的
public void add(int a, int b) {
int sum = a + b;
System.out.println("Sum: " + sum);
}
}
4. return 用法
从方法中返回值
在 Java 中,return
语句用于从方法中返回值。返回值的类型必须与方法声明中的返回类型匹配。
如果方法声明的返回类型是 int
,那么 return
语句必须返回一个整数值;如果方法声明的返回类型是 String
,那么 return
语句必须返回一个字符串值,依此类推。
以下是一些示例:
// 返回整数类型的值
public int getInteger() {
return 10;
}
// 返回字符串类型的值
public String getString() {
return "Hello, World!";
}
// 返回布尔类型的值
public boolean getBoolean() {
return true;
}
// 返回自定义类的对象
public MyClass getObject() {
MyClass obj = new MyClass();
// do something with obj
return obj;
}
案例分析
下面是一个比较大小的方法示例,它接受两个参数,并使用 return
语句返回它们中较大的值。
public class Comparison {
public static void main(String[] args) {
int num1 = 10;
int num2 = 20;
int max = getMax(num1, num2);
System.out.println("The maximum number is: " + max);
}
public static int getMax(int a, int b) {
int result = 0;
if (a==b) {
System.out.println("num1 == num2");
}
if (a > b) {
result = a;
} else {
result = b;
}
// return 的类型是方法上定义的返回类型 int
return result;
}
}
这个 getMax
方法接受两个整数参数 a
和 b
,然后比较它们的值。如果 a
大于 b
,则返回 a
,否则返回 b
。在 main
方法中,我们调用 getMax
方法,并打印出返回的最大值。
终止方法
在 Java 中,return
语句不仅可以从方法中返回值,并可以选择性地终止方法的执行。
当在方法中遇到 return
语句时,方法将立即停止执行并返回指定的值(如果有)。如果方法的返回类型是 void
,则可以使用 return;
语句来显式地终止方法的执行。
在一些情况下,特别是在条件分支或循环中,使用 return
语句可以提前终止方法的执行。例如:
public int findIndex(int[] arr, int target) {
for (int i = 0; i < arr.length; i++) {
if (arr[i] == target) {
return i; // 在找到目标时立即返回索引值
}
}
return -1; // 如果未找到目标,则返回 -1
}
在这个例子中,如果数组中找到了目标值 target
,则立即返回该值的索引;否则,当遍历完整个数组后,返回 -1
表示未找到目标值。
另外,如果方法的返回类型是 void
,可以使用 return;
来显式地终止方法的执行,如下所示:
public void printMessage() {
if (condition) {
// 执行一些逻辑
return; // 终止方法的执行
}
// 如果条件不满足,则执行下面的逻辑
}
在这个例子中,如果条件满足,return;
语句将会终止方法的执行,不再执行后续的逻辑。
四、方法调用
在 Java 中,方法调用是通过使用方法名和传递给方法的参数来执行的。
方法调用的一般语法是:方法名(参数列表)
。
对于静态方法,可以直接使用类名调用,而对于实例方法,则需要先创建类的实例,然后使用该实例调用方法。
原因分析:
-
当类加载到内存中时,其中定义的静态方法也被加载到内存中,并且可以通过类名直接访问。这使得静态方法可以在程序的任何地方被调用,而无需实例化类。
-
非静态方法(也称为实例方法)需要类的实例化才能调用。当类加载到内存中时,类的方法定义也会被加载,但实例方法与特定的类实例相关联。因此,要调用实例方法,需要首先创建类的实例,然后通过该实例来调用方法。
此外,当一个方法返回一个值时,方法调用可以被视为一个值。这意味着可以在表达式中使用方法调用,并且该表达式的值将是方法返回的值。这使得方法调用可以作为参数传递给其他方法,或者赋值给变量,或者用于表达式中的其他操作。
以下是几种方法调用的示例:
1. 调用类的静态方法
在 Java 中,调用类的静态方法是通过使用类名来调用的。静态方法可以直接通过类名调用,而不需要创建类的实例。
在以下示例中,myStaticMethod()
是一个静态方法,它属于 MyClass
类。在 Main
类的 main
方法中,我们通过使用类名 MyClass
来调用 myStaticMethod()
方法。
这种调用方式在没有创建 MyClass
类的实例的情况下就可以进行。
public class MyClass {
// 定义一个静态方法
public static void myStaticMethod() {
System.out.println("This is a static method.");
}
}
public class Main {
public static void main(String[] args) {
// 调用静态方法
MyClass.myStaticMethod();
}
}
2. 调用类的实例方法
调用类的实例方法需要先创建类的实例,然后使用该实例来调用方法。
在以下示例中,myMethod()
是一个实例方法,它属于 MyClass
类。在 Main
类的 main
方法中,我们首先创建了 MyClass
类的实例 obj
,然后使用该实例来调用 myMethod()
方法。
这种调用方式是在对象上执行方法。
public class MyClass {
// 定义一个实例方法
public void myMethod() {
System.out.println("This is an instance method.");
}
}
public class Main {
public static void main(String[] args) {
// 创建类的实例
MyClass obj = new MyClass();
// 调用实例方法:对象名.方法名(实参列表)
obj.myMethod();
}
}
3. 其他方法中调用方法
在 Java 中,可以在一个方法中调用另一个方法。这种调用方法的方式可以是类内部的方法调用,也可以是不同类之间的方法调用。以下是两种情况的示例。
同一个类中调用方法
在这个示例中,method1
方法调用了 method2
方法。当 method1
方法被调用时,它会输出一条消息,并且会调用 method2
方法,输出另一条消息。
public class MyClass {
public void method1() {
System.out.println("Inside method1");
// 在 method1 中调用 method2
method2();
}
public void method2() {
System.out.println("Inside method2");
}
public static void main(String[] args) {
MyClass obj = new MyClass();
obj.method1();
}
}
不同类中调用方法
在这个示例中,Main
类的 main
方法中创建了 MyClass
类的实例,并调用了 MyClass
类中的 myMethod
方法。这种方式是在不同类之间调用方法的常见做法。
public class MyClass {
public void myMethod() {
System.out.println("Inside myMethod");
}
}
public class Main {
public static void main(String[] args) {
// 创建 MyClass 类的实例
MyClass obj = new MyClass();
// 在 Main 类的 main 方法中调用 MyClass 类的方法
obj.myMethod();
}
}
五、总结
本文对 Java 方法进行简单介绍,从输出语句 print 引入对方法的介绍,讲述方法的设计原则和命名规范,以及方法定义和调用的一些要点。
一些参考资料
狂神说 Java 零基础:https://www.bilibili.com/video/BV12J41137hu/
TIOBE 编程语言走势: https://www.tiobe.com/tiobe-index/
Typora 官网:https://www.typoraio.cn/
Oracle 官网:https://www.oracle.com/
Notepad++ 下载地址:https://notepad-plus.en.softonic.com/
IDEA 官网:https://www.jetbrains.com.cn/idea/
Java 开发手册:https://developer.aliyun.com/ebook/394
Java 8 帮助文档:https://docs.oracle.com/javase/8/docs/api/