日期:2014-05-20  浏览次数:20791 次

protected修饰的成员在子类中怎么不能访问?代码如下

package zpc.databaseTest;
public class Father {
private String name="";
private int a=12;;
protected void test1(){
System.out.println("name="+name);
}

public void test2(){
System.out.println("2="+test3());
}
private int test3(){
return 2;
}
}

package TinkingJava;
import zpc.databaseTest.Father;
public class Son extends Father{
public static void main(String[] args){
Father f=new Father();
f.test1();//test1()是protected的啊

Son s=new Son();
s.test1();//这里不报错
s.test2();
//s.test3();//private的当然不能访问
}

}

------解决方案--------------------

protected,表示有条件的限制以保护该成员,当您将类别成员定义为protected之后,继承它的类就可以直接使用这些成员,但这些成员仍然受到对象范围的保护,不可被对象直接使用。

对protected而言:Son extends Father,在子类Son的作用范围内,只能调用Son定义的对象的protected方法(即该方法从父类Father中继承而来);
而不能调用Father类对象的protected 方法:Father f = new Father();
------解决方案--------------------
没搞懂   表示明天去问老师,只是你的Son既然都继承了Father?,为怎么还要建Father?的对象呢,需求是这样的么?
------解决方案--------------------
引用:
Quote: 引用:

把LZ的代码拷贝到本地测试通过,只是类所在的包不同,没报错,还是把 错误拷贝出来看下。

就是想测试不同包的情况下protected的效果


子类能调用test1()是因为子类有test1方法且在访问权限内, 父类不能调用是因为不在访问权限内!

你帖子的问题跟你代码表达的疑惑完全没关系,所以你基本概念没弄清楚
------解决方案--------------------
访问控制权限
作用范围: 当前类   同一个包   其他package  同包子孙类  不同包子孙类    
public           可以      可以           可以                    可以                 可以 
protected      可以      可以         不可以                可以                   可以
default          可以      可以          不可以               可以                   不可以
private          可以      不可以       不可以               不可以               不可以
 
lz看看上面的访问权限,你的程序是不同包的。package zpc.databaseTest;和package TinkingJava;访问当然会出错。
------解决方案--------------------
我认为你对protected权限的了解有误;
protected 表明被它修饰的成员变量和方法为保护类型,在同一个包里和 public 类型是一样的,也是能够访问到的。但是如果在不同包里的 protected 类型的成员变量就只能通过子类来访问,这个修饰符是区别于其他的修饰符的。

子类之所以可以访问是因为,子类继承了父类,这些属性和方法相当于也继承过来了,等同于相同包下的访问

这是我的理解,我也学习没多久,希望对你有帮助......

------解决方案--------------------
protected是指子类继承父类时,可以被子类继承的部分。在子类内部可以调用,new 以后属于外部。new 后如果不在同包下就不能访问。
------解决方案--------------------
protected和包没关系,和包有关系的是default
main在类A里面,A的private方法都能调用,
因为main是属于这个类的,它的权限范围自然就是A本身,A本身不能调用父类的private方法,但能调用protected方法.
楼主把main移动其他地方去,就是你想象的

------解决方案--------------------
其实你迷惑是因为你 只看到了 protected修饰的字段或方法允许被子类访问; 
却没理解另一个很重要的一个限制:在子类中,该子类中的方法只能用 该子类对象访问protected修饰的字段或方法,而不能用 父类对象或该父类派生的其它子类对象 访问protected修饰的字段或方法;当然这里是在不同的包中;还有就是在对象方法中用super调用父类方法,如super.test1()等,其实这样调用还是限制在该子类的对象方法中;

用你的示例来说就是:在Son类中,Son中的方法只能用 Son对象 访问protected修饰的字段或方法;

还要注意:编译时变量用的是声明的类型;

你还可以新建个包,再创建个子类,这样就能更清楚了解了:
如:
public class Son1 extends Father{

public static void main(String[] args) {
Father f = new Son1();
f.test1();

Son son = new Son();
son.test1();
                                          
                                          Son1 son1 = new Son1();
son1.test1();

}