java中protected权限修饰词的用法
首先,根据菜鸟教程的说法,protected的可见性在于两点:
基类的 protected 成员是包内可见的,并且对子类可见;
若子类与基类不在同一包中,那么在子类中,子类实例可以访问其从基类继承而来的protected方法,而不能访问基类实例的protected方法。
也就是说protected只具有包权限,但是和包权限不同的是他可以为子类提供权限,下面我来用代码演示一下:
首先,创建一个Fruit类,放在了com.java.study.Entity这个包里
package com.java.study.Entity;
public class Fruit {
protected int taste;
protected void eat(){}
}
那我们首先验证第一个原则,即在同一包中的Test类(非子类)和不在同一包中的类OtherTest访问taste属性和eat方法
package com.java.study.Entity;
public class Test {
public void test(){
Fruit fruit = new Fruit();
int a =fruit.taste; //编译通过
fruit.eat(); //编译通过
}
}
而不在同一包内的OtherTest类中引用,则会在编译期间报错
package com.java.study.OtherEntity;
import com.java.study.Entity.Fruit;
public class OtherTest {
public static void main(String[] args) {
Fruit fruit = new Fruit();
int a =fruit.taste; //报错,taste是protected属性
fruit.eat(); //报错,eat是protected方法
}
}
这里可以看到在同一个包内的Test,编译期间没有报错,原则一没有问题
接下来是重点,第二个原则是什么意思呢
我们创建Fruit的子类Orange(和Fruit类不在同一个包中)
package com.java.study.OtherEntity;
import com.java.study.Entity.Fruit;
public class Orange extends Fruit {
public static void main(String[] args) {
Orange orange = new Orange();
Fruit fruit = new Fruit();
int a = orange.taste; //这个taste是从父类继承过来的属性
int b = fruit.taste;//这个taste是父类实例的属性
orange.eat();//这个eat是从父类继承过来的方法
fruit.eat();//这个eat是父类实例的方法
}
}
打个不太恰当但是容易理解的例子: 比如爸爸有聪明的脑袋,儿子从爸爸那里继承了同样聪明的脑袋,在儿子离开爸爸(即不在同一个包中)的生活中(即子类中),儿子可以用自己的脑袋来思考,但是不能使用爸爸的,因为爸爸在另一个包里,没办法跑过来帮儿子思考.