protected访问权限
Java中protected方法访问权限的问题
protected 修饰的成员变量或方法,只能在同包或子类可访问;
package 1
public class TestPackage
{
protected String name;
protected void f1()
{
TestPackage tt = new TestPackage();
System.out.println("ccc");
}
}
package 2;
public class TestPackage2 extends TestPackage
{
protected void f2()
{
TestPackage tt = new TestPackage();
tt.f1();// tt 的f1()方法与TestPackage2 不同包,所以不能访问,若同包则可以访问。
TestPackage2 t2 = new TestPackage2 ();
t2.f1();//t2 继承了TestPackage, 所以t2有f1方法,并且属于在同一包,可以访问
System.out.println("ccc");
}
}
先看Test.java
![]() |
此时出现上文提到的错误:The method clone from the type Object is not visiuable.
我们已经清楚Object.clone()是protected方法。这说明,该方法可以被同包(java.lang)下以及它(java.lang.Object)的子类访问。这里我们自己定义的MyObject类(默认继承java.lang.Object)。
同样Test也是java.lang.Object的子类。但是,不能在一个子类(Test)中访问另一个子类(MyObject)的protected方法,尽管这两个子类继承自同一个父类(Object)。其实这是由于调用MyTest的Clone方法实际上是调用MyTest的父类Object的Clone方法。第一,Object和Test不在一个包内;第二,虽然Test是Object的子类,但是不是Test自己调用Object中的protected方法Clone而是调用MyTest的父类的Clone方法。所以没有protected的访问权限。
再看示例2:
Test2.java
![]() |
这里,我们在MyObject2类中覆盖(override)父类的clone()方法,在另一个类Test2中调用clone()方法,编译通过。
编译通过的原因显而易见,当你在MyObject2类中覆盖clone()方法时,MyObject2类和Test2类在同一个包下,所以此protected方法对Test2类可见。
分析到这里,我们在回忆一下 Java中的浅复制与深复制,章节2.2中的声明,②在派生类中覆盖基类的clone()方法,并声明为public。现在明白这句话的原因了吧(为了让其它类能调用这个类的clone()方法,重载之后要把clone()方法的属性设置为public)。
下面再来看示例3:
Test3.java
![]() |
这里我用Test3类继承MyObject3,注意这两个类是不同包的,否则就是示例2的情形。在Test3类中调用Test3类的实例tobj的clone()方法,编译通过。而同样调用MyObject3类的实例obj的clone()方法,编译错误!
意想不到的结果,protected方法不是可以被继承类访问吗?
必须明确,类Test3确实是继承了类MyObject3(包括它的clone方法),所以在类Test3中可以调用自己的clone方法。但类MyObject3的protected方法对其不同包子类Test3来说,是不可见的。
这里再给出《java in a nutshell》中的一段话:
protected access requires a little more elaboration. Suppose class A declares a protected field x and is extended by a class B, which is defined in a different package (this last point is important). Class B inherits the protected field x, and its code can access that field in the current instance of B or in any other instances of B that the code can refer to. This does not mean, however, that the code of class B can start reading the protected fields of arbitrary instances of A! If an object is an instance of A but is not an instance of B, its fields are obviously not inherited by B, and the code of class B cannot read them.
翻译:protected访问是需要一些准备的。假如类A定义了一个protected的属性x,并且被定义在不同包中的类B扩展了类A。A和B不再同一个包内这一点非常重要。从而,B继承了A的protected属性x,而且在当前B 的实例中这个属性是能够被访问的又或者其他代码中涉及到访问这个属性的B的实例中也是可以访问这个属性的。然而,这并不表示B 的代码可以任意访问A的实例中protected修饰的属性!如果一个对象是A而不是B的实例,显然B是没有继承该对象的属性的,从而B的代码无法访问它们。
方法的访问控制:
|
public |
protected |
default |
private |
|
|
同类 |
T |
T |
T |
T |
|
同包 |
T |
T |
T |
|
|
子类(不同包) |
T |
T |
||
|
不同包中无继承关系的类 |
T |
本文对网上一篇文章修改的,增加了自己的理解和注释。原文地址:http://zhangjunhd.blog.51cto.com/113473/19287/
protected访问权限的更多相关文章
- C++ protected访问权限思考
看了云风关于protected的思考,自己也总结了下. C++的访问权限有三个 private.protected.public. 如果不包括继承的话,比较好理解,可以分为类外和类内两部分.类外不能访 ...
- Java中的访问权限控制
Java提供了public, private, protected 三个访问权限修饰词,提供了以下四种访问权限控制机制: 1.包访问权限: 2.Public访问权限: 3.Private访问权限: 4 ...
- Java中的访问权限细谈
一.成员访问控制权限 作用域 当前类 当前包 子孙类 其他包 public √ √ √ √ protected √ √ √ X private √ X X X default √ √ 当前包下继承可以 ...
- C++中public,protected,private派生类继承问题和访问权限问题
C++中public,protected,private派生类继承问题和访问权限问题 当一个子类从父类继承时,父类的所有成员成为子类的成员,此时对父类成员的访问状态由继承时使用的继承限定符决定. 1. ...
- public,protected,friendly,private的访问权限
请说出作用域public,private,protected,以及不写时的区别 这四个作用域的可见范围如下表所示. 说明:如果在修饰的元素上面没有写任何访问修饰符,则表示friendly. 作用域 ...
- 访问权限PPP(public、private、protected、default)之成员变量、成员变量权限解析
首先,我们需要清楚一下方法是由哪些部分构成的: [权限修饰符列表][别的修饰符列表] 返回值类型 方法名(参数列表){ 方法体:} 然后我们需要知道成员变量和成员方法访问有几种情况:1.当前包同一 ...
- 访问权限系列一(public/private/protected/default):成员变量
通过两个程序包对自身或互相之间的访问,得到结果.(先编译Test_01,得到class文件,通过Test的集中访问情况) 如下Test.java中内容: package com.java; /* * ...
- Delphi XE中类成员的访问权限(新增了strict private和strict protected,还有automated)
Delphi XE中类成员的访问权限共提供了6个关键词来用于限定访问权限:public.private.protected.published.automated strict private . s ...
- Java中public,protected,default,private的访问权限问题(简明扼要)
import packa.*;//导入了packa包中所有的类.(不包括包中的子包)一般不会用,用哪个导入哪个. 导包的原则:用到哪个类,就导入哪个类.所有字母都小写. 权限列表: public ...
随机推荐
- PHP获取当日或本月时间戳范围
在mysql数据库中使用int类型保存时间戳时,一般在程序中可能会用到统计当日,当月的一些数据.那么可以用如下的方式限定时间范围: //当日销售 $today_start = strtotime( ...
- POJ3264线段树求最值
刚开始还觉得有点怪怪的.因为想着如果每个树只是单纯地记录它所在的区间的话会不会有不在区间内的数据给更新了,但是我好像是傻掉了因为如果有这种情况出现的话在父亲节点就会分成l,mid和mid+1,r两个区 ...
- python基础问题
包安装相关问:如何安装Python三方包?在命令行如何检查一个包是否已安装?答:安装用pip install 卸载用 pip uninstall 直接import 这个包问:环境变量PATH的作用是什 ...
- WIN XP SP2系统经常性死机问题解决历程
如题: 1.初始时,XP还能进入系统,等系统3分钟左右,鼠标熄灭,键盘无反应,查看资源管理器CPU 100%,内存占用不高. 2.现象初步分析: a.怀疑是病毒占用CPU 100%,于是下载360安全 ...
- mysql中的with rollup得到group by的汇总信息
使用mysql中的with rollup可以得到每个分组的汇总级别的数据: 表如下: CREATE TABLE `test3` ( `id` int(5) unsigned NOT NULL AUT ...
- tp phpexcel 导出后台访问方法
public function phpexcel(){ //-----excel表导出 $dataid = $_GET['dataid']; $status = $_GET['status']; $F ...
- PASS-单组目标值法的样本量计算
临床试验的参数估计中,评价指标有确定的估计目标 ,临床试验目的需通过参数估计(含相应的可信区间估计)的方法证明评价指标不低于目标值时,可根据单组目标值法样本量公式计算. 例:欲证明器械A的诊断准确性非 ...
- 大数据学习(08)—— Hive简介
前面的Hadoop学习是非常体系化的,有主线有细节.到了Hive这里,知识点非常零散,感觉没有什么主线能把它串起来.从官方网站上就能看出这点差异. 什么是Hive Hive是一个基于Hadoop的企业 ...
- 记录21.07.21 —— ES6基础
学习目录 课件地址: ES6核心技术课件 1.let关键字 1.1 let与var的区别 ①let不能重复定义 ②块作用域的区别 ③变量声明之前let不能使用,var可以 ④ 课件代码 <htm ...
- css文件编码
当css文件的编码


