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 visible

The method testModifierPrivate() from the type Person is not visible

The field Person.hobby is not visible

The method testModifierPrivate() from the type Person is not visible

at 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 visible

The method testModifierPrivate() from the type Person is not visible

at 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 visible

The field Person.hobby is not visible

The method testModifierDefault() from the type Person is not visible

The method testModifierPrivate() from the type Person is not visible

The field Person.residence is not visible

The field Person.name is not visible

The field Person.hobby is not visible

The method testModifierProtected() from the type Person is not visible

The method testModifierDefault() from the type Person is not visible

The method testModifierPrivate() from the type Person is not visible

at 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 visible

The field Person.name is not visible

The field Person.hobby is not visible

The method testModifierProtected() from the type Person is not visible

The method testModifierDefault() from the type Person is not visible

The method testModifierPrivate() from the type Person is not visible

at 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.Person

at 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)

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

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

  1. Python学习笔记11:函数修饰符

    Python学习笔记11:函数修饰符 Python有很多有趣的特性,其中函数修饰符就是一个. 我们在之前的那个web应用示例中用过如下写法: @web.route('/log') @符号后边的,就是一 ...

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

    1.Java有三种访问权限修饰符,分别为public.protected.private,还有一种为缺省权限修饰符的情况,记为default.其中,可以由public和default来修饰类:这四种修 ...

  3. java中集合的模型特点_Java 学习笔记(十四)集合

    集合 在开发的时候,如果需要存储多个数据,可以使用数组,不过数据是固定长度的,如果需要存储可变长度的多个数据,可以使用集合.集合提供存储空间可变的存储类型,存储的容量可以实时改变 集合分类 Colle ...

  4. Vue2.0学习笔记:Vue事件修饰符的使用

    事件处理 如果需要在内联语句处理器中访问原生DOM事件.可以使用特殊变量$event,把它传入到methods中的方法中. 在Vue中,事件修饰符处理了许多DOM事件的细节,让我们不再需要花大量的时间 ...

  5. Solidity语言学习笔记————20、函数修饰符

    函数修饰符(Function Modifiers) 修饰符可以用来轻松改变函数的行为,比如在执行的函数之前自动检查条件.他们可继承合约的属性,也可被派生的合约重写. pragma solidity ^ ...

  6. java网格式布局登录界面_Java学习笔记------自己书写的登录界面实例

    package com.package_view; import  com.package_model.*; import javax.swing.*; import java.awt.*; impo ...

  7. java毫秒值转换成日期_Java学习笔记day08

    Object类 java.lang.Object 类Object是类层次结构的根类 每个类都使用Object作为 超(父)类 所有对象(包括数组)都实现这个类的方法 Object类的toString方 ...

  8. java 遍历阿斯克吗_java学习笔记

    Java复习所得到的知识 1:数组的新的排序方法 import java.util.*; public class pasixu { public static void main(String[] ...

  9. java小项目租车系统_Java学习笔记三十:Java小项目之租车系统

    Java小项目之租车系统 一:项目背景介绍: 根据所学知识,编写一个控制台版的"呱呱租车系统" 功能: 1.展示所有可租车辆: 2.选择车型.租车量: 3.展示租车清单,包含:总金 ...

  10. java中什么是标志位_Java学习笔记14---使用标志位控制循环

    使用标志位控制循环 前面提到了控制循环的常用技术:计数器控制的循环.另一种控制循环的常用技术是在读取和处理一个集合的值时指派一个特殊值.这个特殊的输入值也成为标志值(sentinel value),用 ...

最新文章

  1. LeetCode简单题之删除字符使字符串变好
  2. 踩坑 :vue2 ajax异步请求数据,层数太多,页面无法渲染
  3. 发光二极管原理,理解,相关计算
  4. hdu 5020 求三点共线的组合数(容器记录斜率出现次数)
  5. 小巧优美的ORM框架-doodads
  6. 不同用户同时并发测压_简单聊聊吞吐量(TPS)、QPS、并发数、响应时间(RT)概念...
  7. 使用ViewPager制作Android引导界面
  8. python random库下载_python random库
  9. Java线程经典面试题
  10. JDK源码系列 下载源码
  11. RJ45网线水晶头超5类线6类线千兆网百兆网区别
  12. 合肥Android两天十面总结
  13. 微信支付服务商接入指引
  14. 【机器学习 深度学习】通俗讲解集成学习算法
  15. r7 5800h和r7 4800h 的差别大吗
  16. 软件工程复习13:软件发布
  17. Android Studio 获取应用签名 MD5和SHA1等
  18. 动感相册源码--类似QQ动感影集.rar
  19. 基于stm32温湿度采集平台开发
  20. C#生成带背景和文字的二维码图片

热门文章

  1. python一行输入多个值用空格隔开_Python 实现一行输入多个数字(用空格隔开)
  2. C++输入一串数值,逗号隔开,回车结束
  3. [易飞]一张领料单单身仓库quot;飞了quot;引起的思考
  4. 叶俊:没有人会把钱存在有漏洞的账户
  5. Java获取网络图片转化为输入流
  6. java 葫芦娃.rmvb,课内资源 - 基于JAVA的葫芦娃 — 最终之战
  7. MacOS中的剪切快捷键
  8. 【Linux系列文章】正则表达式与文本处理工具
  9. 由syms生成函数,求该函数在某些点的数值
  10. 动点四边形周长最短_中考数学之四边形周长最小值