(1)除了在(2)中表述的有关继承方面的区别之外,在某个类中定义的protected 方法和属性(注意是定义的,不是继承而来的,对于继承而来的情况在(2)中有表述)和默认权限方法和属性是一样的。比如,某类的protected 方法和属性在包外是不能通过该类对象进行访问的(你能在包外访问一个类的默认权限的方法和属性吗?当然不能),这就是为什么在某对象所在的包的以外的任何地方,你不可以通过该类的对象引用来调用它的protected 方法和属性,哪怕是在该类的子类中也不可以这样做。在该类包外的子类中能“看到“的只是子类自己继承来的protected 方法和属性,它是不能“看到“它的父类对象的protected方法和属性的。
(2)protected 修饰的方法和属性和默认权限方法和属性的区别在于:在包外的子类可以继承protected 方法和属性,而且被继承的protected 方法和属性,在子类中仍然是protected(如果方法没有被override),但是要注意的是,我这里说它们仍然是protected,是从它们可以由该子类的包外的子类继续继承的递归性角度来说的,实际上它们的可见范围和该子类中新定义的protected 方法和属性是有区别的 。不同之处在于在该子类中新定义的protected 方法和属性对该子类所在的包是可见的。而从父类中继承的protected 方法和属性在该子类所在的包中仅仅对该子类是可见的,同时另外它们还享有被继承前的可见范围(即被被继承前的可见范围仍然保持。这让人想起oop中的一个原则,方法和属性被继承后,其可见的范围只能扩大,不能缩小)。比如某类中定义某个protected方法,那么在该类所在的包中是可以访问该类的包外的子类的通过继承得到的该protected方法的(尽管该子类是在包外)。同时不可以在该类(代号A)的包外定义的某个类B中调用类A的子类SA的继承该类得到的该protected 方法(类B可以是A子类也可以不是A子类,类SA可以是在任何一个包中,但是B和SA是不同的两个类)。
(3)对于构造函数,protected修饰词带给它的语义本质上和带给其他方法的是一样的。但因为构造函数相比一般的方法有特别之处,所以protected语义在具体体现上也会有些不同。比如构造函数不存在继承的问题,但是构造函数有一个隐含或显式super()调用的问题。如果您对protected语义有了本质的认识,您一定能想到,你在包外的任何地方你都不能用new的方式直接调用某类的protected构造函数,但是在该类的包外的子类的构造函数中,是可以隐含地调用前者的protected构造函数的,也可以显式的通过super()调用(这个不难理解,就像他的其他protected方法可以用super.的方式来调用一样)。另外提醒下,构造函数从来都不是继承得来的,构造函数的可见性和父类的构造函数的可见性没有什么必然联系。
(4)综述之,protected的确切语义是:protected修饰的方法或变量将会被任何位置的子类继承,但是永远只能被最早定义他的父类所在的包的类所见(除了该类以及其子类能看到本身的该protected方法或变量之外。)
代码:
package com.protecteds.test;
import com.protecteds.test2.Duck1;
public class Bird {
protected int nFeathers;
public void name(){
Duck1 d=new Duck1();
d.nFeathers=0;
}
}
1.
package com.protecteds.test2;
import com.protecteds.test.Bird;
public class Duck1 extends Bird{
public void setn(int duck1n){
//在子类中直接访问父类中的protected变量
nFeathers=duck1n;
}
}
2.
package com.protecteds.test2;
import com.protecteds.test.Bird;
public class Duck2 extends Bird{
public void construct(int newduck2){
Duck2 d2 = new Duck2();
//在子类中通过子类的对象访问父类中的protected变量
d2.nFeathers=newduck2;
}
}
3.
package com.protecteds.test2;
import com.protecteds.test.Bird;
public class Duck3 extends Bird {
public void construct(int newduck3) {
Bird b = new Bird();
// 子类中用父类对象反而不能访问父类中的protected变量
//b.nFeathers = newduck3;
}
}
4.
package com.protecteds.test2;
import com.protecteds.test.Bird;
public class Duck4 extends Bird{
public void construct(int newduck4){
Duck1 d1 = new Duck1();
//子类中用另外一个子类的对象也不能访问父类中的protected变量
//d1.nFeathers=newduck4;
}
}
5.
package com.protecteds.test2;
import com.protecteds.test.Bird;
public class Duck5 extends Duck2{
public void construct(int f){
Duck2 d1 = new Duck2();
//不同包继承来之后就算protected也只有自己可以访问
//d1.nFeathers=f;
}
}
分享到:
相关推荐
`protected`是Java中四种访问权限之一,它在类的封装和继承中扮演着重要的角色。本篇文章将深入探讨`protected`关键字的含义、用法以及它在实际开发中的应用。 1. `protected`的含义: `protected`是一种中级访问...
Java中的`protected`关键字是访问控制修饰符之一,用于定义类的成员(如方法和字段)。`protected`提供了一种保护机制,使得这些成员只对同一包内的类和不同包中的子类可见。在这个深入理解中,我们将详细探讨`...
根据提供的文件信息,我们可以分析出一个关于Java ME(Java Mobile Edition)平台上的简单动画程序的知识点。这个程序创建了一个能够显示动画效果的小人形象,在屏幕上不断改变其图像以模拟跑步的动作。 ### Java ...
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String oldPassword = request.getParameter("oldPassword"); String newPassword1 =...
### Java 泛型详解与应用 #### 一、什么是Java泛型? Java泛型(Generics)是一种在编译时确保类型安全的机制,它允许程序员编写类型安全的通用类或方法,而无需进行显式的类型转换。在Java 1.5引入泛型之前,集合...
在Java编程中,`protected`和`static`是两个非常重要的修饰符,它们分别控制着类成员的访问权限和静态属性的行为。本文将详细阐述这两个关键字的作用,帮助初学者更好地理解和运用。 首先,我们来讨论`protected`...
在Java SCJP(Sun Certified Programmer for the Java 2 Platform)认证中,拖拽题是一种常见的题型,考察考生对Java语法和概念的理解。以下将针对提供的部分内容进行详细解释。 ### 题目1:数组元素输出 题目要求...
Java Web 学习之 Request 对象中 GET 和 POST 的差异 摘要:本文将对 Java Web 中 Request 对象中 GET 和 POST 方法的差异进行分析和比较,通过代码示例和输出结果,展示 GET 和 POST 方法的不同之处,并分析其优...
### Java连接数据库万能代码详解 #### 一、引言 在Java开发中,与数据库进行交互是一项非常常见的任务。为了实现这一目标,通常需要编写能够建立数据库连接的代码。本文将详细介绍一个“万能”的Java数据库连接...
### Java提取系统剪切板信息知识点详解 #### 一、Java剪切板API简介 Java提供了强大的工具包来处理剪切板操作,其中最核心的是`java.awt.datatransfer`包下的`Clipboard`类。该类允许我们访问并操作操作系统中的...
根据提供的文件信息,本文将对Java标准分计算(修改版)进行详细解析,重点在于理解标准分计算的具体实现过程及代码细节。 ### 一、概述 #### 1.1 文件基本信息 - **文件名**:AssessConsolidateUtils.java - **...
### Java常用几种加密算法 在Java开发中,数据的安全性是非常重要的一个方面,尤其是在网络通信、数据存储等场景下,合理的使用加密算法可以有效保护数据安全。本文将详细介绍几种常用的Java加密算法及其应用实例,...
Java 中常用的加密算法 MD5,SHA,RSA Java 中常用的加密算法有多种,包括 MD5、SHA 和 RSA 等,这些算法在不同的应用场景中发挥着重要作用。下面将对这些算法进行详细的介绍和分析。 一、MD5 加密算法 MD5...
### JAVA对WINDOWS注册表进行增删查 #### 概述 在Windows操作系统中,注册表(Registry)扮演着核心配置数据库的角色,存储了系统和应用程序的设置与选项。通过使用Java编程语言,开发者可以实现对注册表的增、删...
### Java范型攻略篇:深度解析与应用 #### 一、引言:Java范型的引入 在Java的发展历程中,范型(Generics)的引入标志着语言设计上的一个重要里程碑。自Java 1.5发布以来,范型成为了Java语言的重要特性之一,极...
根据提供的文件信息,我们可以总结出以下关于JAVA编程规范的关键知识点: ### 1. 文件与版权信息 - **文件格式:** Java源代码文件通常以`.java`为扩展名。 - **版权信息:** 每个Java文件的开头通常会包含版权...
在Java编程中,文件的上传和下载是常见的功能需求,特别是在Web应用中。这两个操作涉及到客户端与服务器之间的数据传输,通常使用HTTP协议进行。本文将深入探讨Java中如何实现文件的上传和下载。 **文件上传** ...
类是JAVA程序的基本单位之一,可以使用关键字`public`、`protected`、`private`等来控制其访问权限,例如: ```java public class CounterSet extends Observable implements Cloneable { // ... } ``` 这里定义了...
这个方法在Java的`Object`类中被定义为`protected`类型,因此所有Java类都能够覆盖它来实现特定的清理操作。在垃圾回收器准备回收一个不再被引用的对象时,会尝试调用该对象的`finalize()`方法,这个过程类似于C++中...
在Java编程语言中,上传和下载是常见的网络操作,尤其在网络应用开发中至关重要。这两个功能主要涉及客户端与服务器之间的数据交换。本节将深入探讨Java实现文件上传和下载的详细步骤,以及相关的关键知识点。 一、...