Java基础分享,一篇文章说透Java访问修饰符

开发 后端
java中有四种访问修饰符:private、default(无相应保留字)、protected和public。

1. 前言

Java中有四种访问修饰符:private、default(无相应保留字)、protected和public。

今天,就让我们来了解一下这四种访问修饰符合元素的访问限制吧!

从强到弱依次是private、default、protected和public。

2. 访问修饰符介绍

java中有四种访问修饰符:private、default(无相应保留字)、protected和public。其含义如下:

  • private:如果一个元素声明为private,则元素的访问权限仅限于当前类。
  • default:如果一个元素声明为default,则元素的访问权限仅限于当前包。
  • protected:如果一个元素声明为protected,则有当前包下的元素或其子类可以访问该元素。
  • public:如果一个元素声明为public,则所有位置都可以调用元素(无论是在同一类中还是在同一包内)。

四种访问修饰符合元素的访问限制,从强到弱依次是private、default、protected、public。如果类A和类B的访问修饰符是public,当类A中的一个方法想要调用类B中的一个方法时,可以根据下图确定可访问性: 

 

3. 以下示例说明四种修饰符对元素的访问限制

3.1 private

类B中的方法要调用同包下A的private方法,编译时会报错: 

  1. package p1 
  2.  
  3. class A { 
  4.     private String getName(){ 
  5.         return "jim"
  6.     } 
  7.  
  8.     public void display(){ 
  9.         System.out.println(this.getName()); 
  10.     } 
  11.  
  12. package p1 
  13.  
  14. class B{ 
  15.     public void display(){ 
  16.         A a = new A(); 
  17.         System.out.println(a.getName()); 
  18.     } 

3.2 default

类C中的方法要调用不同包下类A的default方法,编译时会报错: 

  1. package p1 
  2.  
  3. public class A { 
  4.     String getName(){ 
  5.         return "jim"
  6.     } 
  7.  
  8. package p1 
  9.  
  10. public class B{ 
  11.     public void display(){ 
  12.         A a = new A(); 
  13.         System.out.println(a.getName()); 
  14.     } 
  15.  
  16. package p2 
  17.  
  18. public class C { 
  19.     public void display(){ 
  20.         A a = new A(); 
  21.         System.out.println(a.getName()); 
  22.     } 

3.3 protected

类C中的方法要调用类A的protected方法,编译时会报错: 

  1. package p1 
  2.  
  3. public class A { 
  4.     protected String getName(){ 
  5.         return "jim"
  6.     } 
  7.  
  8. package p2 
  9.  
  10. public class B extends A { 
  11.     public void display(){ 
  12.         System.out.println(super.getName()); 
  13.     } 
  14.  
  15. package p2 
  16.  
  17. public class C { 
  18.     public void display(){ 
  19.         A a = new A(); 
  20.         System.out.println(a.getName()); 
  21.     } 

3.4 public

无访问限制。 

  1. package p1 
  2.  
  3. public class A { 
  4.     public String getName(){ 
  5.         return "jim"
  6.     } 
  7.  
  8. package p2 
  9.  
  10. public class B { 
  11.     public void display(){ 
  12.         A a = new A(); 
  13.         System.out.println(a.getName()); 
  14.     } 

4. 当子类隐藏(hide)或覆盖(override)父类方法时,对访问修饰符的限制

当子类中的方法隐藏/覆盖父类中的方法时,与父类中相应方法的访问修饰符相比,子类方法的访问修饰符的访问限制应相同或更弱。这是面向对象的基本原则,即子类应该比父类更完美,因此子类的可访问性应该更强。

举例如下: 

  1. class Father { 
  2.  
  3.     protected static void staticMethod() { 
  4.  
  5.     } 
  6.  
  7.     public void method() { 
  8.  
  9.     } 
  10.  
  11. class Son extends Father { 
  12.  
  13.     static void staticMethod() { 
  14.  
  15.     } 
  16.  
  17.     protected void method() { 
  18.  
  19.     } 

5. 元素支持的访问修饰符。

每个元素(如类别、接口、注释、结构函数、成员变量、成员方法等)都会显示或隐示访问修改符,但并不是每个元素都支持四个访问修改符: 

  • 对于直接定义在包中的元素,如类、枚举(本质是继承Enum的类)、接口和注释(本质是继承Anotation的接口),他们支持的访问修饰符是public和default。
  • 对于定义在类内的元素,如构造函数、成员变量、成员方法、内部类别、内部接口等,他们支持所有四种访问修改符。
  • 对于界面中定义的方法,只支持public(如果不指定,则默认public);对于界面中定义的变量,只支持public static final(如果不指定,则默认public static final)。补充说明:界面支持三种方法,即无消息体的方法(默认修饰符为public abstract),通过default保留字定义(默认修饰符为public),通过static保留字定义(默认修饰符为public)。
责任编辑:华轩 来源: 今日头条
相关推荐

2021-07-01 10:01:16

JavaLinkedList集合

2009-06-12 13:37:47

访问权限修饰符Java教程

2022-11-04 10:45:11

Java基础CPU

2023-05-08 08:21:15

JavaNIO编程

2021-05-31 08:59:57

Java数据库访问JDBC

2017-09-04 13:44:00

Java

2009-06-19 10:51:39

Scalapackage访问修饰符

2009-08-24 16:49:39

C#修饰符

2021-03-04 08:34:54

Java交换变量字符串基础

2020-12-21 08:09:55

Java数据方法

2021-02-24 10:14:04

PythonClassPython基础

2009-09-04 11:06:40

C#访问修饰符

2017-09-05 08:52:37

Git程序员命令

2020-12-29 09:05:48

基础DjangoORM

2020-10-09 08:15:11

JsBridge

2017-06-08 22:41:34

框架标签

2021-04-14 10:00:44

Python运算符重载

2020-10-22 08:33:22

Go语言

2020-11-11 10:52:54

Go语言C语言

2020-10-22 11:15:47

Go语言变量
点赞
收藏

51CTO技术栈公众号