package package1;public class Class1 {
public Class1(){
System.out.println("sss");
}
     protected void f1(){
      System.out.println("f1");
      }
}
这是第一个包里的一个类,其中一个是构造函数,还有一个是保护的函数package package2;
import package1.Class1;
public class Class2 extends Class1{
public static void main(String args[]){
Class1 c1=new Class1();
c1.f1();
}
}
这是另外一个包,其中一个类继承上面一个包中的一个类,按理来说应该是对的,
为什么eclipse老说f1()被隐藏了呢~~我很不解,初学java,可能哪儿疏忽了,
大家指教~

解决方案 »

  1.   

    Class1 c1=new Class1();虽然Class1为public,但是f1()是protected修饰的,它具有包访问性。它的子类才能在不同的包中调用f1()。
    Class2 c2 = new Class2();
    c2.f1();
    这样就可以调用了。
      

  2.   

    应为你的 f1()在 class1中声明的是protected 类型的
    保护型(protected)变量   (允许被其归属的类,由此类派生的子类以及同一包中的其他类访问)  
    你的class1 和calss2不同包
      

  3.   

    protected void f1(){
             System.out.println("f1");
          }既然使用了protected,就说明这个方法的使用范围就是他的子类和pakage1这个包中的其他类,
    你换到其他的包里去调用这个方法自然就相对时隐藏的看不到的啦
      

  4.   

    [Quote=引用楼主 cf527085608 的回复:
    }
    这是另外一个包,其中一个类继承上面一个包中的一个类,按理来说应该是对的,
    [/Quote]
    你的这个类应该是包外的类。
      

  5.   

    我的理解:
    在不同包的时候,子类可以访问父类的protected修饰的成员变量和方法。
    这句话的含义是可以用子类的对象访问父类的成员变量或者方法,但是不能用父类的对象访问。public class Class2 extends Class1 { public static void main(String[] args) {
    Class1 c1 = new Class1();
            //c1.f1();     The method f1() from the type Class1 is not visible
    Class2 c2 = new Class2();
    c2.f1();
    }
    }
      

  6.   

    什么是继承?你必须在类的方法里使用才可以。比如如下
      public void test() {
        f1();
      }你在一个静态方法里,访问另一个package的protected方法,当然被拒绝了。
    因为静态方法不存在什么继承的问题。
    所以,你只能在类的方法里,直接使用f1(),而不能使用如下的代码
      public void test() {
        Class1 c1 = new Class1();
        c1.f1();
      }
    如果是new一个,我们还要继承干嘛呢?呵呵!