Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java闭包作用域_Java_Closures - Fatal编程技术网

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)。是的,但我看到只有当变量是静态的(property
name
)时,我才能访问该变量,对吗?我将其定义为最终应用程序,并使用.name?
像public final String name=“Brad”一样进行访问。
原因是,否则您可以重新分配给变量
name
另一个对象,但内部类将有一个
name
给旧对象。语言设计者不希望这样。你可以访问Application.this,一般来说,就像Application.this.name(或name)。是的,但我发现只有当变量是静态的(属性
name
),你甚至不能访问
main
中的
name
,不只是在闭包内您甚至不能在
main
内访问
name
,而不仅仅是在闭包内