Java访问修饰符–public, private, protected, default

时间:2020-01-09 10:34:49  来源:igfitidea点击:

Java中的访问级别修饰符用于设置类,接口的可见性以及类的字段,方法和构造函数的可见性。访问级别修饰符确定其他类是否可以使用特定字段或者调用给定类的特定方法。

Java中的访问修饰符类型

有四个Java访问修饰符 public, private, protected, default(公共,私有,受保护,默认)

  • Private-专用访问修饰符指定只能在其自己的类中访问该成员。

  • Default(package-private)–如果未指定修饰符,则表示默认访问。使用默认访问修饰符类,字段和方法在同一包中可见。

  • Protected– Java中的受保护访问修饰符比默认访问要宽松一些。除了在同一包中可见的类成员之外,任何包中的子类还可以访问它们。

  • Public-如果使用公共访问修饰符,则该类对所有地方的所有类都是可见的。

Java中的访问修饰符适用性

Java的顶级类只能是公共的,也可以是包私有的,尽管内部类也可以具有私有或者受保护的访问权。

类字段,方法和构造函数可以具有四个访问修饰符中的任何一个。

下表总结了可与类内部类,字段,方法和构造函数一起使用的访问修饰符。

私有默认受保护公共
类别NYN
内部类YYY
字段YYY
方法YYY
NYN
内部类YYY
字段YYY
方法YYY
构造函数YYY

私人访问修饰符

Java中的私有访问修饰符不能与顶级类一起使用。拥有一个不能被其他任何类访问的类是没有用的,因此尽管嵌套类可以标记为私有,但顶层类不允许使用私有访问修饰符。

具有私有访问修饰符的字段或者方法可以在声明它们的类中进行访问。通常,类字段被标记为私有,如果必须从类外部访问它们,则必须通过标记为公共的getter和setter来完成。

public class MyClass {
  private String name;
  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }
}

public class MainClass {
  public static void main(String[] args) {
    MyClass myObj = new MyClass();
    myObj.setName("theitroad");
    System.out.println("Name- " + myObj.getName());
  }
}

输出:

Name- theitroad

构造函数也可以标记为私有。如果一个类只有私有构造函数,则该类的实例只能由该类创建。

例如

public class MyClass {
  private MyClass() {
    
  }
  private String name;

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }
}

然后,以下代码将导致错误"构造函数MyClass()不可见"。

public class MainClass {
  public static void main(String[] args) {
    // Compile time error
    MyClass myObj = new MyClass();
    myObj.setName("theitroad");
    System.out.println("Name- " + myObj.getName());
  }
}

默认访问修饰符

如果我们未在class或者其成员中指定任何访问修饰符,则表示默认访问权限,也称为包私有访问。
具有默认访问权限的类只能由同一包中的类访问。

具有默认访问权限的类的字段,方法和构造函数的相同方式只能由具有相同包的类访问。

例如,假设我们有一个MyClass类,该类的方法具有默认访问权限,并且该类位于com.theitroad.programs包中

package com.theitroad.programs;

public class MyClass {	
  private String name;

  String getName() {
    return name;
  }

  void setName(String name) {
    this.name = name;
  }
}

然后,另一个包中的类将无法访问上述类的方法。

package com.theitroad;

import com.theitroad.programs.MyClass;

public class MainClass {	
  public static void main(String[] args) {
    MyClass myObj = new MyClass();
    // error
    myObj.setName("theitroad");
    System.out.println("Name- " + myObj.getName());
  }
}

这段代码将给出错误" MyClass类型的getName()方法不可见"和" MyClass类型的setName()方法不可见"。

受保护的访问修饰符

受保护的访问修饰符可提供同一程序包中的可见性,就像默认访问权限以及同一程序包或者其他程序包中的子类的可见性一样。

顶级访问权限不能使用受保护的访问修饰符。

该类的字段,方法或者构造函数可以标记为受保护。

例如,假设我们有一个MyClass类,该类的构造函数和方法具有受保护的访问权限,并且该类位于com.theitroad.programs包中

public class MyClass {
  protected MyClass() {
    System.out.println("in Constructor of MyClass");
  }
  private String name;

  protected String getName() {
    return name;
  }

  protected void setName(String name) {
    this.name = name;
  }
}

然后,只有另一个包中的一个类是该类的子类,该类才能访问该类的方法。

public class MainClass extends MyClass {
  public static void main(String[] args) {
    MainClass myObj = new MainClass();
    myObj.setName("theitroad");
    System.out.println("Name- " + myObj.getName());
  }
}

输出:

in Constructor of MyClass
Name- theitroad

公共访问修饰符

公共访问修饰符没有可见性限制。可以从任何包中的任何其他班级访问标记为public的班级或者班级成员。

类成员访问权限总结

下表显示了Java中具有不同访问修饰符的类成员的访问级别。

PrivateNo ModifierProtectedPublic
同一类
同一包中的子类
同一个包中的另一个类
不同包中的子类
另一个不同包的类