为什么在实例 (Java) 上调用方法时不需要导入类

2022-09-04 00:43:13

让我感到困惑的事情 - 一个例子:

事情.java:

import java.util.Date; 

class Thing { 
    static Date getDate() {return new Date();}
}

(相同包装)TestUsesThing.java:

// not importing Date here.

public class TestUsesThing {

    public static void main(String[] args) {
        System.out.println(Thing.getDate().getTime()); // okay
        // Date date = new Date(); // naturally this wouldn't be okay
    }

}

为什么不需要导入 Date 才能在其中一个上调用 getTime()?


答案 1

只有在 Java 中导入才是必要的,这样编译器才能知道 a 是什么,如果您键入Date

Date date = new Date();

导入不像C / C++;类路径上的所有类型都可用,但您只是为了避免编写完全限定名。在这种情况下,这是不必要的。#includeimport


答案 2

问得好!!

我认为结果是java编译器处理表达式与语句之间的区别。

Date d = new Date(); // a statement

其中作为

new Thing().getDate().getTime()

是一个表达式,因为它发生在 println 方法调用中。当您在new Thing()上调用getDate时,编译器会尝试通过查看Thing类的类型信息来处理表达式,这是它获取类型Date声明的地方。但是,当您尝试在语句中单独使用Date时,例如

Date d = new Thing().getDate();

您正在将结果分配给当前作用域中的类型(类 TestUsesThing),编译器会尝试解析该作用域中的类型。因此,您会看到未知类型的编译器错误。


推荐