1.Java有三种访问权限修饰符,分别为public、protected、private,还有一种为缺省权限修饰符的情况,记为default。其中,可以由public和default来修饰类;这四种修饰符都可以修饰成员变量和成员方法。每一种修饰符对应不同的访问范围,下面以下图为例详细说明。

图1

  • private只可以覆盖圆1,即只有本类可以访问;
  • default可以覆盖到圆3,即本类、同包子类、同包其他类都可以访问,简单说就是与本类同包的所有类都可以访问;
  • protected可以覆盖到圆4,即本类、同包子类、同包其他类、其他包中的子类都可以访问,简单说就是与本类同包的类及其他包中的子类都可以访问;
  • public可以覆盖到圆5,即本类、同包子类、同包其他类、其他包子类、其他包其他类都可以访问,简单说就是所有类都可以访问;

注:在与父类不同包的子类中,如果通过子类对象访问和调用父类中由protected修饰的变量和方法,确实可以;但如果通过父类的对象访问和调用的话,则不可以访问protected修饰的变量和方法,具体见下文的(6)和(7)。具体原因还未了解。

2.下面以简单的程序验证上述结论。

前提:

  • 包human中定义了类Person,Student,DustMan;其中,Student是Person的子类,DustMan不是Person的子类。
  • 包teacher中定义了类Teacher,GateMan;其中,Teacher是Person的子类,GateMan不是Person的子类。
  • Person中定义了四个成员变量和四个成员方法,分别以public,protected,缺省,private修饰,详见下面代码:
        String name;public String education;private String hobby;protected String residence;public void testModifierPublic() {System.out.println("Public");}protected void testModifierProtected() {System.out.println("Protected");}void testModifierDefault() {System.out.println("Default");}private void testModifierPrivate() {System.out.println("Private");}

  

(1),在Person类中定义Person类对象pOwn,分别访问和调用这些成员变量和成员方法,详见下面的代码:

  public static void main(String[] args) {Person pOwn = new Person("xi",20,"female","bachelor","recite","NJ");System.out.println("public education: " + pOwn.education);System.out.println("protected residence: " + pOwn.residence);System.out.println("default name: " + pOwn.name);System.out.println("private hobby: "+ pOwn.hobby);pOwn.testModifierPublic();pOwn.testModifierProtected();pOwn.testModifierDefault();pOwn.testModifierPrivate();}

输出结果为:

public education: bachelor
protected residence: NJ
default name: xi
private hobby: recite
Public
Protected
Default
Private

结果分析:Person类对象可以在本类中访问和调用由public、protected、default、private修饰的成员变量和成员方法。

(2).在Student类中分别定义Student类对象sSamePackChild和Person类对象pSamePackChild,并分别访问和调用这些成员变量和成员方法,详见下面的代码:

  public static void main(String[] args) {    Student sSamePackChild = new Student("xi",20,"female","bachelor","recite","NJ");Person pSamePackChild = new Person("xi",20,"female","bachelor","recite","NJ");System.out.println("public education: " + sSamePackChild.education);System.out.println("protected residence: " + sSamePackChild.residence);System.out.println("default name: " + sSamePackChild.name);System.out.println("private hobby: "+ sSamePackChild.hobby);sSamePackChild.testModifierPublic();sSamePackChild.testModifierProtected();sSamePackChild.testModifierDefault();sSamePackChild.testModifierPrivate();System.out.println("public education: " + pSamePackChild.education);System.out.println("protected residence: " + pSamePackChild.residence);System.out.println("default name: " + pSamePackChild.name);System.out.println("private hobby: "+ pSamePackChild.hobby);pSamePackChild.testModifierPublic();pSamePackChild.testModifierProtected();pSamePackChild.testModifierDefault();pSamePackChild.testModifierPrivate();}

输出结果为:

        Exception in thread "main" java.lang.Error: Unresolved compilation problems: The field Person.hobby is not visibleThe method testModifierPrivate() from the type Person is not visibleThe field Person.hobby is not visibleThe method testModifierPrivate() from the type Person is not visibleat human.Student.main(Student.java:108)

结果分析:出现编译错误,提示private修饰的hobby和testModifierPrivate()不可见。

(3).根据(2)提示的错误,注释掉相关的行,再次执行,详见代码:

   public static void main(String[] args) {    Student sSamePackChild = new Student("xi",20,"female","bachelor","recite","NJ");Person pSamePackChild = new Person("xi",20,"female","bachelor","recite","NJ");System.out.println("public education: " + sSamePackChild.education);System.out.println("protected residence: " + sSamePackChild.residence);System.out.println("default name: " + sSamePackChild.name);
//      System.out.println("private hobby: "+ sSamePackChild.hobby);sSamePackChild.testModifierPublic();sSamePackChild.testModifierProtected();sSamePackChild.testModifierDefault();
//      sSamePackChild.testModifierPrivate();System.out.println("public education: " + pSamePackChild.education);System.out.println("protected residence: " + pSamePackChild.residence);System.out.println("default name: " + pSamePackChild.name);
//      System.out.println("private hobby: "+ pSamePackChild.hobby);pSamePackChild.testModifierPublic();pSamePackChild.testModifierProtected();pSamePackChild.testModifierDefault();
//      pSamePackChild.testModifierPrivate();}

输出结果为:

public education: bachelor
protected residence: NJ
default name: xi
Public
Protected
Default
public education: bachelor
protected residence: NJ
default name: xi
Public
Protected
Default

结果分析:

注释掉private修饰的行后,成功执行;

Person类对象可以在与父类同包的子类Student中访问和调用由public、protected、default修饰的成员变量和成员方法,不能访问由private修饰的变量和方法;

在子类中定义的Student类对象也拥有同样的访问权限。

(4).在DustMan类中定义Person类对象pSamePackNonChild,分别访问和调用这些成员变量和成员方法,详见下面的代码:

package human;public class DustMan {public static void main(String[] args) {Person pSamePackNonChild = new Person("xi",20,"female","bachelor","recite","NJ");System.out.println("public education: " + pSamePackNonChild.education);System.out.println("protected residence: " + pSamePackNonChild.residence);System.out.println("default name: " + pSamePackNonChild.name);System.out.println("private hobby: "+ pSamePackNonChild.hobby);pSamePackNonChild.testModifierPublic();pSamePackNonChild.testModifierProtected();pSamePackNonChild.testModifierDefault();pSamePackNonChild.testModifierPrivate();}
}

输出结果为:

        Exception in thread "main" java.lang.Error: Unresolved compilation problems: The field Person.hobby is not visibleThe method testModifierPrivate() from the type Person is not visibleat human.DustMan.main(DustMan.java:19)

结果分析:出现编译错误,提示private修饰的hobby和testModifierPrivate()不可见。

(5).根据(4)提示的错误,注释掉相关的行,再次执行,详见代码:

package human;public class DustMan {public static void main(String[] args) {      Person pSamePackNonChild = new Person("xi",20,"female","bachelor","recite","NJ");System.out.println("public education: " + pSamePackNonChild.education);System.out.println("protected residence: " + pSamePackNonChild.residence);System.out.println("default name: " + pSamePackNonChild.name);
//      System.out.println("private hobby: "+ pSamePackNonChild.hobby);pSamePackNonChild.testModifierPublic();pSamePackNonChild.testModifierProtected();pSamePackNonChild.testModifierDefault();
//      pSamePackNonChild.testModifierPrivate();}
}

输出结果为:

public education: bachelor
protected residence: NJ
default name: xi
Public
Protected
Default

结果分析:

注释掉private修饰的行后,成功执行;

Person类对象可以在与Person同包的非子类中访问和调用由public、protected、default修饰的成员变量和成员方法,不能访问由private修饰的变量和方法。

(6).在Teacher类中定义Teacher类对象tDiffPackChild和Person类对象pDiffPackChild,并分别访问和调用这些成员变量和成员方法,详见下面的代码:

package teacher;
import human.Person;public class Teacher extends human.Person {String duty;public Teacher() {}public Teacher(String d) {super();this.duty = d;}public Teacher(String n, int a, String g, String e, String h, String r) {super(n,a,g,e,h,r);}public static void main(String[] args) {Teacher tDiffPackChild = new Teacher("xi",20,"female","bachelor","recite","NJ");Person pDiffPackChild = new Person("xi",20,"female","bachelor","recite","NJ");System.out.println("public education: " + tDiffPackChild.education);System.out.println("protected residence: " + tDiffPackChild.residence);System.out.println("default name: " + tDiffPackChild.name);System.out.println("private hobby: "+ tDiffPackChild.hobby);tDiffPackChild.testModifierPublic();tDiffPackChild.testModifierProtected();tDiffPackChild.testModifierDefault();tDiffPackChild.testModifierPrivate();System.out.println("public education: " + pDiffPackChild.education);System.out.println("protected residence: " + pDiffPackChild.residence);System.out.println("default name: " + pDiffPackChild.name);System.out.println("private hobby: "+ pDiffPackChild.hobby);pDiffPackChild.testModifierPublic();pDiffPackChild.testModifierProtected();pDiffPackChild.testModifierDefault();pDiffPackChild.testModifierPrivate();}
}

输出结果为:

        Exception in thread "main" java.lang.Error: Unresolved compilation problems: The field Person.name is not visibleThe field Person.hobby is not visibleThe method testModifierDefault() from the type Person is not visibleThe method testModifierPrivate() from the type Person is not visibleThe field Person.residence is not visibleThe field Person.name is not visibleThe field Person.hobby is not visibleThe method testModifierProtected() from the type Person is not visibleThe method testModifierDefault() from the type Person is not visibleThe method testModifierPrivate() from the type Person is not visibleat teacher.Teacher.main(Teacher.java:39)

结果分析:

出现编译错误,对于定义的Teacher类对象tDiffPackChild而言,对其的变量访问和方法调用提示,default修饰的name和testModifierDefault()、private修饰的hobby和testModifierPrivate()不可见;

对于定义的Person类对象pDiffPackChild而言,对其的变量访问和方法调用提示,protected修饰的residence和testModifierProtected()、default修饰的name和testModifierDefault()、private修饰的hobby和testModifierPrivate()不可见。

(7).根据(6)提示的错误,注释掉相关的行,再次执行,详见代码:

package teacher;
import human.Person;public class Teacher extends human.Person {String duty;public Teacher() {}public Teacher(String d) {super();this.duty = d;}public Teacher(String n, int a, String g, String e, String h, String r) {super(n,a,g,e,h,r);}public static void main(String[] args) {   Teacher tDiffPackChild = new Teacher("xi",20,"female","bachelor","recite","NJ");Person pDiffPackChild = new Person("xi",20,"female","bachelor","recite","NJ");System.out.println("public education: " + tDiffPackChild.education);System.out.println("protected residence: " + tDiffPackChild.residence);
//      System.out.println("default name: " + tDiffPackChild.name);
//      System.out.println("private hobby: "+ tDiffPackChild.hobby);tDiffPackChild.testModifierPublic();tDiffPackChild.testModifierProtected();
//      tDiffPackChild.testModifierDefault();
//      tDiffPackChild.testModifierPrivate();System.out.println("public education: " + pDiffPackChild.education);
//      System.out.println("protected residence: " + pDiffPackChild.residence);
//      System.out.println("default name: " + pDiffPackChild.name);
//      System.out.println("private hobby: "+ pDiffPackChild.hobby);pDiffPackChild.testModifierPublic();
//      pDiffPackChild.testModifierProtected();
//      pDiffPackChild.testModifierDefault();
//      pDiffPackChild.testModifierPrivate();}
}

输出结果为:

public education: bachelor
protected residence: NJ
Public
Protected
public education: bachelor
Public

结果分析:

注释掉相关的行后,成功执行;

如果在与Person不同包的子类Teacher中定义了Teacher类对象,则通过该对象可以访问和调用Person中public和protected修饰的成员变量和成员方法,default、private修饰的成员变量和成员方法都不可以访问或调用;

如果定义了Person类对象,则通过该对象只可以访问和调用Person中public修饰的成员变量和成员方法,protected、default、private修饰的成员变量和成员方法都不可以访问或调用。

疑问:不明白为什么会有这样的差异。

(8).在GateMan类中定义定义Person类对象pDiffPackNonChild,分别访问和调用这些成员变量和成员方法,详见下面的代码:

package teacher;import human.Person;public final class GateMan {int gateNumber;public GateMan() {}public GateMan(int g) {this.gateNumber = g;}public static void main(String[] args) {    Person pDiffPackNonChild = new Person("xi",20,"female","bachelor","recite","NJ");System.out.println("public education: " + pDiffPackNonChild.education);System.out.println("protected residence: " + pDiffPackNonChild.residence);System.out.println("default name: " + pDiffPackNonChild.name);System.out.println("private hobby: "+ pDiffPackNonChild.hobby);pDiffPackNonChild.testModifierPublic();pDiffPackNonChild.testModifierProtected();pDiffPackNonChild.testModifierDefault();pDiffPackNonChild.testModifierPrivate();}
}

输出结果为:

        Exception in thread "main" java.lang.Error: Unresolved compilation problems: The field Person.residence is not visibleThe field Person.name is not visibleThe field Person.hobby is not visibleThe method testModifierProtected() from the type Person is not visibleThe method testModifierDefault() from the type Person is not visibleThe method testModifierPrivate() from the type Person is not visibleat teacher.GateMan.main(GateMan.java:29)

结果分析:出现编译错误,提示protected修饰的residence和testModifierProtected()、default修饰的name和testModifierDefault()、private修饰的hobby和testModifierPrivate()不可见。

(9).根据(8)提示的错误,注释掉相关的行,再次执行,详见代码:

package teacher;import human.Person;public final class GateMan {int gateNumber;public GateMan() {}public GateMan(int g) {this.gateNumber = g;}public static void main(String[] args) {        Person pDiffPackNonChild = new Person("xi",20,"female","bachelor","recite","NJ");System.out.println("public education: " + pDiffPackNonChild.education);
//      System.out.println("protected residence: " + pDiffPackNonChild.residence);
//      System.out.println("default name: " + pDiffPackNonChild.name);
//      System.out.println("private hobby: "+ pDiffPackNonChild.hobby);pDiffPackNonChild.testModifierPublic();
//      pDiffPackNonChild.testModifierProtected();
//      pDiffPackNonChild.testModifierDefault();
//      pDiffPackNonChild.testModifierPrivate();}
}

输出结果为:

public education: bachelor
Public

结果分析:

注释掉protected、default、private修饰的行后,成功执行;

Person类对象可以在与Person不同包的非子类中访问和调用由public修饰的成员变量和成员方法,不能访问由protected、default、private修饰的变量和方法。

(10).把Person类定义为缺省访问权限修饰的类,即class Person{,,,,}。在teacher包里的Teacher类和GateMan类都出现编译错误,如下所示:

        Exception in thread "main" java.lang.IllegalAccessError: class teacher.Teacher cannot access its superclass human.Personat java.lang.ClassLoader.defineClass1(Native Method)at java.lang.ClassLoader.defineClass(ClassLoader.java:763)at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)at java.net.URLClassLoader.defineClass(URLClassLoader.java:467)at java.net.URLClassLoader.access$100(URLClassLoader.java:73)at java.net.URLClassLoader$1.run(URLClassLoader.java:368)at java.net.URLClassLoader$1.run(URLClassLoader.java:362)at java.security.AccessController.doPrivileged(Native Method)at java.net.URLClassLoader.findClass(URLClassLoader.java:361)at java.lang.ClassLoader.loadClass(ClassLoader.java:424)at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335)at java.lang.ClassLoader.loadClass(ClassLoader.java:357)at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:495)

结果分析:说明缺省访问权限修饰符的类只能由本包中的类访问,其他包中的类都不可以访问。

转载于:https://www.cnblogs.com/chanchan/p/7752373.html

Java学习笔记10---访问权限修饰符如何控制成员变量、成员方法及类的访问范围...相关推荐

  1. Java语法封装之继承、访问权限修饰符、重载与重写、this与super、final、Javabean的使用

    3.3封装 封装 : 隐藏内部的实现细节,对外提供公共的访问方式.方法,类,属性的私有化- 都是封装的体现 封装优点 : 提高程序的安全性 提高代码的复用性 私有是封装,但是封装不是私有 3.3.1 ...

  2. 19_01访问权限修饰符

      本类中 子类 同包类 其他类 public 可以 可以 可以 可以 protected 可以 可以 可以 不可以 默认(不写) 可以 (同包子类) 可以 不可以 private 可以 不可以 不可 ...

  3. Java学习笔记10(零压力理解继承多态权限修饰符)

    文章目录 继承 方法的重写(override) 四种访问权限修饰符: 关键字super 类对象的实例化的底层原理 多态 instanceof操作符 object类 继承 继承是Java最重要的,类之间 ...

  4. 学习大数据的第13天——Java面向对象(接口、分析参数返回值的类型不同时如何解决、包以及访问权限修饰符(public、protected、默认、private))

    学习大数据的第13天--Java面向对象(接口.分析参数返回值的类型不同时如何解决.包以及访问权限修饰符(public.protected.默认.private)) 接口 接口的基本定义: 1.1.语 ...

  5. 学习Java的第五天 | 定义方法 | 引用数据类型——类 | 访问权限-修饰符 | 全局变量与局部变量 | toString | 构造方法 | 方法重载

    前面提到的,冒泡排序,二分查找,我们有时候写代码可能不止要查到一种数组的数据,这时候我们就很需要想循环那样的结构,来帮我们解决代码冗余的情况. 我们前面使用的main方法,是一个java程序的入口,我 ...

  6. Java访问权限修饰符

    1.Class类的访问权限:  public:可以供所有的类访问.  默认:默认可以称为friendly但是,java语言中是没有friendly这个修饰符的,这样称呼应该是来源于c++.默认的访问权 ...

  7. Java访问权限修饰符详解

    Java中的访问权限修饰符(Java关键字) 今天很皮的发现,自己现在竟然不会玩儿Java基础了,就翻看了一下自己的笔记,写一篇文章复习一下! 测试环境:Java运行环境,myEclipse. 测试前 ...

  8. Java——类成员的访问权限修饰符(private、protected、public、default)

    本文转载自:https://blog.csdn.net/qq_41420688/article/details/83348546 1. 作用 封装将数据和操作连接起来.封装的一个重要属性:访问控制. ...

  9. Java访问权限修饰符的区别

    Java有四种访问权限,其中三种有访问权限修饰符,分别为private,public和protected,还有一种不带任何修饰符: private: Java语言中对访问权限限制的最窄的修饰符,一般称 ...

最新文章

  1. Ubuntu VSCode OpenCV 环境配置
  2. C#中HtmlAgilityPack判断是否包含或不包含指定的属性或值
  3. html选择器_HTML的id选择器类选择器
  4. Linux下高性能网络编程中的几个TCP/IP选项
  5. cap流程图_源码阅读笔记 BiLSTM+CRF做NER任务(二)
  6. Windows 8的无线设置后,竟不能直接更改,目前知道可以通过命令行解决
  7. jquery实现回车键触发事件
  8. Network Namespace
  9. android环境搭建出错,androidstudio配置环境遇到的各种错误(持续更新中)
  10. java写龟兔赛跑_有关JAVA编写龟兔赛跑的游戏的问题。求助……
  11. 面试准备每日五题:C++(二)——mallocnew、宏、volatile、constvolatile、(a)和(a)
  12. vue使用阿里巴巴矢量图标库
  13. 安卓手机端、PC电脑端的微信文件存储位置:
  14. 为什么易语言程序被360和windows安全中心认作是病毒?
  15. 路在何方?前途迷茫,去不去HP?
  16. vm 虚拟机设置共享文件夹
  17. 自学编程的妙方法,直接省了几万块钱报班,不收藏就可惜了!
  18. 基于WIFI无线组网的水雨情远程监测预警系统
  19. 编码器的分类及工作原理
  20. python微软雅黑字体_win10+python3.7下matplotlib显示中文,可使用微软雅黑.md

热门文章

  1. PowerShell 远程执行任务
  2. OCF 试图为物联网建立标准,但它面临着不小的挑战
  3. Kafka分区原理图
  4. JAVA 算法练习(一)
  5. 20155225 2006-2007-2 《Java程序设计》第四周学习总结
  6. 经典案例之MouseJack
  7. Android数据库升级、降级、创建(onCreate() onUpgrade() onDowngrade())的注意点
  8. ASP.NET MVC+EF框架+EasyUI实现权限管理系列(17)-注册用户功能的细节处理(各种验证)...
  9. HTML5 3D爱心动画及其制作过程
  10. 我的Dll(动态链接库)学习笔记(转)