访问修饰符用于控制类、变量、方法和构造方法的访问级别。Java提供了四种不同的修饰符:
-
public:
- 公共访问级别,没有限制。
- 任何其他类都可以访问
public成员。
-
protected:
- 受保护的访问级别,只能被同一个包内的类或子类访问。
- 它是对
public和private的折中,提供了一定程度的封装。
-
default (没有修饰符):
- 如果没有指定访问修饰符,则使用默认访问级别。
- 只能被同一个包内的类访问。
-
private:
- 私有访问级别,最严格的限制。
- 只能被声明它的类内部访问,不能被任何其他类访问。
方法
方法(method)是执行特定任务的一段代码块,它是面向对象编程中实现封装和抽象的关键工具。方法可以执行计算、处理数据、执行操作等任务,并可以被其他方法或类调用。
- 方法必须先创建才可以使用,该过程称为
方法定义。 - 方法创建后并不是直接运行的。需要手动使用后,才执行,该过程称为
方法调用。
一个Java方法通常包含以下部分:
-
访问修饰符(可选):定义了方法的访问级别,如
public、private等。 -
返回类型:方法可能返回的数据类型,如果方法不返回任何值,则使用
void。 - 方法名:遵循驼峰命名法,描述方法功能的名称。
- 参数列表(可选):括号内的零个或多个参数,用于传递数据给方法。
- 方法体:花括号内的代码块,包含了实现方法功能的具体代码。
无参数方法的定义和调用
定义格式:
访问修饰符 static void 方法名 ( ) {
// 方法体;
}
调用格式 :
方法名();
每个方法在被调用执行的时候,都会进入栈内存,并且拥有自己独立的内存空间。方法内部代码调用完毕之后,会从栈内存中弹栈消失。
代码示例:
public class Demo01NoParameterMethod {
public static void main(String[] args) {
// 调用无参方法
multiplicationTables();
}
/*
* 定义一个无参方法,输出 99 乘法表
* */
public static void multiplicationTables() {
for (int i = 1; i <= 9; i++) {
for (int j = 1; j <= i; j++) {
System.out.print(j + " * " + i + " = " + (i * j)+" ");
}
System.out.println();
}
}
}
带参数方法定义和调用
定义格式:
-
参数:由数据类型和变量名组成
数据类型 变量名 - 方法定义时,参数中的数据类型与变量名都不能缺少,缺少任意一个程序将报错
访问修饰符 static void 方法名 (参数1) {
// 方法体;
}
访问修饰符 static void 方法名 (参数1, 参数2, 参数3...) {
// 方法体;
}
调用格式:
方法名(参数);
方法名(参数1,参数2);
形参和实参:
- 形参:形式参数,方法定义中的参数
- 实参:实际参数,方法调用时传入的参数
代码示例:
public class Demo01ParameterizedMethod {
public static void main(String[] args) {
int number = 25;
// 调用带参方法
isEvenNumber(number);
}
/*
* 定义一个带参方法,判断一个数是奇数还是偶数
* */
public static void isEvenNumber(int num){
if(num % 2 == 0){
System.out.println("偶数");
}else{
System.out.println("奇数");
}
}
}
带返回值方法的定义和调用
- 方法定义时return后面的返回值与方法定义上的数据类型要匹配,否则程序将报错
- 方法的返回值通常会使用变量接收,否则该返回值将无意义
定义格式:
访问修饰符 static 返回值类型 方法名 (参数1, 参数2, 参数3...) {
// 方法体;
return 返回值;
}
调用格式:
返回值类型 变量名 = 方法名 ( 参数1, 参数2, 参数3... ) ;
代码示例:
public class Demo02ReturnMethod {
public static void main(String[] args) {
int max = getMax(15, 20);
System.out.println("较大值为: " + max);
}
// 定义一个带参数和返回值的方法,声明两个形参, 返回其中的较大值
public static int getMax(int a, int b) {
if (a > b) {
return a;
} else {
return b;
}
}
}
方法重载
方法重载(Method Overloading)是面向对象编程中的一个特性,它允许在一个类中定义多个具有相同方法名但参数列表不同的方法。
方法重载使得你可以用同一个方法名执行不同类型的操作,而具体执行哪个方法则取决于传递给方法的参数。
方法重载的规则:
- 方法名相同:重载的方法必须具有相同的方法名。
- 参数列表不同:参数列表可以是不同数量的参数,或者参数的类型不同,或者参数的顺序不同。
- 返回类型不作为重载的依据:即使两个方法的返回类型相同,只要它们的参数列表不同,它们也可以被重载。
- 访问修饰符和异常类型不作为重载的依据:重载的方法可以有不同的访问权限或抛出不同的异常,但这不会影响方法重载的有效性。
方法重载的目的:
- 提高代码的可读性:方法重载允许你使用一致的方法名来执行相似的操作,这使得代码更易于阅读和理解。
- 增加代码的灵活性:通过提供多个重载方法,你可以为不同的数据类型或操作提供专门的实现。
- 减少方法名的冗余:你不需要为相似操作创建不同的方法名,从而避免了命名的冗余。
代码示例:
public class Demo03OverloadingMethod {
public static void main(String[] args) {
// 调用不同的重载方法
System.out.println("Square 传入 5: " + square(5)); // 调用重载方法1
System.out.println("Square 传入 3 & 4: " + square(3, 4)); // 调用重载方法2
System.out.println("Square 传入 5.0: " + square(5.0)); // 调用重载方法3
System.out.println("Square 传入 'hello': " + square("hello")); // 调用重载方法4
}
// 重载方法1:接受一个整数参数并返回其平方
public static int square(int number) {
return number * number;
}
// 重载方法2:接受两个整数参数并返回它们的乘积
public static int square(int a, int b) {
return a * b;
}
// 重载方法3:接受一个浮点数参数并返回其平方
public static double square(double number) {
return number * number;
}
// 重载方法4:接受一个字符串参数并返回其长度
public static int square(String str) {
// 获取字符串的长度
return str.length();
}
}
注意事项:
- 确保重载的方法具有不同的参数列表,否则它们不会被当作重载方法处理。
- 避免过度使用方法重载,过多的重载方法可能会导致代码难以理解和维护。
- 在实现重载方法时,确保方法的意图清晰,避免因为参数列表的微小变化而导致逻辑混淆。
方法的类型
方法可以根据它们的属性和用途分为几种不同的类型。选择合适的方法类型对于确保代码的模块化、性能和安全性至关重要。
静态方法(Static Methods):
静态方法属于类本身,而不是类的某个特定实例。它们可以在没有创建类的对象的情况下调用。静态方法不能直接访问类的实例变量或实例方法,但可以访问类的静态成员。
实例方法(Instance Methods):
实例方法是与对象实例相关联的方法。它们可以访问和操作对象的状态,即类的实例变量。实例方法需要通过类的对象来调用。
构造方法(Constructors):
构造方法是一种特殊的方法,用于创建和初始化对象。它们的名称必须与类名相同,并且没有返回类型,连void也不写。构造方法可以是重载的,这意味着一个类可以有多个构造方法,只要它们的参数列表不同。
抽象方法(Abstract Methods):
抽象方法是在抽象类中声明的方法,它没有具体的实现(即没有方法体)。抽象方法必须由抽象类的子类具体实现。抽象方法使用abstract关键字声明。
本地方法(Local Methods):
本地方法(也称为嵌套方法)是在另一个方法内部定义的方法。它们只能在包含它们的方法或类中调用。本地方法可以访问包含它们的外部方法的局部变量。
同步方法(Synchronized Methods):
同步方法用于控制对共享资源的并发访问。当方法被声明为synchronized时,它确保在同一时间只有一个线程可以执行该方法。
原生方法(Native Methods):
原生方法是使用Java Native Interface(JNI)声明的方法,它们允许Java代码与本地代码(如C或C++)交互。原生方法使用native关键字声明,并且必须在Java类外部实现。