final JPanel js=new JPanel();改为 public final JPanel js=new JPanel(); 就可以的。当你不指定类的成员变量类型时,缺省是private,这对其他类来说都是不可见的,也就是其他类都不能用它,如果是protected,只有同一个包的类才能访问,public就都能访问了。这就是为什么你在a2中使用时,系统报找不到该变量的原因,因为你要的是私有变量。
同意+贊成 樓主學 classpath
呵呵,public final JPanel js=new JPanel();没有这种写法吧?
我设置了:系统变量:classpath=.;c:\jdk142\bin; 但还是只能class1.java能编译通过, class2.java编译报错如下: C:\jdk142\bin>javac class2.java class2.java:14: cannot access class1 bad class file: .\class1.class class file contains wrong class: class1.class1 Please remove or make sure it appears in the correct subdirectory of the classpa th. class1 c1=new class1(); ^ 1 error 为什么呀?
js2.add(a.jp1);
另外,最好两个类在同一个包里面。当然,都在默认包也可以。不用public,不用protected,只要在一个包里面就行。
final JTable table;
final JPanel js=new JPanel();js.add(table);在a2.class中有
a1 suba1=new a1();
JScrollPane right=new JScrollPane();
right.add(a1.js);
javac a2.java报错如下:a2.java:24: cannot resolve symbol
symbol : variable js
location: class a1
right.add(a1.js);
^
1 error
不过注意一点:如果这两个class文件放在不同的包中,就不可以了
需要把 jp1设为public
^^^^^^^^^^^^^^^^^^^^^
不用public,不用protected,只要在一个包里面就行。默认包就是当前目录。你的classpath要包含当前目录。
看来你对面向对象封装的概念还不太了解,你应该再看看书
a2.class都在同一目录下呀:我的:cjdk142\bin下
public final JPanel js=new JPanel();
就可以的。当你不指定类的成员变量类型时,缺省是private,这对其他类来说都是不可见的,也就是其他类都不能用它,如果是protected,只有同一个包的类才能访问,public就都能访问了。这就是为什么你在a2中使用时,系统报找不到该变量的原因,因为你要的是私有变量。
樓主學
classpath
我设置了:系统变量:classpath=.;c:\jdk142\bin;
但还是只能class1.java能编译通过,
class2.java编译报错如下:
C:\jdk142\bin>javac class2.java
class2.java:14: cannot access class1
bad class file: .\class1.class
class file contains wrong class: class1.class1
Please remove or make sure it appears in the correct subdirectory of the classpa
th.
class1 c1=new class1();
^
1 error
为什么呀?
如果在windows系统下,敲set看看环境变量生效没有。
也就是其他类都不能用它,如果是protected,只有同一个包的类才能访问,public
就都能访问了。这就是为什么你在a2中使用时,系统报找不到该变量的原因,因为
你要的是私有变量。"到底是谁"误了人家",是谁"真正有必要再进修一下",是谁"最好问问自己到底明不
明白"??BTW,我承认我是没有把楼主的代码拷贝下来运行,也许楼主的问题并不是我一开始
想得那么简单,大家都很忙,能把自己的一点想法说给楼主听就不错了。不过我想
我说的并没有概念性的错误,至少对一般意义上的Java类的使用来说没有问题,对
楼主最终解决问题也会有帮助。所以请把自己到底知不知道弄清楚再来批评别人吧!!
并设置:
classpath .;c:\jdk142\bin;c:\jdk142\bin\test1;
两个.java都放在了jdk142\bin目录下
package test1;
import javax.swing.*;public class test1 extends JApplet{public void init(){JPanel jp=new JPanel();JTable table=new JTable(4,5);jp.add(table);} }import javax.swing.*;
import java.awt.*;
public class test2 extends JApplet{public void init(){test1 t1=new test1();Container c=getContentPane();JScrollPane js=new JScrollPane();js.add(test1.table);c.add(js);
} }为什么test2还是无法编译????????????????????
大侠给个肯定性的解决办法和说明呀!!!!!!!!!!!!
package test1;
import javax.swing.*;public class test1 extends JApplet{
public JTable table;//<-------------
public void init(){JPanel jp=new JPanel();table=new JTable(4,5);//table的定义挪到方法外部,否则其他程序无法访问这个定义在方法体内部的对象jp.add(table);} }test2.java里加上:
import test1.*;
classpath这样设置:.;c:\jdk142\lib\dt.jar;c:\jdk142\lib\tools.jar目录结构:
c:\jdk142\bin\test1.java
c:\jdk142\bin\test2.java先编译test1.java
javac -d . test1.java
注意:编译完后,将test1.java文件在c:\jdk142\bin\下删除,保证test1.class文件在c:\jdk142\bin\test1\目录下
即:c:\jdk142\bin\test1\test1.class
然后再编译test2.java
javac test2.java或者这样编译:
先保证两个java文件都在c:\jdk142\bin\目录下
并且该目录里不含已编译过的这两个class文件(如果有的话)
然后javac -d . *.java
就可以按你定义的package结构来生成相应的class文件