Java:方法如何对未知类型的对象进行操作?

Java:方法如何对未知类型的对象进行操作?,java,class,methods,import,Java,Class,Methods,Import,请考虑三个不同包中的以下三个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 toS

请考虑三个不同包中的以下三个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 + "]";
    }
}
package factory;

import user.User;

public class UserFactory {

    private static User user;

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

}
package test;

import factory.UserFactory;

public class Test {
    public static void main(String[] args) {
        UserFactory.getUser().setName("StackOverflow");
        System.out.println(UserFactory.getUser());
    }
}
UserFactory.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 + "]";
    }
}
package factory;

import user.User;

public class UserFactory {

    private static User user;

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

}
package test;

import factory.UserFactory;

public class Test {
    public static void main(String[] args) {
        UserFactory.getUser().setName("StackOverflow");
        System.out.println(UserFactory.getUser());
    }
}
Test.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 + "]";
    }
}
package factory;

import user.User;

public class UserFactory {

    private static User user;

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

}
package test;

import factory.UserFactory;

public class Test {
    public static void main(String[] args) {
        UserFactory.getUser().setName("StackOverflow");
        System.out.println(UserFactory.getUser());
    }
}
主要方法属于类
test.test
,它不导入
user.user
类。但是,它可以在
user.user
type上操作

如何为这种行为辩护

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

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

如果你想写:

User u = UserFactory.getUser();
那你就需要导入。。。或者您可以完全限定它:

user.User u = UserFactory.getUser();

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

这已在旁注中得到回答;与您的问题无关:A)您的工厂可能“错”;拥有一个静态用户对象是没有意义的。大多数程序员会认为每次调用工厂类都会给他们带来一个新用户。@Dhananjay-谢谢链接。我试着搜索类似的问题,但没找到。@GhostCat-接受。这只是一个示例代码来支持我的问题,而不是一个真正的工厂。