从另一个类的实例访问类实例(调用方法)

时间:2012-11-29 17:31:49

标签: java

所以我的程序包含两个类 1.我的主类处理GUI扩展了JFrame,所以我需要实例化它来配置我的JFrame。 2. MyClass使用API​​来请求和处理从服务器请求的数据,该API必须具有另外处理请求的API类的实例。 (它是一个可运行的类,并实现了API的包装器)

因此,如果我只是在我的主类中实例化MyClass(Runnable Processor = new MyClass())并使用它创建一个线程并运行。我无法访问MyClass或API类方法的方法(我特别感兴趣的是连接杀手方法)。我试图像Processor.API.eDisconnect()那样访问它。那不起作用。

但如果这样做:创建MyClass的Arraylist然后将MyClass的实例添加到列表中。创建一个类似Thread myThread = new Thread(List.get(0))的线程。我可以访问我的API类方法,如List.get(0).API.eDisconnect()。

那为什么第二种方法有效呢?唯一的区别是类实例是一个自变量或在列表中。

适当的做法是什么问题可以发生?有更好的方法吗?

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package basket;

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JFrame;

/**
 *
 * @author ivan
 */
public class Basket extends JFrame implements ActionListener{
    protected List<TwsHandler> TWS = new ArrayList<>();
    public static void main(String[] args) 
    {
       Basket main = new Basket();
       main.Launch();
    }
    public void Launch()
    {
        TWS.add(new TwsHandler());
        BorderLayout MainLayout = new BorderLayout();
        JButton Start = new JButton("Start");
        Start.addActionListener(this);
        Start.setActionCommand("Start");
        JButton Stop = new JButton("Stop");
        Stop.addActionListener(this);
        Stop.setActionCommand("Stop");
        this.setLayout(MainLayout);
        this.add(Start , BorderLayout.SOUTH);
        this.add(Stop , BorderLayout.WEST);
        this.addWindowListener(new WindowAdapter()
        {
            @Override
            public void windowClosing(WindowEvent e){System.exit(0);}
        });
        this.setTitle("Option basket robot");
        this.setBounds(100, 100, 800, 600);
        this.setVisible(true);

    }
    @Override
    public void actionPerformed(ActionEvent e) 
    {
        switch (e.getActionCommand()) {
            case "Start":
                Thread Processor = new Thread(TWS.get(0));
                Processor.start();
                break;
            case "Stop":
                System.out.println(TWS.get(0).Eclient.isConnected());
                break;

        }
    }
}

1 个答案:

答案 0 :(得分:1)

唯一的区别是,在第一种情况下,您将MyClass实例引用为Runnable,而在第二种情况下,您将其引用为MyClass (通过ArrayList,不起任何作用)。

而不是

Runnable processor = new MyClass();

使用

MyClass processor = new MyClass();

因为您希望能够调用MyClass方法。