1.3 Java中的public,protected,package-private和private有什么区别?| Java Debug 笔记

1,059 阅读2分钟

本文正在参加「Java主题月 - Java Debug笔记活动」,详情查看<活动链接>

提问:Java中的public,protected,package-private和private有什么区别?

在Java中,有没有关于在使用class和interface处理继承关系的时候何时使用各种访问修饰符,即默认的default,显式声明public,protected和private?

既然有人引用了官方文档,那不妨我直接用文档的内容来回答:

访问修饰符确定其他类是否可以使用本类中的属性或方法时,有两个级别的访问控制。

  • 在类名前 public和 package-private(默认,无须显式设置)
public class User{
    //
}
class Node{
//
}
  • 在属性或方法前面 public 和 private 和 protected 以及 package-private(默认,无须显式设置)
public class User{
    private String username;
    protected int userLevel;
    ArrayList<Integer> friends;
    public String getName(){
        return this.username;
    }
}

可以使用public修饰符声明一个类,在这种情况下,该类对于所有地方的所有类都是可见的。如果一个类没有修饰符(默认值,也称为package-private),则它仅在其自己的包中可见。

在成员级别,也可以像类名字前面一样使用public修饰符或不使用修饰符(package-private),并且含义相同。对于成员,还有两个附加的访问修饰符:private和protected。private修饰符指定了成员只能在自己的类访问。

对于protected级别的修饰符,需要特别说明一下,protected在文档中被描述为被protected修饰的成员对于本包和其子类可见,这会让读者产生困惑,并在面试中被面试官问到“如果继承的该类的子类与该类不再同一个包中”这类问题。

被protected修饰的成员对于本包和其子类可见,可以从两个角度理解:

  • 父类的protected成员是包内可见的,并且对子类可见;
  • 若子类与父类不在同一包中,那么在子类中,子类实例可以访问其从父类继承而来的protected方法,而不能访问父类实例的protected方法。