谈谈JAVA中的protected访问权限

转载 2008年10月03日 11:55:00

<?xml:namespace prefix = o />

 

private

default

protected

public

同类

T

T

T

T

子类(同一包中)

F

T

T

T

(同一包中)

            F

T

T

T

子类(不同包中)

F

F

T/F

T

(不同包中)

F

F

F

T

关于在子类不同包中时protected的访问权限的问题

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.[java in a nutshell]

下面一个例子转载自Blog: http://zhangjunhd.blog.51cto.com/

Test.java

class MyObject {}

public class Test {

    public static void main(String[] args) {

       MyObject obj = new MyObject();

       obj.clone(); // Compile error.

    }

}

此时出现上文提到的错误: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的子类。但是,不能在一个子类中访问另一个子类的protected方法,尽管这两个子类继承自同一个父类。

再看示例2

Test2.java

class MyObject2 {

    protected Object clone() throws CloneNotSupportedException {

       return super.clone();

    }

}

 

public class Test2 {

    public static void main(String[] args) throws CloneNotSupportedException {

       MyObject2 obj = new MyObject2();

       obj.clone(); // Compile OK.

    }

}

这里,我们在MyObject2类中覆盖(override)父类的clone()方法,在另一个类Test2中调用clone()方法,编译通过。

编译通过的原因显而易见,当你在MyObject2类中覆盖clone()方法时,MyObject2类和Test2类在同一个包下,所以此protected方法对Test2类可见。

分析到这里,我们在回忆一下Java中的浅复制与深复制文中,章节2.2中的声明,②在派生类中覆盖基类的clone()方法,并声明为public现在明白这句话的原因了吧(为了让其它类能调用这个类的clone()方法,重载之后要把clone()方法的属性设置为public)。

下面再来看示例3

Test3.java(重点)

package 1

class MyObject3 {

protected Object clone() throws CloneNotSupportedException {

       return super.clone();

    }

}

package 2

public class Test3 extends MyObject3 {

    public static void main(String args[]) {

       MyObject3 obj = new MyObject3();

       obj.clone(); // Compile error.

       Test3 tobj = new Test3();

       tobj.clone();// Complie OK.

    }

}

这里我用Test3类继承MyObject3,注意这两个类是不同包的,否则就是示例2的情形。在Test3类中调用Test3类的实例tobjclone()方法,编译通过。而同样调用MyObject3类的实例objclone()方法,编译错误!

意想不到的结果,protected方法不是可以被继承类访问吗?

必须明确,类Test3确实是继承了类MyObject3(包括它的clone方法),所以在类Test3中可以调用自己的clone方法。但类MyObject3protected方法对其不同包子类Test3来说,是不可见的。

 

谈谈 java 的protected 访问权限。

今天做项目时遇到一个问题。以为对同一包内的一个类调用另一个类的protected 方法感到很奇怪。然以为protected 需要派生类才能访问,没想到在同一包内也能访问protected 成员。哎!弄...
  • clam_clam
  • clam_clam
  • 2011年07月28日 14:55
  • 14593

Java:谈谈protected访问权限

来谈谈protected访问权限问题。看下面示例1: Test.java class MyObject {}   publicclass Test {     publi...
  • JIAOSHOUJIE
  • JIAOSHOUJIE
  • 2014年07月23日 20:48
  • 261

关于java中的protected访问权限

1. protected 访问控制符能被用于方法和成员变量。     2. 声明为protected的方法和成员变量能被同一个包里的所有类所访问,就像默认修饰符package一样。     3...
  • jinyongqing
  • jinyongqing
  • 2014年02月23日 13:36
  • 2803

Java中访问权限修饰符protected, default

作用域   当前类    同package   子孙类 其他package  public √   √  √ √  prot...
  • u013238950
  • u013238950
  • 2016年03月18日 00:04
  • 2538

Java中public,protected,private以及默认的访问权限作用域

理解public,protected,default,private的不同范围权限
  • qq_31686787
  • qq_31686787
  • 2016年09月16日 09:11
  • 2858

C++对于类访问权限public,protected,private的深刻理解

本帖转自网络,查找不到原作者,
  • njustzj001
  • njustzj001
  • 2014年10月11日 17:55
  • 1238

Java 访问权限控制public>protected>同包>private

前言          Java提供了访问权限的关键词,通过这些关键词,类库的开发者就可以向使用这个类库的开发者指明那些字段 、方法是可以用的,那些是不可以用的。字段、方法的访问权限等级有四个,从...
  • L2HL2H
  • L2HL2H
  • 2015年12月28日 21:52
  • 927

java public protected 默认 还有private修饰后的可见性,访问权限

一直对public protected 默认 还有private的可见性理解的不透彻,用代码实践并记录下来,加深自己的理解。...
  • qq85469769
  • qq85469769
  • 2016年11月18日 15:25
  • 567

Java 访问权限控制:你真的了解 protected 关键字吗?

在一个类的内部,其成员能否被其他类所访问,取决于该成员的修饰词;而一个类能否被其他类所访问,取决于该类的修饰词。Java的类成员访问权限修饰词有四类:private,包访问权限,protected和p...
  • justloveyou_
  • justloveyou_
  • 2017年03月12日 22:54
  • 7084

Java:protected提供了包内访问权限

声明为protected访问权限的类成员,真的只能供当前类和子类访问吗?不是的,还可以供包内其它类访问!这还是今天看知道的,原书是这样说的:protected提供了包内访问权限. 我们来通过一段小程序...
  • hengbao4
  • hengbao4
  • 2016年11月11日 10:33
  • 1049
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:谈谈JAVA中的protected访问权限
举报原因:
原因补充:

(最多只允许输入30个字)