Java 中protected详解
类NewObject中有protected修饰的方法或者属性,则:
-
•同一个包中:
- •可在同一个包里的子类中实例化 NewObject 类获得对象,然后可用该对象访问protected修饰的方法或者属性,即 . 操作访问。
- •可在同一个包里的非子类中实例化 NewObject 类或同一包下的子类获得对象,然后可用该对象访问protected修饰的方法或者属性。 •非同一个包中:
- •可在非同一个包里的类(有所谓有没有关系)中实例化 NewObject 类获得对象,但无法用该对象直接访问protected修饰的方法或者属性。但可以通过get或者set方法进行操作。
- •可在非同一个包里的 NewObject 类的子类中调用 NewObject 类中protected修饰的方法或者属性,即protected修饰的方法和属性可被不同一个包中的子类继承。
- •简而言之,在非同一个包内,可在继承的类中操作父类中的protected方法或者属性,但不可以在初始化类对象来进行对NewObject 对象中的protected方法或者属性访问。
不同包下的例子
// com.lb.phj包下person类,用于设置名字的方法
package com.lb.phj;
public class Person {
private String name;
//protected权限
protected void setName(String name)
{
this.name = name;
}
public void print()
{
System.out.println("名字是:"+name);
}
}
// com.lb.name包下的类,用于设置名字的方法
package com.lb.name;
import com.lb.phj.Person;
public class Li extends Person
{
}
class Wang extends Person
{
public void setMyName(String name)
{
setName(name);
}
public void setLiName(String name)
{
Li li = new Li();
// li.setName(name); 错误
li.print();
}
}
原因:子类只能在自己的作用范围内访问自己继承的那个父类protected域,而无法到访问别的子类(同父类的亲兄弟)所继承的protected域。
若在wang中访问li的protected方法,可以在Li这类中写上
public void setMyName(String name)
{
setName(name);
}
相当于适配