Java闭包作用域
我有以下代码:Java闭包作用域,java,closures,Java,Closures,我有以下代码: package application; import java.util.Timer; import java.util.TimerTask; public class Application { public String name = "Brad" ; public static void main ( String [ ] args ) { Timer time = new Timer ( );
package application;
import java.util.Timer;
import java.util.TimerTask;
public class Application {
public String name = "Brad" ;
public static void main ( String [ ] args ) {
Timer time = new Timer ( );
time.schedule ( new TimerTask ( ) {
@Override
public void run ( ) {
System.out.println( "Name: " ) ;
}
}, 0, 10000 );
}
}
如何在run()函数中访问类的方法和/或属性?
老实说,我不知道怎样才能接触到上下文。。并且不知道如何将对象作为参数传递,如在PHP中,您可以访问实例变量,但在您的情况下,您不能访问
name
,因为它不是static
。如果要使用字段变量,则需要将它们声明为final
,以便能够在匿名类中使用它们
例如:
package application;
import java.util.Timer;
import java.util.TimerTask;
public class Application {
public static String name = "Brad" ;
public static void main ( String [ ] args ) {
final String lastName = "Brad's last name";
Timer time = new Timer ( );
time.schedule ( new TimerTask ( ) {
@Override
public void run ( ) {
System.out.println( "Name: " + name + " " + lastName ) ;
}
}, 0, 10000 );
}
}
您可以访问实例变量,但在您的情况下,您不能访问
名称
,因为它不是静态的
。如果要使用字段变量,则需要将它们声明为final
,以便能够在匿名类中使用它们
例如:
package application;
import java.util.Timer;
import java.util.TimerTask;
public class Application {
public static String name = "Brad" ;
public static void main ( String [ ] args ) {
final String lastName = "Brad's last name";
Timer time = new Timer ( );
time.schedule ( new TimerTask ( ) {
@Override
public void run ( ) {
System.out.println( "Name: " + name + " " + lastName ) ;
}
}, 0, 10000 );
}
}
您正在匿名类中实现一个方法,这是Java最接近闭包的东西。您可以通过如下方式调用应用程序属性或方法:
Application.this.instanceExampleMethod();
或
不过,您的情况很特殊,因为您使用的是静态方法,因此如果您想调用方法(或实例化应用程序并使用它),则需要将方法修改为静态方法。您在匿名类中实现方法,这是Java最接近闭包的方法。您可以通过如下方式调用应用程序属性或方法:
Application.this.instanceExampleMethod();
或
不过,您的情况很特殊,因为您使用的是静态方法,所以如果您想调用这些方法(或实例化应用程序并使用它),则需要将这些方法修改为静态方法。您需要创建一个
应用程序
的实例,以便TimerTask
可以引用。在您的代码中没有这样的实例,因为静态方法(如main
)不需要这样的实例。因此,创建一个实例,并将其声明为final,这样您的匿名TimerTask
内部类就可以访问它
public class Application {
private String name = "Brad" ;
public String getName()
{
return name;
}
private void privateMethod() {}
public static void main ( String [ ] args ) {
Timer time = new Timer ( );
final Application application = new Application(); // instance
time.schedule ( new TimerTask ( ) {
public void run ( ) {
System.out.println( "Name: " + application.getName());
application.privateMethod(); // don't rely on this
}
}, 0, 10000 );
}
}
请注意,在本例中,
main
方法是在应用程序中定义的。这意味着在TimerTask
内部类中,由于类级别在Java中的可见性,您可以访问Application
的私有(实例)字段。通常,您不希望依赖此“功能”,只访问应用程序上的公共方法
您需要创建一个应用程序
的实例,以便TimerTask
可以引用。在您的代码中没有这样的实例,因为静态方法(如main
)不需要这样的实例。因此,创建一个实例,并将其声明为final,这样您的匿名TimerTask
内部类就可以访问它
public class Application {
private String name = "Brad" ;
public String getName()
{
return name;
}
private void privateMethod() {}
public static void main ( String [ ] args ) {
Timer time = new Timer ( );
final Application application = new Application(); // instance
time.schedule ( new TimerTask ( ) {
public void run ( ) {
System.out.println( "Name: " + application.getName());
application.privateMethod(); // don't rely on this
}
}, 0, 10000 );
}
}
请注意,在本例中,main
方法是在应用程序中定义的。这意味着在TimerTask
内部类中,由于类级别在Java中的可见性,您可以访问Application
的私有(实例)字段。通常,您不希望依赖此“功能”,只访问应用程序上的公共方法
对,我如何访问变量?我将其定义为最终应用程序,并使用.name?像public final String name=“Brad”一样进行访问。
原因是,否则您可以重新分配给变量name
另一个对象,但内部类将有一个name
给旧对象。语言设计者不希望这样。你可以访问Application.this,一般来说,就像Application.this.name(或name)。是的,但我看到只有当变量是静态的(propertyname
)时,我才能访问该变量,对吗?我将其定义为最终应用程序,并使用.name?像public final String name=“Brad”一样进行访问。
原因是,否则您可以重新分配给变量name
另一个对象,但内部类将有一个name
给旧对象。语言设计者不希望这样。你可以访问Application.this,一般来说,就像Application.this.name(或name)。是的,但我发现只有当变量是静态的(属性name
),你甚至不能访问main
中的name
,不只是在闭包内您甚至不能在main
内访问name
,而不仅仅是在闭包内