Java:方法如何对未知类型的对象进行操作?
请考虑三个不同包中的以下三个Java类: User.javaJava:方法如何对未知类型的对象进行操作?,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
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-接受。这只是一个示例代码来支持我的问题,而不是一个真正的工厂。