首页 > 编程笔记 > Java笔记 阅读:41

Java里的4种访问修饰符(private、protected、public和默认)

在 Java 程序中,我们经常看到 public、private 之类的关键字,它们统称为访问修饰符,既可以用来修饰类,也可以用来修饰方法和属性。

访问修饰符用于控制指定元素(类、接口、方法、属性)的可访问性,比如我们将一个类的属性设为私有,则它只能在该类中被访问,其他类无法直接访问它。

Java 一共包含 4 种访问修饰符,分别为 private、默认、protected 和 public。

下面我们通过一张表格来详细看看 4 种访问修饰符的访问控制范围。

表:Java访问修饰符
访问修饰符 类内部 同一个包内 不同包的子类 不同包的非子类
private 可访问 不可访问 不可访问 不可访问
默认 可访问 可访问 不可访问 不可访问
protected 可访问 可访问 可访问 不可访问
public 可访问 可访问 可访问 可访问

Java private访问修饰符

private 表示私有的,对于被它声明的元素(变量或方法),只能在当前类内部对其进行访问。注意,该修饰符不能用于修饰类和接口。

例如:
public class ModifierPrivateTest {
    public static void main(String[] args) {
        Box box = new Box();
        System.out.println(box.name);
        box.open();
    }
}

class Box {
   
}private String name;

    private void open() {
        System.out.println("open box");
    }
}
其中 Box 类中定义了一个 private 的变量和一个 private 的方法。我们在另一个 ModifierPrivateTest 类中通过 box 对象访问它的 name 变量和 open 方法,此时将会导致编译错误,具体错误消息为“The field Box.name is not visible”和“The method open() from the type Box is not visible”。可以看到由于它们都是私有的,因此不能被其他类访问。

Java默认访问修饰符

默认表示不使用任何访问修饰符,默认情况下的方法、属性、类和接口只能被相同包下的类访问,其他包的类无法访问。

【实例 1】默认访问修饰符。
package com.seaboat;

class Box {
    String name = "box";
   
    void open() {
         System.out.println("open box");
    }
}

【实例 2】相同包访问默认类。
package com.seaboat;

public class ModifierDefaultTest {
    public static void main(String[] args) {
        Box box = new Box();
        System.out.println(box.name);
        box.open();
    }
}

【实例 3】不同包访问默认类。
package com.seaboat.test;

import com.seaboat.Box;

//不能访问Box
public class ModifierDefaultTest {
    public static void main(String[] args) {
        Box box = new Box();
        System.out.println(box.name);
        box.open();
    }
}
在 com.seaboat 包下创建 Box 类,该类及其所包含的变量和方法都为默认的。在 com.seaboat 包下创建一个 ModifierDefaultTest 类,由于是在相同包下,因此它可以访问 Box 类。但如果 ModifierDefaultTest 类创建在 com.seaboat.test 包下则无法访问 Box 类,编译时会报“The type com.seaboat.Box is not visible”的错误。

Java protected访问修饰符

protected表示受保护的,被它声明的元素(变量或方法)可以被相同包下的其他类访问,也可以被不同包下的子类访问。注意,该修饰符同样不能用于修饰类和接口。

【实例 4】protected 修饰符。
package com.seaboat;

public class Ball {
    protected String name = "ball";

    protected void play() {
        System.out.println("play ball");
    }
}

【实例 5】访问 protected 属性及方法。
package com.seaboat.test;

import com.seaboat.Ball;

public class ModifierProtectedTest extends Ball {
    public static void main(String[] args) {
        ModifierProtectedTest ball = new ModifierProtectedTest();
        System.out.println(ball.name);
        ball.play();
    }
}
观察上面两个实例程序,我们在 com.seaboat 包下创建了一个 Ball 类,该类中的变量和方法都被声明为 protected。然后在 com.seaboat.test 包下创建一个 Ball 类的子类 ModifierProtectedTest,那么在该类中是可以访问 Ball 类中的属性和方法的,尽管它们不在同一个包中。

Java public访问修饰符

public表示公有的,被它声明的元素(类、接口、变量或方法)可以被所有类访问。

【实例 6】 public 修饰符。
package com.seaboat;

public class Car {
    public String name = "car";

    public void drive() {
        System.out.println("driving car");
    }
}

【实例 7】 访问 public 属性及方法。
package com.seaboat.test;

import com.seaboat.Car;

public class ModifierPublicTest {
    public static void main(String[] args) {
        Car car = new Car();
        System.out.println(car.name);
        car.drive();
    }
}
观察上面两个实例程序,我们在 com.seaboat 包下创建一个 public 的 Car 类,把该类的变量和方法都声明为 public,那么在任意包下的任意类都可以访问该类的变量和方法。

在了解了 Java 中的 4 种访问修饰符后,我们来总结一下访问修饰符的作用。

从字面上理解,修饰符的作用就是用于控制访问。对于某些私有的数据,需要通过访问控制来防止不正当的数据操作。从类的角度来看,通过对数据和方法的访问控制可以实现封装性,该类就好比是一个黑箱供开发者使用,而其内部的具体实现则禁止被随意修改。

相关文章