`
llystar
  • 浏览: 63837 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JAVA Protected详解

 
阅读更多

(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;
}
}

分享到:
评论

相关推荐

    详解Java编程中protected修饰符与static修饰符的作用

    主要介绍了Java编程中protected关键字与static关键字的作用,是Java入门学习中的基础知识,需要的朋友可以参考下

    Java中抽象类和接口的区别与作用详解

    通常我们所讲的abstract class,至少包含了一个抽象方法,这个方法默认是protected型,而Interface也至少定义了一个抽象方法。abstract class中也可以包含已经实现了的方法。 abstract class可以extends另一个...

    Java中的private、protected、public和default的区别(详解)

    下面小编就为大家带来一篇Java中的private、protected、public和default的区别(详解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    java各大公司面试题详解(有案例分析哦)

    作用域public,private,protected,以及不写时的区别 答:区别如下: 作用域 当前类 同一package 子孙类 其他package public √ √ √ √ protected √ √ √ × friendly √ √ × × private √ × × × 不写时...

    JAVA入门1.2.3:一个老鸟的JAVA学习心得 PART1(共3个)

    11.3.3 protected:仅对子类和同包的类可见 300 11.3.4 默认控制符:仅在本包中可见 301 11.3.5 private:仅对本类可见 303 11.3.6 理解4个访问控制符 304 11.3.7 访问控制符可见性汇总 306 11.3.8 访问控制符...

    Java入门教程(微学苑)-part1

    3.19 Java包装类、拆箱和装箱详解 54 3.20 包装类的应用 54 3.20.1.1 1) 实现 int 和 Integer 的相互转换 54 3.20.1.2 2) 将字符串转换为整数 55 3.20.1.3 3) 将整数转换为字符串 55 3.21 自动拆箱和装箱 56 3.22 再...

    Java入门1·2·3:一个老鸟的Java学习心得.PART3(共3个)

    11.3.3 protected:仅对子类和同包的类可见 300 11.3.4 默认控制符:仅在本包中可见 301 11.3.5 private:仅对本类可见 303 11.3.6 理解4个访问控制符 304 11.3.7 访问控制符可见性汇总 306 11.3.8 访问控制符...

    Java期末复习题(0)1

    Java单选题详解一 、单选题 (本大题共100题, 小计100.0分)1. 访问权限修饰符有public、private、protected和默认修饰符(没

    java_第二章_语法(2)

    顺序结构,选择结构,循环结构,访问修饰符详解(不写、private、protected、public)、方法、方法的特性-重载、单例模式实现

    Java中成员方法与成员变量访问权限详解

    在Java学习过程中,在写类经常为用到public,private和protected,我个人的经验是一般类的成员变量都是用private,方法用public,类的内部用protected方法,如果是存在子类的,那我就会把父类中的成员变量变为...

    整理后java开发全套达内学习笔记(含练习)

    protected (关键字) 受保护的,私有的 [prә'tektid] provide v.规定(供应,准备,预防)[prә'vaid] refer to v.引用 [ri'fә:][tu:] reference n. 参考(引用,涉及)['refәrәns]' -->reference variable 参量, 参考...

    java语法一些易忘知识点

    protected详解 private static final abstract synchronized transient volatile java运算符 操作符 含义 算数运算符 + – * / % ++ – 赋值运算符 = 关系运算符 == != > = <...

    C#中类和结构的区别 -- 示例详解

    不能有protected 修饰符 可以不使用new 初始化 在结构中初始化实例字段是错误的 类: 有默认的构造函数 有析构函数 可以使用 abstract 和 sealed 有protected 修饰符 必须使用new 初始化

    详解Android中实现热更新的原理

    我们知道Java在运行时加载对应的类是通过ClassLoader来实现的,ClassLoader本身是一个抽象来,Android中使用PathClassLoader类作为Android的默认的类加载器,PathClassLoader其实实现的就是简单的从文件系统中加载类...

    最新2019年9月一级MS OFFICE考试题库软件_protected.exe

    无忧专注于计算机等级模拟考试系统与财会考试模拟系统的开发与维护,拥有全面的教、学、模、练体系,其中包括会计从业、初级职称、计算机一级MS、二级MS、二级C语言、二级C++、二级JAVA、二级Access、二级VB等多个...

    C/C++ 公有继承、保护继承和私有继承的对比详解

    这和Java有很大的不同,Java默认使用public继承,而且只有公有继承。  1.使用public继承时,派生类内部可以访问基类中public和protected成员,但是类外只能通过派生类的对象访问基类的public成员。  (1)基类的...

    Android OkHttp Post上传文件并且携带参数实例详解

    Android OkHttp Post上传文件并且携带参数 ...protected void post_file(final String url, final Map<String> map, File file) { OkHttpClient client = new OkHttpClient(); // form 表单形式上传 Mul

    【04-面向对象(上)】

    方法的详解 •方法的所属性  –一旦将一个方法定义在一个类里,如果用static 修饰了,这个方法属于这个类,否则属于这个类的对象.  –方法不能独立执行,必须要有调用者.(如:类.方法、对象.方法)  –方法不能...

    Scala程序设计(第2版)

    13.4 Protected可见性 304 13.5 Private可见性 305 13.6 作用域内私有和作用域内受保护可见性 306 13.7 对可见性的想法 312 13.8 本章回顾与下一章提要 313 第14章 Scala类型系统(I) 314 14.1 ...

    【05-面向对象(下)】

    •在java类里只能包含Field,方法,构造器,初始化块,内部类(接口、枚举)等5种成员。 用static修饰的类成员属 于类成员,类Field既可通过类来访问,也可以通过类的对象来访问。当通过对象来访问类属性时,系统会在底...

Global site tag (gtag.js) - Google Analytics