父类:public class Person {
protected int i = 100;
}
子类:package m;public class Person1 extends Person {
public void method() {
System.out.println(i);
}
}
本来是想验证protected型的成员变量可以被子类访问,但我在Person.java和Person1.java所在的路径D:\java\TestAccess\me下javac Person1.java后总是提示找不到Person符号。也找不到i这个符号。但是我要不把Person1打包,即不写package m;则编译javac Person1.java就可通过,一写package m;则编译就不通过。请大神们指教!

解决方案 »

  1.   

    public class Person {
    protected int i = 100;
    }
    由于父类中你没有指定package,即Person类的原始码(Person.java)在D:\java\TestAccess\me目录下
    package m;public class Person1 extends Person {
    public void method() {
    System.out.println(i);
    }
    }
    子类中你指定了package m,即Person1类的原始码在D:\java\TestAccess\me\m 目录下
    所以在me目录下javac Person1.java会出现编译错误,所以要import Person类的完全吻合名称
      

  2.   

    这是java 中修饰符的问题,这样改一下代码就行了,没有必要定义在两个包下,修饰符范围你可以看一下这个:http://blog.csdn.net/zhaoming262350/article/details/7907749 class Person
     {
    protected int i = 100;
     }
     public class Person1 extends Person
     {
    public static void main(String [] args)
    {
    Person1 p1 = new Person1();
    System.out.println(p1.i);
    }public void method()
     {
    System.out.println(i);
    }}
      

  3.   

    2楼,要想import Person的一个完全吻合名称怎么导呀,关键是Person类是裸体类呢,不知道怎么导,还有,我觉得即便为package m,Person1.java也不一定非得放在D:\java\TestAccess\me\m下的,在D:\java\TestAccess\me\下直接编译也能成功吧……
      

  4.   

    我在当前路径D:\java\TestAccess\me下直接编译javac Person1.java 而现在Person.class也在D:\java\TestAccess\me下,所以按理说应该可以直接找到Person.class,问题就出在把Person1.java放进了一个包中就找不到Person类了。
      

  5.   

    如果你写package m;那么你应该在m的上一级目录(也就是m所在的那个目录)运行:
    javac m\Person1.java
    如果你有extends,那么你还必须指定classpath
      

  6.   

    我建了m文件夹,上一级目录为D:\java\TestAccess\me。按照您说的javac \m\Person1.java,并指定了classpath,添加上了D:\java\TestAccess\me(因为Person.class就位于D:\java\TestAccess\me下),在D:\java\TestAccess\me下运行javac m\Person1.java,但还是提示找不到符号呀
      

  7.   

    注意,Person是带package me的,所以classpath是D:\java\TestAccess,而不是D:\java\TestAccess\me
    另外,如果Person和Person1不在同个package下,Person1需要import me.Person
      

  8.   

    这些都是正确的,通过了才无语了。
    protected 修饰的变量的访问权限是 “同包下的子类才可访问”
      

  9.   

    protected的权限是同一个类内部,同一个包,或者是其子类,并不是同包下的子类嘿嘿……
      

  10.   

    我javac所在的路径就是D:\java\TestAccess\me,在这个路径下有Person.class和Person1.java,为什么说Person这个父类还在包me中呢,为什么不认为在包\java\TestAccess\me中呢,不解呀。
      

  11.   

    我看网上介绍,jdk1.4以后,不支持无包名类(或叫默认包)的导入了。
    那么在你有包名的类里,无法使用无包名的类。
    http://www.189works.com/article-69990-1.html
    http://soft.zdnet.com.cn/software_zone/2009/1217/1562644.shtml
      

  12.   

    如果实在不行,在编译的时候请指定classpath
      

  13.   

    我也是觉得这样,因为我把父类person.java放入一个包内,再在子类导入父类便可通过,但如果父类不写package,则在子类中总提示无法找到父类Person。