为什么类和接口不能使用private和protected?接口的方法不能使用private、protected、default
对于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了。
最后,以上为个人理解,没有找到任何官方解释,如果错漏,读到这段文字的朋友自己多多求证,欢迎讨论:)
为什么类和接口不能使用private和protected?接口的方法不能使用private、protected、default的更多相关文章
- 黑马程序员——【Java基础】——面向对象(一)概述、类与对象、继承、抽象类、接口、多态、内部类
---------- android培训.java培训.期待与您交流! ---------- 一.面向对象概述 1.面向对象:是一个很抽象的概念,它相对面向过程而言,是一种程序设计的思想. 2.面向对 ...
- java类的继承,多态,抽象类与接口
知识点梳理: 1,怎样定义自己的类. MyStarFrame,MyStarPanel 类中定义: (1)属性(数据),变量. (2)方法(函数),行为. (3)构造方法(特征,作用,何时被调用 ...
- Future接口和FutureTask类【FutureTask实现了Runnable和Future接口】
Future API: public interface Future<V> { /** * Attempts to cancel execution of this task. This ...
- 【Java面试题】60 接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承具体类(concrete class)? 抽象类中是否可以有静态的main方法?
接口可以继承接口.抽象类可以实现(implements)接口,抽象类可以继承具体类.抽象类中可以有静态的main方法. 问: 抽象类是否可继承实体类 (concrete class) 答: 抽象类是 ...
- 关于Java中的几种特殊类与接口,及特殊的创建实例的方法
Java中有一些特殊的类,在教材中讲解的不深,但是确实非常有用的,这里总结一下,里面用到的有网上搜到的内容,这里表示下感谢. 一.成员内部类 成员内部类是在一个内中定义的另外一个类,这个类属于其上的类 ...
- 多线程----Thread类,Runnable接口,线程池,Callable接口,线程安全
1概念 1.1进程 进程指正在运行的程序.确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于运行过程中的程序,并且具有一定独立功能. 任务管理器中: 1.2线程 线程是进程中的一个执行单元 ...
- 基于SqlSugar的开发框架循序渐进介绍(6)-- 在基类接口中注入用户身份信息接口
在基于SqlSugar的开发框架中,我们设计了一些系统服务层的基类,在基类中会有很多涉及到相关的数据处理操作的,如果需要跟踪具体是那个用户进行操作的,那么就需要获得当前用户的身份信息,包括在Web A ...
- python3 面向对象、类、继承、组合、派生、接口、子类重用父类方法
对象是特征(变量)与技能(函数)的结合体而类是一系列对象共同的特征与技能的集合体 class teacher: lesson = "python" def __init__(sel ...
- Python基础(16)_面向对象程序设计(类、继承、派生、组合、接口)
一.面向过程程序设计与面向对象程序设计 面向过程的程序设计:核心是过程,过程就解决问题的步骤,基于该思想设计程序就像是在设计一条流水线,是一种机械式的思维方式 优点:复杂的问题的简单化,流程化 缺点: ...
随机推荐
- Linux多线程编程
线程和进程的区别是: 进程是拷贝主进程的数据段和代码段的. 线程是和主进程公用一份数据段和代码段的. 线程一旦创建,就从指定的入口函数开始执行. 相关头文件: #include <pthread ...
- HTMl5的存储方式sessionStorage和localStorage详解
html5中的Web Storage包括了两种存储方式:sessionStorage和localStorage.sessionStorage用于本地存储一个会话(session)中的数据,这些数据只有 ...
- C++ "+="等运算符使用bug
昨晚写了一个程序,使用了"+="运算符,结果总不是我想要的,查了一晚没找到,今早才发现: timeInterval = tpImP.staTime - imgPara[serial ...
- 搭建一套自己实用的.net架构(3)【ORM-Dapper+DapperExtensions】
现在成熟的ORM比比皆是,这里只介绍Dapper的使用(最起码我在使用它,已经运用到项目中,小伙伴们反馈还可以). 优点: 1.开源.轻量.小巧.上手容易. 2.支持的数据库还蛮多的, Mysql,S ...
- [LeetCode] Nth Highest Salary 第N高薪水
Write a SQL query to get the nth highest salary from the Employee table. +----+--------+ | Id | Sala ...
- [LeetCode] Two Sum 两数之和
Given an array of integers, return indices of the two numbers such that they add up to a specific ta ...
- Mysql查询——学习阶段
1.开篇 搞开发的都知道,当数据量很大的时候,我们的代码逻辑的简单性就显得十分重要,否则处理起来就需要花费相当多的时间.另外还有一个地方需要注意的是我们写的sql语句. 一个拥有多年开发的资深开发者可 ...
- 研究Extension和Category的一个例子
Category: 1. 无法添加实例变量 2.将类的实现分散到多个不同文件或多个不同框架中. Extension: 1. 可以添加实例变量 注: 如果Category的头文件中也使用Extensio ...
- Java学习笔记(一)
纯属个人学习笔记,有什么不足之处大家留言,谢谢 Java程序打包与JAR运行方法 在Eclipse的"包资源管理器"视图中找到要打包成JAR文件的项目.在项目名称上单击鼠标右键,在 ...
- vue+webpack实践
最近使用了vue来做SPA应用,记一波学习笔记. 使用vue+webpack实现前端模块化. vuejs——轻量.学习成本低.双向绑定.无dom的操作.组件的形式编写 推荐官方文档 vue.js官方文 ...