当前位置: 首页 > 知识库问答 >
问题:

“this”关键字:将其用作参数

陈开宇
2023-03-14

我已经开始使用JAVA,并使用RxTx进行串行通信。

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

在第二个链接中,我无法解读“this”的用法:请任何人解释一下:

沟通者。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);
    }
...
..}

我很困惑这是如何用来创建一个对象的通信类,如上面的代码(出现通信=新的通信器(这);)

另一个困惑是:沟通者。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(seralPort.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/

ADEventListener

公共抽象void addEventListener(SerialPortEventListener lsnr)抛出java。util。ToomAnyListenerException注册SerialPortEventListener对象以侦听SerialEvents。可以使用notifyOnXXX调用来表达对特定事件的兴趣。SerialPorteEventListener的serialEvent方法将使用描述事件的serialEvent对象调用。

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

谢啦

共有3个答案

东郭弘方
2023-03-14

这里有很多东西需要消化来回答你最初的问题,我不确定它是否都有关系,但是让我们具体解决这个问题。下面的代码演示了使用this来消除当前范围中的歧义:

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

表示当前类的当前实例。所以在你第一次困惑的时候,这个通信器的一个例子,所以这个。窗口已存在。在第二种情况下,GUI的一个实例,因此可以作为参数传递给通信器,因为这是它所接受的。

通信器的构造函数中,因为两个事物具有相同的名称,并且将在相同的范围内使用,所以我们需要消除我们正在做的事情的歧义。我们这样做是通过说“将外部窗口事物分配给我们本地的、已知的、拥有的窗口事物。”

想想一群人,有许多约翰,你只是喊着那个名字。谁会期待回应?如果你指了指,或者有其他指标,比如当他们都看的时候,正确的约翰认出了你<代码>这个就是那个指标,给出了使某个东西与另一个不同所需的特殊性。

否则,想象一下试图将窗口分配给窗口时的困惑。我们的意思是将本地版本分配给本地版本,将参数分配给参数,将参数分配给本地版本,还是将本地版本分配给参数?

臧俊杰
2023-03-14

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

农英杰
2023-03-14

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

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

new Communicator(this);

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

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

现在让我们继续下一个陈述:

serialPort.addEventListener(this);

在这里,您正在用EventListener注册序列端口,该this引用。因为,这是在类-通信内部使用的,它实现了SerialPortEventListener,所以基本上您正在注册一个通信器实例,它只不过是一个SerialPortEventListener。因此,您正在注册该事件。

就您的其他代码而言:

serialPort.addEventListener(new SerialReader(in));

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

所以,没有区别。因为,在任何情况下,您都只注册了实现SerialPortEventListener的类。

 类似资料:
  • 涵义 this关键字是一个非常重要的语法点。毫不夸张地说,不理解它的含义,大部分开发任务都无法完成。 前一章已经提到,this可以用在构造函数之中,表示实例对象。除此之外,this还可以用在别的场合。但不管是什么场合,this都有一个共同点:它总是返回一个对象。 简单说,this就是属性或方法“当前”所在的对象。 this.property 上面代码中,this就代表property属性当前所在

  • 在 C# 中,可以使用 this 关键字来表示当前对象,日常开发中我们可以使用 this 关键字来访问类中的成员属性以及函数。不仅如此 this 关键字还有一些其它的用法,下面就通过一些示例来分别演示一下。 1) 使用 this 表示当前类的对象 运行结果如下: 小牛知识库 https://www.xnip.cn/ 2) 使用 this 关键字串联构造函数 运行结果如下: 无参构造函数 小牛知识库

  • 主要内容:this.属性名,this.方法名,this( )访问构造方法this 关键字是 Java 常用的关键字,可用于任何实例方法内指向当前对象,也可指向对其调用当前方法的对象,或者在需要当前类型对象引用时使用。 下面我们根据示例分别讲解 this 关键字的作用。 this.属性名 大部分时候,普通方法访问其他方法、成员变量时无须使用 this 前缀,但如果方法里有个局部变量和成员变量同名,但程序又需要在该方法里访问这个被覆盖的成员变量,则必须使用 this 前缀

  • 问题内容: “ this”关键字如何工作? 问题答案: [§11.1.1]的关键字 所述关键字的计算结果为当前执行上下文的ThisBinding的值 这个绑定是JavaScript解释器在评估JavaScript代码时所维护的,例如特殊的CPU寄存器,其中包含对对象的引用。每当在以下三种情况之一中建立执行上下文时,解释器都会更新ThisBinding: 1.初始全局执行上下文 在顶级代码中评估的J

  • 本文向大家介绍this关键字详解,包括了this关键字详解的使用技巧和注意事项,需要的朋友参考一下 Java提供了一个this关键字,this关键字总是指向调用该方法的对象。根据this出现的位置的不同,this作为对象的默认引用有两种情形。 1)构造器中引用该构造器正在初始化的对象。 2)在方法中引用调用该方法的对象。 this关键字最大的作用就是让类中一个方法,访问该类里的另一个方法或者实例变

  • 问题内容: 我刚刚遇到了一个有趣的JavaScript情况。我有一个类,该类的方法使用对象文字表示法定义了多个对象。在这些对象内部,正在使用指针。从程序的行为,我推断出指针是指向在其上调用方法的类,而不是由文字创建的对象。 尽管这是我期望的工作方式,但这似乎是任意的。这是定义的行为吗?跨浏览器安全吗?是否有任何推理依据说明它超出了“规格说明”的范围(例如,这是某些更广泛的设计决策/理念的结果)吗?