Java里的4种访问修饰符(private、protected、public和默认)
在 Java 程序中,我们经常看到 public、private 之类的关键字,它们统称为访问修饰符,既可以用来修饰类,也可以用来修饰方法和属性。
访问修饰符用于控制指定元素(类、接口、方法、属性)的可访问性,比如我们将一个类的属性设为私有,则它只能在该类中被访问,其他类无法直接访问它。
Java 一共包含 4 种访问修饰符,分别为 private、默认、protected 和 public。
下面我们通过一张表格来详细看看 4 种访问修饰符的访问控制范围。
例如:
【实例 1】默认访问修饰符。
【实例 2】相同包访问默认类。
【实例 3】不同包访问默认类。
【实例 4】protected 修饰符。
【实例 5】访问 protected 属性及方法。
【实例 6】 public 修饰符。
【实例 7】 访问 public 属性及方法。
在了解了 Java 中的 4 种访问修饰符后,我们来总结一下访问修饰符的作用。
从字面上理解,修饰符的作用就是用于控制访问。对于某些私有的数据,需要通过访问控制来防止不正当的数据操作。从类的角度来看,通过对数据和方法的访问控制可以实现封装性,该类就好比是一个黑箱供开发者使用,而其内部的具体实现则禁止被随意修改。
访问修饰符用于控制指定元素(类、接口、方法、属性)的可访问性,比如我们将一个类的属性设为私有,则它只能在该类中被访问,其他类无法直接访问它。
Java 一共包含 4 种访问修饰符,分别为 private、默认、protected 和 public。
下面我们通过一张表格来详细看看 4 种访问修饰符的访问控制范围。
访问修饰符 | 类内部 | 同一个包内 | 不同包的子类 | 不同包的非子类 |
---|---|---|---|---|
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 种访问修饰符后,我们来总结一下访问修饰符的作用。
从字面上理解,修饰符的作用就是用于控制访问。对于某些私有的数据,需要通过访问控制来防止不正当的数据操作。从类的角度来看,通过对数据和方法的访问控制可以实现封装性,该类就好比是一个黑箱供开发者使用,而其内部的具体实现则禁止被随意修改。