'this'关键字:将其用作参数

时间:2013-02-11 16:11:41

标签: java

我已经启动了JAVA并使用RxTx进行串行通信。

参考: http://rxtx.qbang.org/wiki/index.php/Event_based_two_way_Communication http://henrypoon.wordpress.com/2011/01/01/serial-communication-in-java-with-example-program/

在第二个链接中,我无法解读'this'的使用情况: 任何人都可以解释一下:

Communicator.java

public class Communicator implements SerialPortEventListener
{
  GUI window = null;
   ..
   ..
 public Communicator(GUI window)
    {
        this.window = window;
    }

...
..
}

在GUI.java

public class GUI extends javax.swing.JFrame {
Communicator communicator = null;
Communicator communicator = null;
    //KeybindingController object
    KeybindingController keybindingController = null;

    /** Creates new form GUI */
    public GUI() {
        initComponents();
        createObjects();
        communicator.searchForPorts();
        keybindingController.toggleControls();
        keybindingController.bindKeys();
    }

    private void createObjects()
    {
        **communicator = new Communicator(this);**
        keybindingController = new KeybindingController(this);
    }
...
..}

我很困惑如何使用它来创建Communicator类的对象,如上面的代码所示(显示 communicator = new Communicator(this);

另一个困惑是: Communicator.java

public class Communicator implements SerialPortEventListener
{ 
...
...
 public void connect()
    {
        String selectedPort = (String)window.cboxPorts.getSelectedItem();
        selectedPortIdentifier = (CommPortIdentifier)portMap.get(selectedPort);

        CommPort commPort = null;

        try
        {
            //the method below returns an object of type CommPort
            commPort = selectedPortIdentifier.open("TigerControlPanel", TIMEOUT);
            //the CommPort object can be casted to a SerialPort object
            serialPort = (SerialPort)commPort;
....
...}


 public void initListener()
    {
        try
        {
            **serialPort.addEventListener(this);**
            serialPort.notifyOnDataAvailable(true);
        }
        catch (TooManyListenersException e)
        {
            logText = "Too many listeners. (" + e.toString() + ")";
            window.txtLog.setForeground(Color.red);
            window.txtLog.append(logText + "\n");
        }
    }
....
}

我再次对这里使用'this'感到困惑( serialPort.addEventListener(this);

我与代码进行了比较 http://rxtx.qbang.org/wiki/index.php/Event_based_two_way_Communication

它建议

...
InputStream in = serialPort.getInputStream();
**serialPort.addEventListener(new SerialReader(in));**
...

 public static class SerialReader implements SerialPortEventListener 
    {
        private InputStream in;
        private byte[] buffer = new byte[1024];

        public SerialReader ( InputStream in )
        {
            this.in = in;
        }

        public void serialEvent(**SerialPortEvent arg0**) {
            int data;

            try
            {
                int len = 0;
                while ( ( data = in.read()) > -1 )
                {
                    if ( data == '\n' ) {
                        break;
                    }
                    buffer[len++] = (byte) data;
                }
                System.out.print(new String(buffer,0,len));
            }
            catch ( IOException e )
            {
                e.printStackTrace();
                System.exit(-1);
            }             
        }

    }

addEventListener的说明 http://docs.oracle.com/cd/E17802_01/products/products/javacomm/reference/api/

的addEventListener

public abstract void addEventListener(SerialPortEventListener lsnr)                                抛出java.util.TooManyListenersException 注册SerialPortEventListener对象以侦听SerialEvents。可以使用notifyOnXXX调用表示对特定事件的兴趣。将使用描述事件的SerialEvent对象调用SerialPortEventListener的serialEvent方法。

我想知道如何使用它作为传递'SerialPortEventListener lsnr'作为上述代码中addEventListener的参数。

由于

3 个答案:

答案 0 :(得分:1)

this关键字是对正在执行代码的当前实例的引用。因此,由于this是引用,因此您可以将其用作任何其他引用。没问题。

现在让我们来看看你的用法: -

new Communicator(this);

由于此语句在GUI类的方法中使用,因此,this引用当前正在执行代码的instance of GUI。现在,通过将它传递给构造函数,您只需将当前实例的引用传递给它。并且它非常有效,因为Communicator构造函数采用GUI类型的引用: -

public Communicator(GUI window)
{
    this.window = window;
}

现在让我们继续下一个声明:

serialPort.addEventListener(this);

在这里,您正在为serialPort注册一个由EventListener引用的this。因为,这是在类Communicator中使用的,它实现了SerialPortEventListener,所以基本上你正在注册Communicator实例,这只是SerialPortEventListener。所以,你正在注册那个活动。

就您的其他代码而言:

serialPort.addEventListener(new SerialReader(in));

在这里,您刚刚使用了新的instance而不是this,因为您不在SerialReader课程内。因此,您没有this对任何SerialReader实例的引用,因此您需要手动创建该类的对象。

所以,没有区别。因为,无论如何,您正在注册仅实现SerialPortEventListener的类。

答案 1 :(得分:0)

this是一个伪变量,意思是“调用此方法的对象”(或在构造函数中:'当前正在构造的对象')。我不知道你发布的代码有什么问题,因为它包含了许多明显与问题无关的代码,我不会开始猜测你的问题究竟在哪里。

答案 2 :(得分:0)

这里有很多消化要回答你原来的问题,我不确定这一切是否有关,但我们要特别解决这个问题。以下代码演示了如何使用this来消除当前范围中的歧义:

public Communicator(GUI window)
{
    this.window = window;
}

this表示当前类的当前实例。因此,在您遇到混淆的第一个实例中,thisCommunicator的实例,因此存在this.window。在第二种情况下,thisGUI的一个实例,因此可以作为参数传递给Communicator,因为它是它接受的内容。

Communicator的构造函数中,由于存在两个具有相同名称的东西,并且要在同一范围内使用,我们需要消除我们正在做的事情的歧义。我们这样说是“将外国window事物分配给我们当地的,已知的,拥有的window事物。”

想想一群拥有众多约翰的人,你只需喊出这个名字。谁会回应?如果你指出了什么,或者还有其他一些指标,比如右边的John会在他们看起来什么时候认出你? this就是那个指标,它具有制造与另一个不同所需的特殊性。

否则想象一下试图将window分配给window的困惑。我们是指将本地版本分配给本地版本,参数的参数,本地版本的参数或参数的本地版本?