首页 > 代码库 > 容易犯错的问题点

容易犯错的问题点

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方法

容易犯错的问题点