java 接口 protected_为什么类和接口不能使用private和protected?接口的方法不能使用private、protected、default..._努力提高做饭水平的博客-程序员宅基地

技术标签: java 接口 protected  

对于java程序员来说,java的访问权限修饰词public、protected、default、private的区别和使用肯定都不是问题,这里也不再啰嗦了,反正度娘一搜就一大把。最近在整理java core的培训资料时,想到了几个关于权限修饰词的问题:

为什么类和接口(不考虑内部类和接口)不能使用private和protected修饰词,只能是public和default?

为什么接口的方法不能是private和protected,只能public(default可以写出来,但是编译之后自动转为了public)?

仔细想了一下,原因也不难。主要是虽然做了java不短的时间,这个问题还真没认真想过,实在惭愧。记下自己的想法,要多思考,不要成了框架的搬运工。

第一个问题:

private:

很好理解,类和接口如果定义成private,那么其他任何类都不能访问,这样的类写出来也没有意义。

protected:

这个问题用反证法比较好解释清楚,假设类B和A不在同一个包,A又是protected类, 那么B能访问A的前提是B是A的子类,而B能成为A的子类(或者说B能继承A)的前提又是B能访问A。这两个条件互为前提,无法实现。

第二个问题:

private:

接口是需要其他类实现的, 如果方法定义成private,那么其他任何类都不能访问。这样的方法即要求被实现,又对任何类不可见,这是无法实现的。

protected:

(1)假设public接口I有一个protected方法M,那么位于其他包的public类C就可以实现这个接口(方法M依然是protected)。那么C的同包类D调用方法M只能这样访问:

C c = new C();

c.M();

无法这样访问:

I c = new C();

c.M();

这样就失去了使用接口的重要意义:提供统一的接口,面向接口编程思想也无法体现。

(2)假设接口I是default的, 那么方法M是protected理论上是没有问题的,而且M也可以是default、public。至于为什么不让用protected,可能是出于简化修饰词的复杂度的目的(如果使用,需要区分接口是public的时候不能用,default接口则能用),至于default请参考(3).

default:

(3)假设public接口I有一个default方法M, 那么位于其他包的无法正常实现接口I,因为方法M对其不可见。

(4)假设default接口I有一个default方法M,那么方法M是default理论上是没有问题的,而且M也可以是proteced、public。可能出于和(2)所说不能用protected的相同原因,不能使用default。

因此,综合以上四点,接口方法只能使用public,既然只能用public,java编译器在你忘了在M前写public的时候干脆自动帮你转成public了。

最后,以上为个人理解,没有找到任何官方解释,如果错漏,读到这段文字的朋友自己多多求证,欢迎讨论:)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_42362931/article/details/114099580

智能推荐

零代码快速集成AGC崩溃服务-xamarin框架-iOS_华为开发者论坛的博客-程序员宅基地

华为AGC的崩溃服务支持跨平台,按照文档整理了个Xamarin插件集成的文档,有需要的开发者可以参考。环境配置和项目设置1.安装Xamarin环境主要是先安装visual studio for MAC,然后安装Mobile development with .NET,具体可以参考Xamarin环境搭建。2.AGC创建项目工程,并且开通华为分析服务。这部分是基本操作,可以参见创建项目和开通华为分析3.集成AGC Xamarin NuGet包点击创建的项目工程,右键选择”Manage NuGet

std::string用法总结_平头小子的博客-程序员宅基地

c++stdstring在平常工作中经常用到了string类,本人记忆了不好用到了的时候经常要去查询。在网上摘抄一下总结一下,为以后的查询方便:string类的构造函数:string(const char *s);    //用c字符串s初始化string(int n,char c);     //用n个字符c初始化string类的字符操作:const

专用目录与存储位置_weixin_34362790的博客-程序员宅基地

专用目录与存储位置 这份附录列出了创建SharePoint团队Web站点或Microsoft FrontPage扩展Web站点时,向根Web站点或子站点中添加的文件夹与文件。 SharePoint团队Web站点文件与文件夹 文件夹文件用途 Default.htmSharePoint团队Web站点主页。 ...

Kaggle竞赛之-titanic学习笔记_kuxia0000的博客-程序员宅基地

为了督促自己学习数据建模,决定记录下自己的学习过程。从同学那里打听到有一个很不错的数据挖掘竞赛kaggle,准备从里面比较简单的titanic问题入手。这几天我会持续更新下我的学习记录。首先从ID3算法开始~

php把图片上传到页面上,php把 图片上传到 图片服务器_兔子的胡萝卜的博客-程序员宅基地

/*** 上传图片到服务器* @return [type] [description]*/publicfunctionupload_img(){if(IS_POST){$url= C(‘IMG_SERVER_URL‘).‘uploadImg.php‘; //图片API服务器$data = I(‘post.‘);$img_name= $data[‘img_name‘];if(!$img_name){...

随便推点

通俗易懂的TCP拥塞控制详解_xisi克利夫的博客-程序员宅基地

接收端窗口 rwnd( receive window):接收端根据其目前接收缓存大小所许诺的最新的窗口值,反映了接收端的容量。拥塞窗口 cwnd (congestion window):发送端根据自己估计的网络拥塞程度而设置的窗口值,反映了网络的当前容量。发送窗口 swnd(send window):略四个算法:慢启动,拥塞避免,快重传,快恢复1.慢启动初始:设置cwnd = 1在每收到一个对新的报文段的确认后,cwnd加倍,即1,2,4,8…直到cwnd达到阈值ssthresh(slow s

machine learning(13) -- solving the problem of overfitting:regularization_weixin_30528371的博客-程序员宅基地

solving the problem of overfitting:regularization发生的在linear regression上面的overfitting问题发生在logistic regression上面的overfitting怎么解决overfittingregularization: cost function...

es6冻结对象及其属性_weixin_30375427的博客-程序员宅基地

将对象本身冻结,对象的属性也应该冻结。以下是一个将对象彻底冻结的函数。<script type="text/javascript">var a = (obj) => { Object.freeze(obj); //冻结传入的obj对象 Object.keys(obj).forEach((key,i) => { if(typ...

超声波相关——上位机_何辞为1的博客-程序员宅基地

QT5串口编程——编写简单的上位机https://blog.csdn.net/u014695839/article/details/50611549首先,QT5是自带QSerialPort这个类的,使用时需要在pro文件里面添加一行:QT += serialport然后直接引用头文件就可以了。#include <QSerialPort> //提供访...

还在写管理系统?3个基于 SpringBoot 的图片识别处理系统分享一下_m0_46477073的博客-程序员宅基地_springboot 图片管理

最近看了太多读者小伙伴的简历,发现各种商城/秒杀系统/在线教育系统真的是挺多的。推荐一下昨晚找的几个还不错的基于 Java 的图片识别处理系统。中药图片拍照识别系统项目地址:https://gitee.com/xiaohaoo/chinese-medicine-identification-admin项目简介主要用来对拍摄的中药图片进行识别,系统会给出概率值最高的 10 种中药, 同时主要包含功能还有:中药详细信息查看、中药筛选、中药全文检索、问题社区等。项目后端介绍本项目后端包含五

Python随笔_孱弱Lynch的博客-程序员宅基地

内置函数评估函数 eval()去掉参数最外层引号,并执行余下语句eval(<字符串 or 字符串变量>)>>> eval("1+2")3>>> eval('print("Hello")')Hello浮点数处理round()round(x,d) 对x四舍五入,d是小数截取位数浮点数间运算及比较,用round()函数辅助&g...