Java : 如何从接口方法访问属性

Java : How to access attribute from an interface method

我创建了一个界面如下:

// The OnClickListener interface :
public interface OnClickListener{

    void onClick(); 

}

然后我创建了一个人 Class :

// Class Person :
public class Person
{
    String name;

    OnClickListener onClicklisner;

    Person(String name) 
    {   
        this.name = name;

        this.onClickListener = new OnClickListener() 
        {      
           @Override
            public void onClick() {

                //I want to access to this.name attribute, but it doesn't work :
                System.out.println(this.name);
            }
        };
    }
}

在上面的 onClick() 方法中,我想访问 this.name 属性,但它不起作用。

我如何访问它?

非常感谢。

您应该使用 class 名称作为前缀 Person.this.name

//I want to access to this.name attribute, but it doesn't work :
  System.out.println(this.name);

这里this指的是OnClickListener没有name

的对象

使用name代替this.name如下,

this.onClicklisner = new OnClickListener()
{
    @Override
    public void onClick() {

        //I want to access to this.name attribute, but it doesn't work :
        System.out.println(name);
    }
};

pbaris 的 Person.this.name 方法有效,但您也可以制作一个 getter 并使用 getName() 或者,如果您声明字段 name final,您可以使用name直接不带前缀。

您还可以使用 lambda 表达式,因为您的接口是函数式接口

this.onClickListener = () -> System.out.println(this.name);

您陷入了 Java 中的常见范围陷阱,这种方法违背了接口的目的。在下面的代码行中,您实例化了一个匿名 class:

this.onClickListener = new OnClickListener() {
// We are now in the scope of the anonymous class implementing the OnClickListener interface.
}

正如 pbaris 的回答所暗示的那样,您可以使用 Person.this.name 来引用父对象的属性,但这会将您的代码耦合到 Person class 并且违背了拥有单独对象的目的class 实现 OnClickListener 接口。您可以让 Person class 实现接口,或者声明一个新的 class 来实现接口并将对 Person 的引用作为构造函数参数:

public class  PersonClickedListener implements OnClickListener {

    private Person parent;    

    public PersonClickedListener(Person parent) {
        this.parent = parent;
    }

    @Override
    public void onClick() {
        System.out.println(parent.name);
    }
}

然后,在Person中:

public class Person
{
    String name;

    OnClickListener onClicklistener;

    Person(String name) 
    {   
        this.name = name;

        this.onClickListener = new PersonClickedListener();
    }
}

你可以更高级,让 Person 实现一个公开 getName() 方法的接口,这样你的 PersonClickedListener 就可以用于任何实现该方法的 class新界面。