Java Access 更新

Java是一种面向对象的编程语言,提供了四种访问修饰符来控制类、方法和变量的访问级别。这四种访问修饰符分别是publicprivateprotected和默认的(即不使用任何修饰符)。

访问修饰符决定了其他类是否可以访问某个类、方法或变量。在Java中,访问级别是从高到低排列的,即public是最高级别的,而默认的是最低级别的。

  • public:使用public修饰的成员可以被任何其他类访问。这是最高级别的访问权限,也是最常用的访问修饰符。

  • private:使用private修饰的成员只能在所属类内部访问。这是最低级别的访问权限,用于限制对类的内部实现的访问。

  • protected:使用protected修饰的成员可以被同一个包内的类访问,以及其他包中的子类访问。这个访问级别在继承关系中很有用。

  • 默认的访问级别:如果没有使用任何访问修饰符来修饰类、方法或变量,则它们具有默认的访问级别。在类成员的访问控制中,与protected类似,但默认的访问级别没有继承关系的限制。

下面我们通过一些代码示例来演示这些访问修饰符的使用。

首先,我们创建一个名为 Person 的公共类,在这个类中定义了一个公共字段 name 和一个私有方法 sayHello

public class Person {
    public String name; // 公共字段

    private void sayHello() { // 私有方法
        System.out.println("Hello, my name is " + name);
    }
}

接下来,我们创建一个名为 Main 的类,在这个类中实例化 Person 类,并访问其公共字段和私有方法:

public class Main {
    public static void main(String[] args) {
        Person person = new Person();
        person.name = "John"; // 访问公共字段
        System.out.println(person.name); // 输出:John
        person.sayHello(); // 编译错误,无法访问私有方法
    }
}

在上面的示例中,我们可以看到,由于name字段被声明为公共的,我们可以在 Main 类中直接访问该字段,并将其值设置为John。而对于 sayHello 方法,由于它被声明为私有的,我们无法在 Main 类中直接调用它。

接下来,我们尝试在不同的包中使用 protected 访问修饰符。

我们首先在 com.example 包中创建一个名为 Animal 的类,其中定义了一个受保护的方法 makeSound

package com.example;

public class Animal {
    protected void makeSound() {
        System.out.println("The animal makes a sound");
    }
}

然后,在另一个包 com.example.subpackage 中创建一个名为 Dog 的类,它继承自 Animal 类,并重写了 makeSound 方法:

package com.example.subpackage;

import com.example.Animal;

public class Dog extends Animal {
    @Override
    protected void makeSound() {
        System.out.println("The dog barks");
    }
}

最后,在 Main 类中创建一个 Dog 类的实例,并调用其 makeSound 方法:

import com.example.subpackage.Dog;

public class Main {
    public static void main(String[] args) {
        Dog dog = new Dog();
        dog.makeSound(); // 输出:The dog barks
    }
}

在上面的示例中,我们可以看到,虽然 makeSound 方法在 Animal 类中被声明为受保护的,但是由于 Dog 类继承自 Animal 类,并且在同一个包中,所以我们可以在 Dog 类中重写该方法,并在 Main 类中调用 Dog 类的实例