Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.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
Blackberry 理解实例化新对象的这种方式_Blackberry_Java Me - Fatal编程技术网

Blackberry 理解实例化新对象的这种方式

Blackberry 理解实例化新对象的这种方式,blackberry,java-me,Blackberry,Java Me,我刚刚开始BlackBerry的开发,我根据一些教程熟悉UI对象等,我看到/尝试了以下内容: private MenuItem menuItemClose = new MenuItem(new StringProvider("Contacts"), 0, 0) { public void run() { onClose(); } }; 我以前没有见过这种实例化对象的方法(考虑新的MenuItem),有人能解释一下发生了什么吗 在方法定义中实例化对象与在“实例变量

我刚刚开始BlackBerry的开发,我根据一些教程熟悉UI对象等,我看到/尝试了以下内容:

private MenuItem menuItemClose = new MenuItem(new StringProvider("Contacts"), 0, 0) {
    public void run() {
        onClose();
    }
};
我以前没有见过这种实例化对象的方法(考虑新的MenuItem),有人能解释一下发生了什么吗


在方法定义中实例化对象与在“实例变量部分”中实例化对象有什么区别?

这将创建一个匿名内部类,该类扩展MenuItem并重写run方法。它是标准Java,与Blackberry无关。

这将创建一个匿名内部类,该类扩展MenuItem并重写run方法。它是标准Java,与Blackberry无关。

这被称为“匿名内部类”

匿名内部类是在另一个类中创建但未命名的类。它们通过其接口或抽象基类定义进行实例化,并在实例化过程中提供缺少的实现

在本例中,MenuItem是抽象的-它缺少run()方法。您在第2-4行提供了其run()方法的实现

查看以获取有关内部类的各种类型和用法的更多信息

至于问题的第二部分“在方法定义中实例化对象与在“实例变量部分”中实例化对象有什么区别?”——区别在于范围,以及对象何时实例化

具有初始值的非静态成员变量是在实例化包含它们的对象时创建的。初始值分配(初始化)也在此时执行

当VM的类装入器装入类时,将创建并初始化具有初始值的静态成员变量。对于渴望类加载,这将在应用程序开始时发生。对于惰性类加载,这将在应用程序第一次引用该类时发生。我相信默认情况下,大多数不属于Java运行时的类都是延迟加载的

静态和非静态成员变量都具有对象级别的作用域,其他对象可以根据其访问修饰符(公共/私有/受保护)访问它们

非静态成员变量是对象实例的一部分,因此,当该实例孤立或超出范围时,它们被标记为垃圾收集。静态成员变量只有在包含它们的类被卸载时才会被垃圾收集。仅当加载所述类的ClassLoader实例被垃圾收集时,才会发生这种情况。有关更多信息,请参阅

当作为正常方法执行的一部分执行该行时,将创建并初始化具有初始值的局部变量(在方法中定义的变量)。一旦它们超出范围(在包含它们的方法完成执行之后),它们将被标记为垃圾收集(销毁)。

这称为“匿名内部类”

匿名内部类是在另一个类中创建但未命名的类。它们通过其接口或抽象基类定义进行实例化,并在实例化过程中提供缺少的实现

在本例中,MenuItem是抽象的-它缺少run()方法。您在第2-4行提供了其run()方法的实现

查看以获取有关内部类的各种类型和用法的更多信息

至于问题的第二部分“在方法定义中实例化对象与在“实例变量部分”中实例化对象有什么区别?”——区别在于范围,以及对象何时实例化

具有初始值的非静态成员变量是在实例化包含它们的对象时创建的。初始值分配(初始化)也在此时执行

当VM的类装入器装入类时,将创建并初始化具有初始值的静态成员变量。对于渴望类加载,这将在应用程序开始时发生。对于惰性类加载,这将在应用程序第一次引用该类时发生。我相信默认情况下,大多数不属于Java运行时的类都是延迟加载的

静态和非静态成员变量都具有对象级别的作用域,其他对象可以根据其访问修饰符(公共/私有/受保护)访问它们

非静态成员变量是对象实例的一部分,因此,当该实例孤立或超出范围时,它们被标记为垃圾收集。静态成员变量只有在包含它们的类被卸载时才会被垃圾收集。仅当加载所述类的ClassLoader实例被垃圾收集时,才会发生这种情况。有关更多信息,请参阅


当作为正常方法执行的一部分执行该行时,将创建并初始化具有初始值的局部变量(在方法中定义的变量)。一旦它们超出范围(在包含它们的方法完成执行之后),它们就会被标记为垃圾收集(销毁)。

当您在方法调用中定义新的内部类时,它被称为“匿名内部类”。当您在初始方法调用之后不需要对对象进行引用时,匿名内部类非常有用

final Object obj = new Object(); // Standard instantiation
System.out.println(obj); // Prints java.lang.Object@5c005c

// Anonymous inner class
System.out.println(new Object() { }); // Prints Foo$1@2500250

// Anonymous inner classes work with interfaces too
new Thread(new Runnable() {

    @Override
    public void run() {
        // Runnable is an interface
    }

}).start();

这是一种非常常见的模式,在定义“一次性使用”对象时非常有用,可能会以牺牲可读性为代价。

当您在方法调用中定义新的内部类时,它被称为“匿名内部类”。当您在初始方法调用之后不需要对对象进行引用时,匿名内部类非常有用

final Object obj = new Object(); // Standard instantiation
System.out.println(obj); // Prints java.lang.Object@5c005c

// Anonymous inner class
System.out.println(new Object() { }); // Prints Foo$1@2500250

// Anonymous inner classes work with interfaces too
new Thread(new Runnable() {

    @Override
    public void run() {
        // Runnable is an interface
    }

}).start();
这是一种非常常见的模式,在定义“一次性使用”对象时非常有用,可能会以牺牲为代价