Java 在非导入类上操作
我的问题是,我们如何在Java中对程序中未导入的类的对象进行操作?下面是我的JavaFX应用程序的一个示例:Java 在非导入类上操作,java,javafx,import,Java,Javafx,Import,我的问题是,我们如何在Java中对程序中未导入的类的对象进行操作?下面是我的JavaFX应用程序的一个示例: for(String item: participantsLabel.getItems()) 这是我的for循环,其中participantsLabel是ListView类的一个对象(只是某种表,我们可以在其中存储元素)。方法getItems()返回包含在participantsLabel对象中的元素的列表(特别是ObservableList对象,它是list类的子类)。所以重点是-程
for(String item: participantsLabel.getItems())
这是我的for循环,其中participantsLabel
是ListView类的一个对象(只是某种表,我们可以在其中存储元素)。方法getItems()
返回包含在participantsLabel
对象中的元素的列表(特别是ObservableList对象,它是list类的子类)。所以重点是-程序看不到任何错误-我们可以轻松地在列表上操作,而无需导入列表类。但当我们想将此对象分配给某个变量时,例如,通过创建:
ObservableList ourList = participantsLabel.getItems();
编译器向我们显示了一个错误-我们必须导入一个ObservedList类。有人能解释一下,我们如何在for循环中解释列表,而不导入其返回类型吗?在方法调用返回的值中,从方法的(
getItems()
)签名可以清楚地看出编译器应该使用哪个类
相反,当使用(非完全限定)符号时,需要导入它。或者将其更改为完全限定-然后编译器再次准确地知道要使用什么,而无需导入 编译器中的总是将完全限定的类名写入它输出的字节码。导入只是一种语法糖,它允许您在不使用包名的情况下使用类名,而不是完全限定名 仅当您在代码中声明某一类型的变量、在强制转换中使用该变量或使用它访问
静态
成员或构造函数时,才需要导入。其他类型不需要导入,因为编译器能够根据所涉及类的声明/签名来确定表达式的类型
在类文件上使用javap
应该可以提供一些关于编译结果的见解:
源代码
javap-v SimpleProgram.class
这是对observeList.get
的调用。使用的方法存储在常量池中,由编译器确定,即使我们没有导入它。这只是编译器自动完成的事情
您可能会注意到,即使不需要导入的类型也会使用完全限定名:
#9 = Class #35 // java/lang/Object
[...]
#35 = Utf8 java/lang/Object
[...]
public class SimpleProgram
[...]
this_class: #8 // SimpleProgram
super_class: #9 // java/lang/Object
interfaces: 0, fields: 0, methods: 2, attributes: 1
Constant pool:
#1 = Methodref #9.#23 // java/lang/Object."<init>":()V
#2 = Fieldref #24.#25 // java/lang/System.out:Ljava/io/PrintStream;
#3 = Class #26 // java/lang/String
#4 = String #27 // a
#5 = Methodref #28.#29 // javafx/collections/FXCollections.observableArrayList:([Ljava/lang/Object;)Ljavafx/collections/ObservableList;
#6 = InterfaceMethodref #30.#31 // javafx/collections/ObservableList.get:(I)Ljava/lang/Object;
#7 = Methodref #32.#33 // java/io/PrintStream.println:(Ljava/lang/String;)V
#8 = Class #34 // SimpleProgram
#9 = Class #35 // java/lang/Object
#10 = Utf8 <init>
#11 = Utf8 ()V
#12 = Utf8 Code
#13 = Utf8 LineNumberTable
#14 = Utf8 LocalVariableTable
#15 = Utf8 this
#16 = Utf8 LSimpleProgram;
#17 = Utf8 main
#18 = Utf8 ([Ljava/lang/String;)V
#19 = Utf8 args
#20 = Utf8 [Ljava/lang/String;
#21 = Utf8 SourceFile
#22 = Utf8 SimpleProgram.java
#23 = NameAndType #10:#11 // "<init>":()V
#24 = Class #36 // java/lang/System
#25 = NameAndType #37:#38 // out:Ljava/io/PrintStream;
#26 = Utf8 java/lang/String
#27 = Utf8 a
#28 = Class #39 // javafx/collections/FXCollections
#29 = NameAndType #40:#41 // observableArrayList:([Ljava/lang/Object;)Ljavafx/collections/ObservableList;
#30 = Class #42 // javafx/collections/ObservableList
#31 = NameAndType #43:#44 // get:(I)Ljava/lang/Object;
#32 = Class #45 // java/io/PrintStream
#33 = NameAndType #46:#47 // println:(Ljava/lang/String;)V
#34 = Utf8 SimpleProgram
#35 = Utf8 java/lang/Object
#36 = Utf8 java/lang/System
#37 = Utf8 out
#38 = Utf8 Ljava/io/PrintStream;
#39 = Utf8 javafx/collections/FXCollections
#40 = Utf8 observableArrayList
#41 = Utf8 ([Ljava/lang/Object;)Ljavafx/collections/ObservableList;
#42 = Utf8 javafx/collections/ObservableList
#43 = Utf8 get
#44 = Utf8 (I)Ljava/lang/Object;
#45 = Utf8 java/io/PrintStream
#46 = Utf8 println
#47 = Utf8 (Ljava/lang/String;)V
{
public SimpleProgram();
descriptor: ()V
flags: (0x0001) ACC_PUBLIC
Code:
stack=1, locals=1, args_size=1
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
[...]
LocalVariableTable:
Start Length Slot Name Signature
0 5 0 this LSimpleProgram;
public static void main(java.lang.String[]);
descriptor: ([Ljava/lang/String;)V
flags: (0x0009) ACC_PUBLIC, ACC_STATIC
Code:
stack=5, locals=1, args_size=1
0: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
3: iconst_1
4: anewarray #3 // class java/lang/String
7: dup
8: iconst_0
9: ldc #4 // String a
11: aastore
12: invokestatic #5 // Method javafx/collections/FXCollections.observableArrayList:([Ljava/lang/Object;)Ljavafx/collections/ObservableList;
15: iconst_0
16: invokeinterface #6, 2 // InterfaceMethod javafx/collections/ObservableList.get:(I)Ljava/lang/Object;
21: checkcast #3 // class java/lang/String
24: invokevirtual #7 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
27: return
[...]
LocalVariableTable:
Start Length Slot Name Signature
0 28 0 args [Ljava/lang/String;
}
#6 = InterfaceMethodref #30.#31 // javafx/collections/ObservableList.get:(I)Ljava/lang/Object;
#30 = Class #42 // javafx/collections/ObservableList
#31 = NameAndType #43:#44 // get:(I)Ljava/lang/Object;
[...]
#41 = Utf8 ([Ljava/lang/Object;)Ljavafx/collections/ObservableList;
#42 = Utf8 javafx/collections/ObservableList
[...]
16: invokeinterface #6, 2 // InterfaceMethod javafx/collections/ObservableList.get:(I)Ljava/lang/Object;
#9 = Class #35 // java/lang/Object
[...]
#35 = Utf8 java/lang/Object