今天将近花了三个小时才弄懂protected这个关键字的含义:
protected的访问权限是包内,类内和子类。[color=red]这里的子类,要理解这个子类。[/color]
[color=green]下面是在我在百度中提问后一个朋友的回答:
因为protected属于受保护的访问权限,一个类中的成员如果使用了protected访问权限,则只能被本包及不同包的子类访问。
很显然你的两个类不在同一个包,就因该用子类的实例对象访问,而你却在包含子类的包中中实例化了父类对象,你可能在想,我明明是在子类中实例化了父类对象,我要访问我自己的成员还不行吗?。。可你要想清楚,你的父类并不在这个包。(这时你在子类的包中用父类的实例化对象访问用protected修饰的属性,它压根就找不到,所以会报出不可见的错误)所以你必须用Clone2 c = new Clone2();c.name;或是用匿名对象
new Clone2().name;(其实是子类的一个匿名对象)访问。 [/color]
package July;
public class Clone1 {
protected String name="clone1";
}
package clone;
import July.Clone1;
public class Clone2 extends Clone1{
public void print() {
Clone1 c = new Clone1();
/*
* 此处报错:The field clone1.name is not visible
* 如果两个类在同一个包就不会报错
* 这里不会因为Clone2继承了Clone1而使得可以访问
*/
System.out.println(c.name);
/*
* 可以通过new出本类对象访问形式访问
*/
Clone2 c2 = new Clone2();
System.out.println(c2.name);
/*
* 直接访问没错
*/
System.out.println(name);
}
}
protected的访问权限是包内,类内和子类。[color=red]这里的子类,要理解这个子类。[/color]
[color=green]下面是在我在百度中提问后一个朋友的回答:
因为protected属于受保护的访问权限,一个类中的成员如果使用了protected访问权限,则只能被本包及不同包的子类访问。
很显然你的两个类不在同一个包,就因该用子类的实例对象访问,而你却在包含子类的包中中实例化了父类对象,你可能在想,我明明是在子类中实例化了父类对象,我要访问我自己的成员还不行吗?。。可你要想清楚,你的父类并不在这个包。(这时你在子类的包中用父类的实例化对象访问用protected修饰的属性,它压根就找不到,所以会报出不可见的错误)所以你必须用Clone2 c = new Clone2();c.name;或是用匿名对象
new Clone2().name;(其实是子类的一个匿名对象)访问。 [/color]