1.我们都知道protected类型的方法或者域, 可以被同包下的其他类访问, 或者该类的子类访问. 除了这两种情况都不能访问protected权限的字段或者方法. 其实这句话只是笼统地说了下protected的作用, 并不完全对, 看代码
package parent; /** * Created by xinfengyao on 17-1-15. */ public class Parent { protected int i; protected void print() { System.out.println("parent中protected权限的print()方法"); } }
package sub; import parent.Parent; /** * Created by xinfengyao on 17-1-15. */public class Sub1 extends Parent { protected void sub1Print() { System.out.println("sub1Print"); } public static void main(String[] args) { Parent parent = new Parent(); parent.print(); System.out.println(parent.i); Sub1 sub1 = new Sub1(); sub1.print(); System.out.println(sub1.i); }}
idea显示编译出错:
我们看到Parent类和它的子类Sub1是在不同包中的, 在子类Sub1中, 不能通过父类类型的变量访问父类中的protected成员和protected方法. 但是可以通过子类类型变量访问从父类那继承过来的protected成员和方法.
在看段代码:
package sub; import parent.Parent; /** * Created by xinfengyao on 17-1-15. */public class Sub2 extends Parent { public static void main(String[] args) { Sub1 sub1 = new Sub1(); sub1.print(); System.out.println(sub1.i); sub1.sub1Print(); Sub2 sub2 = new Sub2(); sub2.print(); System.out.println(sub2.i); }}
idea也编译报错:
因此我们可知, 在子类中, 不能访问兄弟类(即直接父类是同一个类)中从父类那继承过来的protected方法, 但是可以访问同一包下的兄弟类中自己创建的protected方法.
总结:
(1). 子类中不能通过父类类型的变量, 访问父类中的protected方法和成员, 只能通过本身类型的变量访问从父类那继承过来的protected方法和成员
(2). 子类中不能访问兄弟类中从父类那继承过来的protected方法, 但是可以访问同一包下兄弟类自己新增的protected方法
时间: 2024-11-05 05:45:37