一篇文章带你了解什么是Java方法?方法的概念和为什么要使用方法,使用方法又需要注意什么呢?
基本概念:
在Java中,方法是一段可重复使用的代码块,是由一条条语句集合在一起,用于执行特定的任务。它为程序提供了模块化和封装的能力,可以接收输入参数并返回结果。
使用方法的优势:
- 模块化: 方法将代码逻辑封装在一个单独的块中,使得代码更具有结构性和可读性。通过把大型程序拆分成多个小的、独立的方法,可以使得代码更容易理解和维护。
- 可重用性: 方法可以被多次调用,从而避免了重复编写相同的代码。通过定义一个方法来完成某个任务,我们可以在程序的不同部分多次调用该方法,提高了代码的复用性,减少了冗余代码的数量。
- 提高代码的可维护性: 方法使得代码更易于维护和修改。如果程序中某个功能需要改变,只需要在对应的方法中进行修改,而不必在整个代码中寻找和修改相关的部分。这种封装的方式使得修改更加集中和安全,降低了引入错误的风险。
- 代码简洁性: 使用方法可以使代码更加简洁和可读。具有描述性的方法名能够清晰地表达方法的作用,而不需要深入阅读方法内部的实现细节。这有助于其他开发人员更容易理解你的代码,提高了协作的效率。
- 提高代码的可测试性: 有了方法,我们可以更方便地编写测试代码。方法接收输入参数并返回结果,且逻辑相对独立,这使得编写单元测试和集成测试变得更容易。通过对每个方法进行单独的测试,可以提高代码质量和可靠性。
也就是我们上面说的使用方法它为程序提供了模块化和封装的能力,使开发工作更加高效,正确地使用方法能够使我们的代码更加清晰、结构化,并且更易于理解和维护。
方法的命名规则:
一般情况下,定义一个方法包含以下语法:
修饰符 返回值类型 方法名(参数类型 参数名){
...
方法体
...
return 返回值;
}
方法包含一个方法头和一个方法体。
下面是一个方法的所有部分:
- **修饰符:**修饰符,这是可选的,告诉编译器如何调用该方法。定义了该方法的访问类型。
- **返回值类型 :**方法可能会返回值。returnValueType 是方法返回值的数据类型。有些方法执行所需的操作,但没有返回值。在这种情况下,returnValueType 是关键字void。
- **方法名:**是方法的实际名称。方法名和参数表共同构成方法签名。
- 参数类型:参数像是一个占位符。当方法被调用时,传递值给参数。这个值被称为实参或变量。参数列表是指方法的参数类型、顺序和参数的个数。参数是可选的,方法可以不包含任何参数。
- **方法体:**方法体包含具体的语句,定义该方法的功能。
方法调用:
看我们调用的方法是否有返回值,如果有返回值,那么就需要我们定义一个相同类型的变量用来接收方法返回值。
public int sum(){
/*方法体*/ //int类型的返回值
return (int)num;
}
//方法调用
int larger = sum();
void关键字
在Java中,void
是一种特殊的关键字,用于表示方法不返回任何值。
以下是 void
关键字在方法中的作用:
- 表示无返回值:
void
表示该方法没有返回值。这意味着在方法执行完毕后,并不会有一个具体的数值被返回给调用者。这种类型的方法通常用于执行某个操作而不需要返回结果的情况,例如打印信息、修改对象状态或执行其他操作。 - 强调方法用途: 使用
void
关键字声明的方法通常用于表示这个方法的用途是执行一些特定的操作,而不是返回一个计算结果。这样做有助于提高代码的可读性和可理解性,让其他开发人员更容易理解该方法的意图。 - 不可与return语句一起使用: 在
void
方法中,不能使用return
语句来返回值。因为void
意味着没有返回值,所以在方法内部无法使用return
语句返回一个值给调用者。如果在void
方法中使用return
语句,它将用于提前结束方法的执行。
下面是一个示例,演示了 void
方法的用法:
public class MyClass {
public static void main(String[] args) {
// 调用 void 方法
printMessage("Hello, World!");
}
// 声明一个 void 方法,用于打印消息
public static void printMessage(String message) {
System.out.println(message);
}
}
在上面的例子中,printMessage
方法它接收一个字符串参数,并将其打印到控制台。使用了 void
关键字声明,表示该方法没有返回值。
Java方法中参数的传递方式为值传递
在 Java 中,方法参数的传递方式是通过值传递(pass-by-value)。这意味着调用方法时,实际上传递给方法的是变量的值的“副本”,而不是变量本身。
- 对于基本数据类型(如
int
、double
、char
等):传递的是该值的副本。在方法内部对参数进行修改不会影响到原始变量。
示例:
public class MyClass {
public static void main(String[] args) {
int num = 5;
modifyValue(num);
System.out.println(num); // 输出: 5
}
public static void modifyValue(int value) {
value = 10; // 修改参数的值
}
}
- **对于对象引用类型:**传递的是引用值的副本。原始引用和方法内部的引用副本指向同一个对象,所以对对象属性的修改在方法外部是可见的,但无法改变原始引用指向的对象。
示例:
public class MyClass {
public static void main(String[] args) {
int[] array = {1, 2, 3};
modifyArray(array);
System.out.println(array[0]); // 输出: 10
}
public static void modifyArray(int[] arr) {
arr[0] = 10; // 修改数组元素
}
}
**PS:尽管传递的是引用值的副本,但无法在方法内部修改原始引用指向其他对象。**所以就算我们在方法内部对引用进行重新赋值,不会改变原始引用的指向。
小结:
在 Java 中方法参数的传递方式都是值传递。
- 对于基本数据类型,传递的是值的副本;
- 对于对象引用类型,传递的是引用值的副本。
方法的重载和重写
这里要涉及到一个面向对象编程(OOP)的概念:方法的重载(Method Overloading)和方法的重写(Method Overriding)是面向对象编程中的两个重要概念。
方法的重载
**是指在同一个类中可以有多个方法具有相同的名称,但参数列表不同。**重载方法通常用于实现相似的功能,但需要处理不同类型或数量的参数。通过方法的重载,可以为方法提供更大的灵活性和易用性。
方法的重载有以下特点:
- 方法名必须相同。
- 参数列表必须不同(参数的类型、个数或顺序不同)。
- 返回类型可以相同也可以不同,但不能仅仅依据返回类型来重载方法。
- 方法的重载与方法的修饰符、异常抛出等无关。
示例:
public class MyClass {
public void printMessage() {
System.out.println("Hello!");
}
public void printMessage(String message) {
System.out.println("Message: " + message);
}
public void printMessage(int count) {
for (int i = 0; i < count; i++) {
System.out.println("Hello!");
}
}
}
上面的例子中,我们在MyClass
类定义了三个名为 printMessage
的方法,它们具有相同的名称但参数列表不同。
- 第一个方法不接收任何参数,打印固定的消息;
- 第二个方法接收一个字符串参数,并打印带有该参数的消息;
- 第三个方法接收一个整型参数,根据参数的值打印多次相同的消息。
这就是方法重载的一个简单示例
方法的重写
是指子类对父类中已有的方法进行重新定义,以实现自己特定的行为。
在重写方法时,子类必须遵循以下规则:
- 方法名、参数列表和返回类型必须与父类中被重写的方法相同。
- 访问修饰符可以扩大(如从 protected 扩展到 public),但不能缩小(如从 public 缩小到 private)。
- 子类方法不能抛出比父类方法更多或更宽泛的异常,可以不抛出异常或抛出相同类型的异常。
示例:
class Animal {
public void makeSound() {
System.out.println("Animal is making a sound.");
}
}
class Dog extends Animal {
@Override
public void makeSound() {
System.out.println("Dog is barking.");
}
}
在上面的例子中,我们在Animal
类有一个 makeSound
方法,用于输出动物发出的声音。Dog
类继承自 Animal
类,并重写了 makeSound
方法,输出狗的叫声。
当通过 Dog
类创建对象并调用 makeSound
方法时,将执行 Dog
类中重写的方法,而不是从父类继承的方法。这就是方法的重写。
总结:
- 方法的重载是在同一个类中有多个方法具有相同名称但参数列表不同。
- 方法的重写是子类对父类中已有的方法进行重新定义,以实现自己特定的行为。
- 重载方法通过参数的不同来区分,而重写方法通过继承关系实现多态性。
PS:重载和重写是不同的概念
重载是在同一个类中发生的,而重写是基于继承关系的。
构造方法
基本概念:
**构造方法(Constructor)是在创建对象时被调用的特殊方法。**它用于初始化对象的状态,并可执行一些必要的操作。构造方法与类同名,没有返回类型,且在使用new
关键字实例化对象时被自动调用。
构造方法具有以下特点:
- 与类同名:构造方法的名称与所属类的名称完全相同,包括大小写。当创建类的实例时,会自动调用该类的构造方法。
- 无返回类型:构造方法没有返回类型,包括
void
,因为它的主要目的是初始化对象而不是返回值。 - 可以重载:一个类可以拥有多个构造方法,它们之间可以通过参数列表的类型、个数或顺序进行区分,从而实现构造方法的重载。
- 可以有访问修饰符:构造方法可以使用访问修饰符来限制对其访问的权限,如
public
、private
、protected
等。 - 默认构造方法:如果没有显式定义任何构造方法,Java编译器会自动提供一个无参数的默认构造方法。如果显式定义了构造方法,则默认构造方法将不会自动生成。
构造方法主要用于执行以下任务:
- 对象的初始化:构造方法可以对类的实例变量进行初始化,为对象的属性赋初值。
- 调用父类的构造方法:通过使用
super
关键字,构造方法可以调用父类的构造方法,以便进行父类对象的初始化。 - 执行必要的操作:构造方法可以执行一些必要的操作,如打开文件、建立数据库连接等。
下面是一个示例代码,展示了一个简单的Java类及其构造方法的定义:
public class Person {
private String name;
private int age;
// 构造方法
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// get方法和set方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
在上述代码中,我们在Person
类中创建了一个带有两个参数的构造方法,用于初始化name
和age
属性。通过使用构造方法,可以在创建Person
对象时传入相应的参数进行初始化。
PS:构造方法是用于初始化对象的特殊方法。它在创建对象时被自动调用,并负责进行对象的状态初始化和其他必要的操作。通过构造方法,可以确保对象在使用前处于有效的状态。
结尾语:记录于2023年7月24号16时00分,以上仅为个人在菜鸟教程—Java方法的学习过程中遇到的问题,还有记录的个人想法,有错误欢迎指出,感谢!