java有四种访问权限,它们各自的范围如下图所示

当下列访问修饰符修饰字段和方法时:

private

任意位置的子类不可以访问从父类继承的private字段和方法。这里所说的访问包括通过super关键字访问。

任意位置的对象不能通过“.”访问对象的字段和方法。

public

任意位置的子类可以访问从父类继承的public字段和属性。

任意位置的对象可以通过“.”访问字段和属性。

default

当子类与父类在同一包下时,子类可以访问从父类继承的default权限的字段和方法。

当创建该对象的类与该对象所属的类在同一包下时,可以通过“.”访问对象的字段和方法。

对于父类中的private、default权限的一些方法和字段,子类在一定程度上不能访问它们,通过super访问也不行。但子类对象初始化时,不仅子类中声明的成员变量分配了内存,父类的成员变量也都分配了内存,只是父类的成员不能被子类访问罢了。但是我们可以通过子类从父类继承的某些方法来操作这部分不能访问的变量。

protected

上面的三种访问权限都很好理解,protected的描述却不是那么清晰。

1)、当子类访问从父类继承的成员或方法时,不管是否在同一包都可以,在这个情况下同public权限。

    测试: p2包下的C2继承p1包下的C1,C2在类中可以直接访问继承来的方法

  1. package p1;
  2.  
  3. public class C1 {
  4. protected void fun() {}
  5. }
  1. package p2;
  2.  
  3. import p1.C1;
  4.  
  5. public class C2 extends C1{
  6. public void test() {
  7. fun();
  8. }
  9. }

编译正确:

2)当访对象要用“.”访问对象的protected字段(方法)时,分两种情况讨论

    i 如果访问的这个方法(字段)是该对象的类自己定义的,且类型是protected。要求对象所在类与对象所属类在同一包下。

  1. package p1;
  2.  
  3. public class C1 {
  4. protected void fun() {}
  5. }
  1. package p2;
  2.  
  3. import p1.C1;
  4.  
  5. public class C2{
  6. public void test() {
  7. new C1().fun();
  8. }
  9. }

编译报错:(因为对象所在类p2.C2与对象所属类p1.C1不在同一包下)

将C2放在包p1下后:

  1. package p1;
  2.  
  3. public class C2{
  4. public void test() {
  5. new C1().fun();
  6. }
  7. }

编译正确:

   

   ii 如果对象访问的这个方法是该对象的类继承而来的。要求对象所在类与该方法(字段)被最初被定义的类在同一包下。其实 i 是 ii 的特殊情况。

    测试: C2继承C1的protected方法fun(),C3调用C2继承的fun()方法,C3与C2在同一包下,编译报错。

  1. package p1;
  2.  
  3. public class C1 {
  4. protected void fun() {}
  5. }
  1. package p2;
  2.  
  3. import p1.C1;
  4.  
  5. public class C2 extends C1{
  6. }
  1. package p2;
  2.  
  3. public class C3{
  4.  
  5. public void test() {
  6. C2 c2 = new C2();
  7. c2.fun();
  8. }
  9. }

编译结果:

测试:将上面的示例改变一下,C3放到C1的包下,编译通过。

  1. package p1;
  2.  
  3. import p2.C2;
  4.  
  5. public class C3{
  6. public void test() {
  7. C2 c2 = new C2();
  8. c2.fun();
  9. }
  10. }

编译结果:

protected总结:当在子类内部访问从父类继承而来的protected字段(方法)时,没有包限制。当对象通过“.”访问字段(方法)时,被protected修饰的方法(字段)的可见范围是,该字段(方法)被定义的类所在的包。

  本文个人编写,水平有限,如有错误,恳请指出,欢迎讨论分享。

java四种访问权限的更多相关文章

  1. java基础(八)-----深入解析java四种访问权限

    Java中的访问权限理解起来不难,但完全掌握却不容易,特别是4种访问权限并不是任何时候都可以使用.下面整理一下,在什么情况下,有哪些访问权限可以允许选择. 一.访问权限简介 访问权限控制: 指的是本类 ...

  2. java基础(七) java四种访问权限

    引言   Java中的访问权限理解起来不难,但完全掌握却不容易,特别是4种访问权限并不是任何时候都可以使用.下面整理一下,在什么情况下,有哪些访问权限可以允许选择. 一.访问权限简介 访问权限控制: ...

  3. java四种访问权限修饰符

    java中四个访问权限修饰符: public(公开的).protected(受保护的).default(默认的).private(私有的). 它们决定了紧跟其后被定义的东西的使用范围. 适用范围< ...

  4. java四种访问权限符

    (PS:其中private和protected不能修饰一般的类,否则编译就会报“modifier private not allowed here”,如果是内部类就另当别论了)

  5. Java四种访问修饰符

    Java 四种访问权限 一.概述 访问等级比较:public > protected > default > private 无论是方法还是成员变量,这四种访问权限修饰符作用都一样 ...

  6. Java中四种访问权限总结

    一.Java中有四种访问权限, 其中三种有访问权限修饰符,分别为private.public.protected,还有一种不带任何修饰符(default). 1. private: Java语言中对访 ...

  7. java四种访问控制权限:public ,default,protected,private

    四种访问权限的控制 范围 private default protected  public 同一个类中 √ √ √ √ 相同包不同类 × √ √ √ 不同包的子类中 × × √ √ 不同包非子类 × ...

  8. java四种访问修饰符及各自的权限

    1.public,即共有的,是访问权限限制最宽的修饰符.被public修饰的类.属性.及方法不仅可以跨类访问,而且可以跨包访问. 2. protected,即保护访问权限,是介于public和priv ...

  9. java中的四种访问权限是?

    1.私有权限(private) private可以修饰数据成员,构造方法,方法成员,不能修饰类(此处指外部类,不考虑内部类).被private修饰的成员,只能在定义它们的类中使用,在其他类中不能调用. ...

随机推荐

  1. python 切片&迭代

    Python提供了切片(Slice)操作符L = ['Michael', 'Sarah', 'Tracy', 'Bob', 'Jack']取前3个元素>>> L[0:3]['Mich ...

  2. npm创建react项目

    1:win+R 输入cmd ,打开cmd面板 2:安装cnpm npm install -g cnpm --registry=https://registry.npm.taobao.org 3:安装r ...

  3. 理解Underscore中的flatten函数

    最近是在所在实习公司的第一个sprint,有个朋友又请假了,所以任务比较重,一直这么久都没怎么更新了,这个周末赖了个床,纠结了一会儿决定还是继续写这个系列,虽然比较乏味,但是学到的东西还是很多的. 之 ...

  4. Intellii IDEA 中快速补全main方法:psvm

    psvm可以快速补全main方法 效果:

  5. 交叉熵Cross-Entropy

    1.交叉熵:用来描述通信中将一个概率分布的最优编码用到另一个概率分布的平均比特数 公式: 2.交叉熵是不对称的 3.交叉熵的作用是表达两个概率分布的差异性 设概率分布p(x)和q(x),两个概率分布差 ...

  6. css层叠样式表总结

    一.css css里注释只有一种 /*  */ 二.css与HTML四种结合方式 1.行内样式 在标签中加入style属性 内部的写法:key1:value;key2:value; <div s ...

  7. 2019.1.7 Mac的Vscode插件总结

    Vscode插件 通用插件 Chinese 配置中文界面 HTML Snippets H5代码片段以及提示 HTML CSS Support 让 html 标签上写class 智能提示当前项目所支持的 ...

  8. PAT——1002. 写出这个数

    读入一个自然数n,计算其各位数字之和,用汉语拼音写出和的每一位数字. 输入格式:每个测试输入包含1个测试用例,即给出自然数n的值.这里保证n小于10100. 输出格式:在一行内输出n的各位数字之和的每 ...

  9. jquery获取所有选中的checkbox

    获取所有name为spCodeId的checkbox var spCodesTemp = "";       $("input:checkbox[name=spCodeI ...

  10. vue入门学习示例

    鄙人一直是用angular框架的,所以顺便比较了一下. <!DOCTYPE html> <html lang="en"> <head> < ...