Java 访问修饰符和方法

访问修饰符用于控制类、变量、方法和构造方法的访问级别。Java提供了四种不同的修饰符:

  • public:
    • 公共访问级别,没有限制。
    • 任何其他类都可以访问public成员。
  • protected:
    • 受保护的访问级别,只能被同一个包内的类或子类访问。
    • 它是对publicprivate的折中,提供了一定程度的封装。
  • default (没有修饰符):
    • 如果没有指定访问修饰符,则使用默认访问级别。
    • 只能被同一个包内的类访问。
  • private:
    • 私有访问级别,最严格的限制。
    • 只能被声明它的类内部访问,不能被任何其他类访问。

方法

方法(method)是执行特定任务的一段代码块,它是面向对象编程中实现封装和抽象的关键工具。方法可以执行计算、处理数据、执行操作等任务,并可以被其他方法或类调用。

  • 方法必须先创建才可以使用,该过程称为方法定义
  • 方法创建后并不是直接运行的。需要手动使用后,才执行,该过程称为方法调用

一个Java方法通常包含以下部分:

  • 访问修饰符(可选):定义了方法的访问级别,如publicprivate等。
  • 返回类型:方法可能返回的数据类型,如果方法不返回任何值,则使用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类外部实现。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容