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新界面。
我创建了一个界面如下:
// 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新界面。