Java中访问修饰符protected的权限
2012-03-21 11:27
381 查看
在Core Java中有这样一段话“在Object类中,clone方法被声明为protected,因此无法直接调用anObject.clone()。子类只能直接调用受保护的clone方法克隆它自己。为此,必须重新定义clone方法,并将它声明为public,这样才能让所有的方法克隆对象”。但是不是所有的子类都可以访问受保护的方法吗?不是每个子类都是Object的之类吗?下面就用例子来说明下protected访问修饰符的问题。
在package1中创建SuperClass.java文件,里面有一个protected方法,内容如下。
如果在另一个包package2中创建SubClass1.java文件,内容与包package1中的SubClass1.java内容相同。
如果我们在package2的SubClass1.class中重写SubClass2类中的SuperClass的method方法。
如果我们在一个类中调用父类对象的protected方法会怎么样?
在package1中创建父类SuperClass.java文件,里面有一个protected方法,内容如下。
在另一个包package中创建子类SubClass.java文件,内容如下。
这里我在SubClass继承另一个包中的SuperClass,这个SuperClass中有一个名为method()的protected方法。在SubClass类中调用SubClass类的实例sub的method()方法,编译不会报错。而同样调用SuperClass类的实例sup的method()方法,编译报错!
protected方法不是可以被子类访问的吗?
从接触Java开始就了解Java中访问修饰符的权限可以用下面这个表格概括:
default为不写访问修饰符时。
现在必须明确的是:类SubClass确实是继承了类SuperClass(包括它的method方法),所以在类SubClass中可以调用自己的method方法。但类SuperClass的protected方法对其不同包子类SubClass来说,是不可见的。
注意protected访问修饰符的规则及其微妙。
在package1中创建SuperClass.java文件,里面有一个protected方法,内容如下。
package package1; public class SuperClass { protected void method(){ System.out.println("This is a protected method in the super class ."); } }在同一个包中创建SubClass1.java文件,类SubClass1和类SubClass2均继承自SuperClass,内容如下。
package package1; public class SubClass1 extends SuperClass { public static void main(String[] args) { SuperClass sup = new SuperClass(); SubClass1 sub1 = new SubClass1(); SubClass2 sub2 = new SubClass2(); sup.method(); //Compile OK sub1.method(); //Compile OK sub2.method(); //Compile OK } } class SubClass2 extends SuperClass{ }编译全部通过,不难理解,protected方法对同包中的类是可见的。
如果在另一个包package2中创建SubClass1.java文件,内容与包package1中的SubClass1.java内容相同。
package package2; import package1.SuperClass; public class SubClass1 extends SuperClass { public static void main(String[] args) { SubClass1 sub1 = new SubClass(); SubClass2 sub2 = new SubClass2(); Sub1.method(); //Compile OK sub2.method(); //Compile Error } } class SubClass2 extends SuperClass{ }这样编译器会在sub2.method()处报错误The method clone from the type SuperClass is not visiuable。这种情况下,sub1和sub2都从父类中继承到名为method()的protected方法,sub1.method()编译通过,而sub2.method()编译没有通过,因为sub2是他所在的类的父类的另一个子类。由此我们可以想到:不能在一个子类中访问另一个子类的protected方法,尽管这两个子类继承自同一个父类。
如果我们在package2的SubClass1.class中重写SubClass2类中的SuperClass的method方法。
package package2; import package1.SuperClass; public class SubClass1 extends SuperClass { public static void main(String[] args) { SubClass1 sub1 = new SubClass1(); SubClass2 sub2 = new SubClass2(); sub1.method(); //Compile OK sub2.method(); //Compile OK } } class SubClass2 extends SuperClass{ protected void method(){ super.method(); } }这种情况跟第一种类似,protected方法可以被同一个包中的类访问。当在SubClass2类中覆盖method()方法时,SubClass2类和SubClass1类在同一个包下,所以此protected方法对SubClass1类可见。现在应该可以理解“为此,必须重新定义clone方法,并将它声明为public,这样才能让所有的方法克隆对象”这句话了吧。
如果我们在一个类中调用父类对象的protected方法会怎么样?
在package1中创建父类SuperClass.java文件,里面有一个protected方法,内容如下。
package package1; public class SuperClass { protected void method(){ System.out.println("This is a protected method in the super class ."); } }
在另一个包package中创建子类SubClass.java文件,内容如下。
package package2; import package1.SuperClass; public class SubClass extends SuperClass { public static void main(String[] args) { SuperClass sup = new SuperClass(); SubClass sub = new SubClass(); sup.method(); //Compile Error sub.method(); //Compile OK } }
这里我在SubClass继承另一个包中的SuperClass,这个SuperClass中有一个名为method()的protected方法。在SubClass类中调用SubClass类的实例sub的method()方法,编译不会报错。而同样调用SuperClass类的实例sup的method()方法,编译报错!
protected方法不是可以被子类访问的吗?
从接触Java开始就了解Java中访问修饰符的权限可以用下面这个表格概括:
作用域 | 当前类 | 同包 | 子孙类(不同包) | 其他 |
---|---|---|---|---|
public | Y | Y | Y | Y |
protected | Y | Y | Y | N |
default | Y | Y | N | N |
private | Y | N | N | N |
现在必须明确的是:类SubClass确实是继承了类SuperClass(包括它的method方法),所以在类SubClass中可以调用自己的method方法。但类SuperClass的protected方法对其不同包子类SubClass来说,是不可见的。
注意protected访问修饰符的规则及其微妙。
相关文章推荐
- Java中访问权限修饰符public protected 缺省默认 private的用法总结(转)
- Java中访问权限修饰符protected, default
- Java中访问权限修饰符public protected 缺省默认 private的用法总结
- Java之访问权限修饰符 private default protected public
- Java中访问权限修饰符public protected 缺省默认 private的用法总结(转)
- JAVA基于类的访问权限以及protected修饰符的限制
- Java的访问权限修饰符public、默认(包访问权限)、protected、private
- java里面的四种访问权限修饰符(private、缺省、protected、public)
- java 访问权限修饰符(public,private,protected)
- java中的访问权限修饰符 protected
- java--访问控制和内部类 (权限修饰符)
- 关于java中的protected访问权限
- Java访问权限public、protected、默认、private
- java中4种修饰符访问权限的区别
- Java访问权限控制修饰符比较
- Java中访问权限修饰符public protected private, 缺省默认权限的用法总结
- java-访问修饰符public,private,protected,以及不写(默认)时的区别
- java中的访问修饰符:public、private、protected、friendly.
- JAVA权限修饰符(public/protected/private)
- Java 中4种访问修饰符 public/protected/default(friendly)/private