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

java继承找不到父类的一个问题
父类: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;则编译就不通过。请大神们指教!
------最佳解决方案--------------------
我看网上介绍,jdk1.4以后,不支持无包名类(或叫默认包)的导入了。
那么在你有包名的类里,无法使用无包名的类。
http://www.189works.com/article-69990-1.html
http://soft.zdnet.com.cn/software_zone/2009/1217/1562644.shtml

------其他解决方案--------------------
要将Person类引进来
------其他解决方案--------------------
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类的完全吻合名称

------其他解决方案--------------------
这是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);
}

}


------其他解决方案--------------------
如果你写package m;那么你应该在m的上一级目录(也就是m所在的那个目录)运行:
javac m\Person1.java
如果你有extends,那么你还必须指定classpath
------其他解决方案--------------------
引用:
引用:希望大家伙帮忙看看问题出在哪了……
我建了m文件夹,上一级目录为D:\java\TestAccess\me。按照您说的javac \m\Person1.java,并指定了classpath,添加上了D:\java\TestAccess\me(因为Person.class就位于D:\java\TestAccess\me下),在……

注意,Person是带package me的,所以classpath是D:\java\TestAccess,而不是D:\java\TestAccess\me
另外,如果Person和Person1不在同个package下,Person1需要import me.Person
------其他解决方案--------------------
2楼,要想import Person的一个完全吻合名称怎么导呀,关键是Person类是裸体类呢,不知道怎么导,还有,我觉得即便为package m,Person1.java也不一定非得放在D:\java\TestAccess\me\m下的,在D:\java\TestAccess\me\下直接编译也能成功吧……
------其他解决方案--------------------
我在当前路径D:\java\TestAccess\me下直接编译javac Person1.java 而现在Person.class也在D:\java\TestAccess\me下,所以按理说应该可以直接找到Person.class,问题就出在把Person1.java放进了一个包中就找不到Person类了。
------其他解决方案--------------------
希望大家伙帮忙看看问题出在哪了……
------其他解决方案--------------------
引用:
希望大家伙帮忙看看问题出在哪了……

我建了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,但还是提示找不到符号呀