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

继承protected函数如何调用
在文件夹workplace里有一个class:

Java code

package workplace;

public class ProtectedFunc {
    protected void eat(){
    System.out.println("eat something");
    }
}




在workplace文件夹的上一级文件夹里有1个class:

Java code

import workplace.*;

class Abc extends ProtectedFunc{
    void eat(String s) {
    super.eat();
    System.out.println(s + "abc");
    }
    public static void main(String[] args) {
    Abc a = new Abc();
    a.eat();
    ProtectedFunc p = new ProtectedFunc();
    p.eat();

    }
}




问: 为什么 a.eat()不报错,而p.eat()就报错啊?

错误:Abc.java:12: eat()可以在ProtectedFunc中访问protected

------解决方案--------------------
protected 只能在同一包下,以及子类中可以使用。。。。
认真看下protected。。
------解决方案--------------------
protected (受保护的):被protected修饰的属性和方法可以在类内部,相同的包下,以及这个类的子类所访问;
------解决方案--------------------
protected (受保护的):被protected修饰的属性和方法可以在类内部,相同的包下,以及这个类的子类所访问

问: 为什么 a.eat()不报错,而p.eat()就报错啊?
因为a.eat()调用的是子类的方法,子类的eat方法可以访问父类的eat方法
p.eat() 你直接声明了一个父类的对象,因为该main函数与父类不在同一个包,所以访问不了父类的protected函数
------解决方案--------------------
包访问权限和保护访问权限的区别:
包访问权限可以在同一个包中使用,不管是子类还是非子类;
保护访问权限除了能在同一个包中使用外,还可以在不同包的子类中使用。
------解决方案--------------------
Abc a = new Abc();
a.eat();
ProtectedFunc p = new ProtectedFunc();
p.eat();
 子类及同一个包才可以用 那个对象a是子类的对象 但是ProtectedFunc new出来的对象p跟那个保护成员不在同一个包里 这样说的通么 共同探讨下