一个类调用另一个类,首先被调用类应是public,然后在调用类中实例化被调用类

解决方案 »

  1.   

    a1 a = new a1();
    js2.add(a.jp1);
      

  2.   

    先new一个,再添加。
    另外,最好两个类在同一个包里面。当然,都在默认包也可以。不用public,不用protected,只要在一个包里面就行。
      

  3.   

    不成功呀在a1.class中有:
    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
      

  4.   

    同 bibiye(布什的老哥)~~~~~~
    不过注意一点:如果这两个class文件放在不同的包中,就不可以了
    需要把 jp1设为public
      

  5.   

    最好两个类在同一个包里面。当然,都在默认包也可以。
                                  ^^^^^^^^^^^^^^^^^^^^^
    不用public,不用protected,只要在一个包里面就行。默认包就是当前目录。你的classpath要包含当前目录。
      

  6.   

    按sean_gao(大胃) 说的做一下。
    看来你对面向对象封装的概念还不太了解,你应该再看看书
      

  7.   

    提醒楼主一下,包的概念和打包成jar的概念是不同的,不需要jar也可以是包。
      

  8.   

    windows2000server也需要设置classpath吗?a1.class
    a2.class都在同一目录下呀:我的:cjdk142\bin下
      

  9.   

    ......楼主啊你究竟有没有配置过环境变量,编写和调试运行过简单的HelloWorld啊?这么基本的东西都还没掌握就开始研究JApplet了?诚然,applet某种程度上是不需要classpath,它默认会在HTML文件所在目录自己找类文件,但是classpath的概念对Java来说十分重要,某种意义上说不亚于Windows的注册表。不应该不掌握吧?再有,没有人逼你用package,但是如果你不好好利用package机制,有很多优点和方便之处就与你无缘了。我觉得如果不是做项目赶得急的话,楼主还是好好补一补基础吧,会少走很多弯路的。
      

  10.   

    你想要a1.js这么用的话,js这个必须定义为public,包什么的不用管。人家在问这个问题,你们确在扯包的问题,唉。
      

  11.   

    to:sean_gao(大胃) , haozhangpk(步惊云) 你们去把楼主的程序改成有包的试试看,我觉得你们真正有必要再进修一下。不要误了人家,什么叫面向对象?最好问问自己到底明不明白。
      

  12.   

    final JPanel js=new JPanel();改为
    public final JPanel js=new JPanel();
    就可以的。当你不指定类的成员变量类型时,缺省是private,这对其他类来说都是不可见的,也就是其他类都不能用它,如果是protected,只有同一个包的类才能访问,public就都能访问了。这就是为什么你在a2中使用时,系统报找不到该变量的原因,因为你要的是私有变量。
      

  13.   

    同意+贊成
    樓主學
    classpath
      

  14.   

    呵呵,public final JPanel js=new JPanel();没有这种写法吧?
      

  15.   


    我设置了:系统变量: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
    为什么呀?
      

  16.   

    cqandy(安迪) classpath是设你class1的包路径,否则编译器怎么知道class1的存在
      

  17.   

    如果你真的不懂设classpath的话就把他去掉,我的机器就没有设过,jdk的类还是可以用的,除非你用了第三方的类。
    如果在windows系统下,敲set看看环境变量生效没有。
      

  18.   

    哈哈哈哈......笑得我肚子疼......黄昏兄,看看你自己都说了些什么:"当你不指定类的成员变量类型时,缺省是private,这对其他类来说都是不可见的,
    也就是其他类都不能用它,如果是protected,只有同一个包的类才能访问,public
    就都能访问了。这就是为什么你在a2中使用时,系统报找不到该变量的原因,因为
    你要的是私有变量。"到底是谁"误了人家",是谁"真正有必要再进修一下",是谁"最好问问自己到底明不
    明白"??BTW,我承认我是没有把楼主的代码拷贝下来运行,也许楼主的问题并不是我一开始
    想得那么简单,大家都很忙,能把自己的一点想法说给楼主听就不错了。不过我想
    我说的并没有概念性的错误,至少对一般意义上的Java类的使用来说没有问题,对
    楼主最终解决问题也会有帮助。所以请把自己到底知不知道弄清楚再来批评别人吧!!
      

  19.   

    "当你不指定类的成员变量类型时,缺省是private"第一次听说。
      

  20.   

    w2kserver下,c:\jdk142\bin下新建了目录test1
    并设置:
    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还是无法编译????????????????????
    大侠给个肯定性的解决办法和说明呀!!!!!!!!!!!!
      

  21.   

    test1.java要修改:
    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文件
      

  22.   

    楼上说对了。table是你构造方法内的本地变量,在方法外是看不到的。要声明为class级别,并且保证它们被初始化。如果在init()中初始化table,那么在另一个类调用时,是不是需要显式的调用一下test1的init()?要不然就需要把初始化(new)的工作放到构造方法中吧?显然后一种对applet来讲不是被推荐的做法。