可见范围

权限的含义应该理解为控制范围,要把它理解成一个限制范围的空间,更为准确的说叫做可见范围

访问控制的等级,从最大权限到最小权限依次为:public、protected、包访问权限(没有关键词)、和private

  1. public 所有地方都可以访问,没有任何疑问
  2. private 只有自己本类可以访问,没有任何疑问
  3. 默认也就是包访问权限,顾名思义,包访问权限,也就是必须同一个包中才可以,即使是子类不在同一个包中也不行的
  4. protected是默认包访问权限的扩展,默认是出了包的范围,就不行了,但是protected给予子类放行,即使是包的外部,当然同一个包中的子类肯定是可以的

简单说就是:

  1. public 谁都可以看得见
  2. private只有自己看得见
  3. 默认包访问 同一个包中看得见
  4. protected在默认包访问的基础上,子类自己看得见

示例:

package test.b;

import test.a.Super;

public class SubClass extends Super{

    public static void main(String[] args) {

        SubClass subClass = new SubClass();
subClass.publicFun();
subClass.protectedFun(); } }

打印信息:

publicFun
protectedFun

子类位于不同的包中,可以访问公有方法,可以访问protected方法 不能访问默认的包访问权限以及私有的

额外的例子:

package test.b;

import test.a.Super;

public class SubClass extends Super {

    public static void main(String[] args) {

        Super superClass = new Super();
superClass.publicFun(); superClass.protectedFun(); } }

编译器直接报错

如果非要执行,也是直接报错

Exception in thread "main" java.lang.Error: Unresolved compilation problem:
     The method protectedFun() from the type Super is not visible

at test.b.SubClass.main(SubClass.java:12)

相信也有不少人人把上面这种形式的代码理解为:子类中访问父类的protected方法

并且觉得很奇怪,并且认为  子类不同包中并不能访问父类的protected方法

其实这是概念错了

虽然是在子类中,但是却是使用父类的对象,调用父类的protected方法

这是在不同包中,访问protected方法 当然是错误的

protected的含义是指子类可以访问,说的是子类直接访问父类的protected方法

而不是说子类中,可以调用父类的对象访问父类的protected方法

子类可以访问,可以在子类访问不是一个概念

你可以访问和在你家访问显然差别很大

总结:

public 什么都不用管,谁都可以用

private  只有自己本类可以用,本类自然限定到某个Class定义范围,哪怕你定义类或者子类在同一个文件中,都是白扯

默认的包访问权限 同一个包中,不管其他条件,管你是不是子类都没关系的,不要自己去混淆

protected 就是默认的包访问权限扩展了一下,  子类对象可以访问,不管是不是同一个包,而不是在子类中用父类对象访问

关于protected关键点在于:

先看下官方文档中的说明:

地址:https://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html

A subclass inherits all the members (fields, methods, and nested classes) from its superclass. Constructors are not members,

A subclass inherits all of the public and protected members of its parent

A subclass does not inherit the private members of its parent class. However, if the superclass has public or protected methods for accessing its private fields, these can also be used by the subclass.

子类继承父类所有的成员 包括 属性方法以及嵌套类,不包括构造方法

子类继承所有的public和protected 的成员

子类不继承私有的成员,不过如果父类中有public或者protected 方法访问私有成员,子类可以使用

子类继承了父类的protected方法,所以子类有这个方法,所以子类可以使用,但是子类是不能读取某个父类对象的保护方法的(在包外)

继承是继承的结构,跟任何具体的对象的数据没关系,所以子类中不能创建父类的对象然后调用父类的protected方法,不能在包外访问protected方法

但是如果父类的方法是protected static的,可以在子类中创建父类对象然后调用方法

因为子类是继承的父类的,着重点在于类,继承了类的成员,类的,类的

再谈包访问权限 子类为何不能使用父类protected方法的更多相关文章

  1. Java 访问权限控制:你真的了解 protected 关键字吗?

    摘要: 对于类的成员而言,其能否被其他类所访问,取决于该成员的修饰词:而对于一个类而言,其能否被其他类所访问,也取决于该类的修饰词.在Java中,类成员访问权限修饰词有四类:private,无(包访问 ...

  2. -1-2 java 面向对象基本概念 封装继承多态 变量 this super static 静态变量 匿名对象 值传递 初始化过程 代码块 final关键字 抽象类 接口 区别 多态 包 访问权限 内部类 匿名内部类 == 与 equal

    java是纯粹的面向对象的语言 也就是万事万物皆是对象 程序是对象的集合,他们通过发送消息来相互通信 每个对象都有自己的由其他的对象所构建的存储,也就是对象可以包含对象 每个对象都有它的类型  也就是 ...

  3. 3.GO-项目结构、包访问权限、闭包和值传递引用传递

    3.1.goland中项目结构 (1)在goland中创建标准Go项目 (2)goland配置 创建项目Learn-Go file-settings-go-GOPATH-添加 在项目目录下创建src目 ...

  4. Java中类成员访问权限修饰符(public、protected、default、private)

    1.public(公共的): 任何类都可以进行访问(最不严格). 2.protected(保护的): 同一包内的类以及其子类可以进行访问. 3.default(缺省的): 类中不加任何访问权限限定的成 ...

  5. Java -- 子类使用super调用父类的方法A,A 调用了方法B,子类也override方法B,那么super.A()最终调用到了子类的B方法

    public class SuperClass{ public void printA(){ System.out.print("SuperClass-printA"); prin ...

  6. 关于protected在子类创建父类对象无法访问父类protected方法或成员

    子类(父类的外部包)中访问父类的protetcted属性或者方法,是不可以通过创建父类对象调用的.注意:此处不讨论同包下的父类子类,因为同包下所有类都可访问protected属性或者方法. 请参见Ja ...

  7. java类的访问权限

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

  8. (转)浅析Java中的访问权限控制

    原文地址: http://www.cnblogs.com/dolphin0520/p/3734915.html 今天我们来一起了解一下Java语言中的访问权限控制.在讨论访问权限控制之前,先来讨论一下 ...

  9. 浅析Java中的访问权限控制

    浅析Java中的访问权限控制 今天我们来一起了解一下Java语言中的访问权限控制.在讨论访问权限控制之前,先来讨论一下为何需要访问权限控制.考虑两个场景: 场景1:工程师A编写了一个类ClassA,但 ...

随机推荐

  1. MT7688交叉编译环境配置

    在ubuntu下设置MT7688交叉编译环境,用于编译mt7688下使用的程序 1.首先在vmware下安装ubuntu64位,由于交叉编译工具需要64位系统,此次安装的是ubuntu14 2.在ub ...

  2. Android 应用内悬浮控件实践总结

    在工作中遇到一个需求,需要在整个应用的上层悬浮显示控件,目标效果如下图: 首先想到的是申请悬浮窗权限,OK~ 打开搜索引擎,映入眼帘的并不是如何申请,而是“Android 悬浮窗权限各机型各系统适配大 ...

  3. SEED实验——return-to-libc实验

    实验概述 本实验的学习目标是让学生获得缓冲区溢出攻击的一种有趣变体——return-to-libc攻击实验的亲身体验.这种攻击可以绕过目前在主要linux操作系统中实现的现有保护方案.利用缓冲区溢出漏 ...

  4. Golang Go Go Go part2:变量及常量声明

    三.关键字及内置预声明常量.类型.函数 1.关键字 Go有25个关键字,只能用在语法允许的地方,不能作为名称使用,它们是: break          default         func    ...

  5. External Snapshot management

    External Snapshot management Symptom As of at least libvirt 1.1.1, external snapshot support is inco ...

  6. Vue 单文件原件 — vCheckBox

    简书原文 做东西一向奉行的是致简原则,一定要让使用者简单 这是我在使用 Vue 一段时间后尝试制作的一个小玩意 我希望可以做一堆这样的小玩意,随意组合使用,感觉挺好的 源码在最后 演示DEMO 示例: ...

  7. 位运算-出现k次与出现一次

    题目:数组中arr只有一个数出现了1次,其他的数都出现了k次,请输出这个只出现了一次的数. 思路:这道题目要求使用位运算实现,如果采用数据结构Map就会简单很多.解此题前先了解不进位加法的思想,比如两 ...

  8. Batch入门教程丨第二章:认识变量相关概念

    在前两期的学习内容中,我们已经了解了Batch入门教程有关的知识和编程方法,如何编写和运行Windows Batch程序,脚本语言的入门方式等,今天我们将继续深入学习Batch入门教程之认识变量相关概 ...

  9. &和&&的共同点和区别、Java字符含义和Java创建对象的几种方式

    一.&和&&的共同点和区别 1.&和&&的联系(共同点): &和&&都可以用作逻辑与运算符,但是要看使用时的具体条件来决定. 操 ...

  10. 一个完整的 Web 请求到底发生了什么

    阅读本文大概需要 7 分钟. 一.从输入一个网址开始 当我们在浏览器输入一个网址,然后按下回车,接下来浏览器显示了页面.网速好的话这之间可能就一秒,但在这一秒内到底发生了什么? 本文主要内容是试图记录 ...