【问题标题】:Java: How does a method operate on objects of unknown type?Java:方法如何对未知类型的对象进行操作?
【发布时间】:2016-12-16 11:30:06
【问题描述】:

考虑以下三个不同包中的三个 Java 类:

User.java

package user;

public class User {

    String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "User [name=" + name + "]";
    }
}

UserFactory.java

package factory;

import user.User;

public class UserFactory {

    private static User user;

    public static User getUser() {
        if (user == null) {
            user = new User();
        }
        return user;
    }

}

Test.java

package test;

import factory.UserFactory;

public class Test {
    public static void main(String[] args) {
        UserFactory.getUser().setName("StackOverflow");
        System.out.println(UserFactory.getUser());
    }
}

main 方法属于 test.Test 类,它不导入 user.User 类。但是,它可以在user.User 类型上运行。

如何证明这种行为是正当的?

【问题讨论】:

  • 此问题已在 stackoverflow.com/questions/785868/…> 得到答复
  • 旁注;与您的问题无关:A)您的工厂可能是“错误的”;拥有一个静态用户对象是没有意义的。大多数程序员会假设调用 factory 类每次都会给他们一个新用户。
  • @Dhananjay - 感谢您的链接。我尝试搜索类似的问题,但找不到。
  • @GhostCat - 已接受。这只是支持我的问题的示例代码,不是真正的工厂。

标签: java class methods import


【解决方案1】:

import 语句的唯一 目的是允许您在不完全指定名称的情况下使用类型(或方法等,用于import static)。它不会使类型可用 - 它只是通过短名称使其可用。

在这种情况下,UserFactory 类型被导入,编译器知道UserFactory.getUser() 返回的确切类型...该类型不需要在代码中命名致电getUser()

如果你想写:

User u = UserFactory.getUser();

那么你需要导入......或者你可以完全限定它:

user.User u = UserFactory.getUser();

但除非您需要在源代码中通过短名称引用类型,否则不需要 import 语句。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多