java protected关键字_Java 权限protected关键字纠正

以前一直认为自己理解了Java四种权限访问,昨天突然编程时发现protected居然在子类中不能调用,然后越看越迷糊??????

public: Java语言中访问限制最宽的修饰符,一般称之为“公共的”。被其修饰的类、属性以及方法不仅可以跨类访问,而且允许跨包(package)访问。

private: Java语言中对访问权限限制的最窄的修饰符,一般称之为“私有的”。被其修饰的类、属性以及方法只能被该类的对象访问,其子类不能访问,同包之间不能访问,更不能允许跨包访问。

protect: 介于public 和 default之间的一种访问修饰符,一般称之为“保护形”。被其修饰的类属性以及方法只能被类本身的方法及子类访问,即使子类在不同的包中也可以访问。

default:即不加任何访问修饰符,通常称为“默认访问模式“。该模式下,只允许在同一个包中进行访问。

49c42fd2b38c98914cb8e385fbcb21a9.png

对于上面这种描述,不能说有错,但是很容易引起人误解。

先陈清一点:对于类的修饰,只能是public或者不写。

下面先看例子:

1 packagelesson1209;2

3 public classBase {4

5 public intpublicInt;6 protected intprotectedInt;7 intdefaultInt;8

9 voiddefaultget(){10 System.out.println();11 }12

13 protected voidprotectedget(){14

15 }16

17 }18

19

20 packagelesson1210;21

22 importlesson1209.Base;23

24 public classTestNotSub {25

26 public static voidmain(String[] args) {27 Base b = newBase();28 b.publicInt = 3;29

30 TestSub sub = newTestSub();31 sub.publicInt = 0;32 /*在不是一个包的情况之下:子类的引用在子类中可以调用父类的Protected方法或属性,33 非子类的话只能调用public方法或属性*/

34 //sub.protectedInt = 3;//不可见35 //sub.defaultInt = 2;//不可见36 //sub.protectedget();//不可见37 //sub.defaultget();//不可见

38 }39

40 }41

42 packagelesson1210;43

44 importlesson1209.Base;45

46 public class TestSub extendsBase{47

48 public static voidmain(String[] args) {49 TestSub sub = newTestSub();50 sub.protectedInt = 3; //子类可以访问protected,不可以访问default51 //sub.defaultInt = 2;//不可见

52 sub.protectedget();53 //sub.defaultget();

54

55 Base base = newBase();56 base.publicInt = 0;57 //base.protectedInt = 3;//不可见 这个地方尤其注意了,为什么不可见,理解protected含义58 //由此可见,只能在子类中子类自己访问,其他的都访问不了。59

60 }

public void protectedkn(){

publicInt = 0;     //子类可以直接访问父类中的protected对象

protectedInt = 2;

//defaultInt = 3;  //不可见

}61

62 }

在不是一个包的情况之下: 子类的引用在子类中可以调用父类的Protected方法或属性,非子类的话只能调用public方法或属性。

并且只有子类在子类中才可以调用,其他地方都调用不了。 如果有问题,请指正。

若子类与基类不在同一包中,那么在子类中,子类实例可以访问其从基类继承而来的protected方法,而不能访问基类实例的protected方法。

一般网上的误解或疑惑是:“为什么子类中不能访问另一个包中父类中的protected方法?”  参考博客原贴:https://blog.csdn.net/dawn_after_dark/article/details/74453915

其实这个问题问法是错的,在子类中是可以访问另一个包中父类中的protected方法,能问出这样的问题,多半是在不同包的子类中创建了父类对象,通过父类对象去调用protected方法,结果发现编译不通过,所以才会萌生这样的疑问。

一般我们问这个这个问题呢,其实是没有明白protected权限到底controll了什么,都知道protected修饰的成员变量和方法可以被包外的子类访问到,这里被包外子类访问实质并不是可以在子类中通过创建父类对象来访问这个protected方法, 而是可以通过创建子类对象来访问的。这也可以说是protected权限对包外访问时的一种限制,在包内则可以像public那样可以在任意地方访问。

产生这个问题的主要是我们把在包内访问的方式理解强加到了包外。其实我们又可以转换问题为什么跨包访问某个类的protected方法必须通过继承呢?答案很简单,通过继承呢,子类就可以获得了父类方法的地址信息并把这些信息保存到自己的方法区,这样就可以通过子类对象访问自己的方法区从而间接的访问父类的方法(重写的话,就直接访问子类自己重写后的方法)。

Testsub确实继承了Base,但只是通过继承产生了自己能访问的方法表包括父类的保护区域(实例方法),并无权限访问父类对象的方法表中保护区域,就是只能通过Testsub自己的对象去访问自己的方法表中保护区域来调用已继承的方法,Testsub是无权限查看Base方法表中保护区域信息,更别说用通过Base对象调用了。这里也就很好的解释了为什么继承的子类看不到private方法,和为什么包外无法访问父类的default方法,因为编译器规定不能继承过来,所以子类的方法表不存在这些修饰符修饰的方法,更别谈调用了。

类B继承了类A,包括保护型方法区域,所以能通过B对象来调用这个区域访问该方法。在类B是无法查看对象A的保护型方法区域,是因为类B并没有继承对象A的保护型方法区域,类B只是继承了类A的保护型方法区域。(这个地方需要好好理解)

总结:

1. 子类可以通过继承获得不同包父类的protected权限成员变量和成员方法,在子类中可以直接访问

2. 在子类中可以通过子类的对象访问父类的protected成员变量和方法

3. 在子类中反而不能通过父类的对象访问父类的protected成员变量和方法

4. 在子类中不能通过其他子类的对象访问父类的protected成员变量和方法

5. 在与子类同包的其他类中不能通过子类的对象访问父类的protected成员变量和方法

参考原文:https://blog.csdn.net/blacktal/article/details/81198579

这儿还有一篇文章写得也是很清楚,并且例子非常简单清晰,你看后会耳目一新:

https://www.cnblogs.com/liuleicode/p/4946248.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/245399.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

互联网java常用框架_来,带你鸟瞰 Java 中4款常用的并发框架!

1. 为什么要写这篇文章几年前 NoSQL 开始流行的时候,像其他团队一样,我们的团队也热衷于令人兴奋的新东西,并且计划替换一个应用程序的数据库。 但是,当深入实现细节时,我们想起了一位智者曾经说过的话:“细…

2020亚太杯数学建模_比赛 | 2020年APMCM亚太地区大学生数学建模竞赛

2020年11月26日到30日,在我院老师指导下,由统计分析竞赛社组织的41支队伍,共123人,参加了亚太地区大学生数学建模竞赛组委会主办的大学生学科类竞赛。此次竞赛题目分为A题和B题,参赛者需从A,B两题中任选其一…

java声明复数类_JAVA声明复数类

声明复数类,成员变量包括实部和虚部,成员方法包括实现由字符串构造复数、复数加法、减法,字符串描述、比较相等等操作。虽然我只是一个刚学一个月JAVA的菜鸡,但是强迫症让我把复数乘法和除法一起写出来了。public class Complex {…

sql 没有调试 菜单_MySQL递归查询上下级菜单

正文在传统的后台管理系统里面经常会需要展示多级菜单关系,今天我们来学一下如何使用一条SQL语句展示多级菜单。现在我们有一张corpinfo单位表,里面有一个belong字段指向上级单位,首先来看一下现在表里有什么数据:SELECT uid,ubel…

java 桥 word_java导出word的6种方式(转发)

最近做的项目,需要将一些信息导出到word中。在网上找了好多解决方案,现在将这几天的总结分享一下。目前来看,java导出word大致有6种解决方案:1:Jacob是Java-COM Bridge的缩写,它在Java与微软的COM组件之间构…

jieba 词典 词频_在Hanlp词典和jieba词典中手动添加未登录词

在使用Hanlp词典或者jieba词典进行分词的时候,会出现分词不准的情况,原因是内置词典中并没有收录当前这个词,也就是我们所说的未登录词,只要把这个词加入到内置词典中就可以解决类似问题,如何操作呢,下面我…

python爬取汽车之家_python爬取 汽车之家(汽车授权经销商)

一:爬虫的目标:打开汽车之家的链接:https://www.autohome.com.cn/beijing/,出现如下页面我们的目标是点击找车,然后出现如下图我们要把图中的信息抓取到二:实现过程我们选择 宝马5系 然后点击找车注意宝马…

Java 调用 Caffe_解决 free(): invalid pointer: 0x00000000019ff700 运行时报错(caffe)(libtool使用)...

编译成功,运行时报错:在使用 pytorch or tensorflow or caffe 时,都可能存在这个问题:*** Error in xxx: free(): invalid pointer: 0x00000000020663b0 ***很可能是缺少libtcmalloc库解决方法1:apt-get安装libtcmallo…

unity 世界坐标间角度_Unity学习笔记—本地坐标转世界坐标

核心用到的方法就是transform.TransformPoint( )这个方法的返回值就是Vector3类型的世界坐标,transform就是相对的物体,括号里的就是相对这个transform的本地坐标,比方说我现在的位置吧,知道我相对于我的邻居的坐标:Pos1&#xff…

webcomponents安装了没有用_Web Components 入门实例教程

来源 | http://www.ruanyifeng.com/blog/2019/08/web_components.html组件是前端的发展方向,现在流行的React和Vue都是组件框架。谷歌公司由于掌握了Chrome浏览器,一直在推动浏览器的原生组件,即Web组件API。部分第三方框架,原生组…

虹软java接摄像头_虹软人脸识别SDK(java+linux/window) 初试

虹软人脸识别全平台demo调用—快速上手之服务端Windows篇demo名称:ArcFace 2.2 Windows(86) Demo [C]一 环境配置:1) 安装VS2013环境安装包(vcredist_x86_vs2013.exe)2) 从官网(http://www.arcsoft.com.cn/ai/arcface.html)申请sdk,下载对应的…

java 循环查询list_Java用list储存,遍历,查询指定信息过程详解

需求说明实现思路见代码注释代码内容使用list储存,遍历,查询,删除import java.util.ArrayList;import java.util.List;/*** auther::9527* Description: 第七题* program: 多线程* create: 2019-08-09 23:39*/public class Sevent…

低代码开发平台_低代码开发平台系列:6、低代码是编程技术发展大势所趋

一、低代码是一种编程技术低代码是快速开发工具/技术的一种,属于软件开发/编程工具/技术领域,主要应用于企业软件开发领域。借助低代码工具,使用者无需编码即可实现企业软件系统常见功能的交付;少量编码扩展更多功能,相…

abnf java实现_详细讲解如何利用Java实现组合式解析器?

简介:Ward Cunningham 曾经说过,干净的代码清晰地表达了代码编写者所 想要表达的东西,而优美的代码则更进一步,优美的代码看起来就像是专门为了 要解决的问题而存在的。在本文中,我们将展示一个组合式解析器的设计、实…

充电原理_电动汽车充电桩如何设置?充电桩原理介绍

随着新能源产业的蓬勃发展,电动汽车在生活中变得越来越普遍。比亚迪(BYD),宝马(BMW)和特斯拉(Tesla)等汽车制造商都已经推出了全电动汽车,而混合动力汽车则更为普遍。为了能够方便地为这些电动汽车的电池充电,必须建立充电桩。充电…

java 获取服务器硬件_dell服务器远程获取硬件状态

以dell的R620型号的服务器做的测试登陆上dell服务器ilo的IP地址,首先打开ipmi,ilo2是直接支持ipmi2.0的此框需要点击 “IDRAC设置”->“网络”->“IPMI设置”在”启用LAN上IPMI“后的复选框打钩,才能启动ipmi好像是内置到了ilo2&#x…

简单可行性报告模板_项目可行性报告模板分享!第三章主要内容

项目可行性报告模板分享!第三章主要内容如下:第三章 市场分析与建设规模市场分析在可行性研究中的重要地位在于,任何一个项目,其生产规模的确定、技术的选择、投资估算甚至厂址的选择,都必须在市场需求情况有了充分的了解后才能解…

java外挂源码_2.7 万 Star!Github 项目源码辅助阅读神器

【导语】:一款用于将 Github 项目代码以树形格式展示的浏览器插件。简介大家平时逛 GitHub 是否会觉得查看源代码的体验十分糟糕?项目文件需要一层层点击,返回也要一层层返回。这样不直观,也比较麻烦。Octotree 是一款辅助阅读 Gi…

php教育网站设计案例_酒店装修,精品酒店设计装修案例,酒店设计网站

酒店设计需要考虑:设计酒店的时候也要顺应市场潮流,不再单一的提供休息、洗漱、睡觉的空间,还要能提供社交、商务等功能,同顾客产生情况共鸣。这样能够引领生活方式的、能够互动,有仪式感的酒店,是很吸引人…

写一个方法判断一个字符串是否对称_判断一个男生是否好色的方法

▾我们店只招黑喵哦?▾其实也不是不能理解为什么男的要跑?▾有什么相见恨晚的小知识??▾见证奇迹?:是不是穿过去了!?▾医学奇迹?▾卧槽流劈!?真的超光速了!▾细节很到位啊几位少年?▾昨有坟头蹦迪?…