Java 仅通过调用类方法就可以调用参数化构造函数吗?
据我所知,在创建对象时会调用构造函数。即使没有创建对象,我也不知道如何调用构造函数。例如,考虑我的代码:Java 仅通过调用类方法就可以调用参数化构造函数吗?,java,constructor,Java,Constructor,据我所知,在创建对象时会调用构造函数。即使没有创建对象,我也不知道如何调用构造函数。例如,考虑我的代码: public class MyAdapter { private static final String APPID = "Foobar"; private static final String ENCPWD = "r4nd0mF0064r=="; private MyDelegate delegate = null; public MyAdapter(MyDelegate deleg
public class MyAdapter {
private static final String APPID = "Foobar";
private static final String ENCPWD = "r4nd0mF0064r==";
private MyDelegate delegate = null;
public MyAdapter(MyDelegate delegate) {
init(delegate);
}
private void init(MyDelegate delegate) {
try {
URL url = new URL("Some url");
QName qname = new QName("http://blahblahblahfoo.com/", "My Service");
Service service = Service.create(url, qname);
delegate = service.getPort(MyDelegate.class);
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
public MyDelegate getDelegate() {
return delegate;
}
public boolean authenticatePrimeMember(String userID, String userPwd) {
MyDelegate delegate = getDelegate();
// Other unimportant code using APPID and ENCPWD
return false;
}
}
现在,当我从另一个包调用class方法时,比如
boolean auth = MyAdapter.authenticatePrimeMember(someID, LongBeard)
它运行得很好!这不应该发生,因为我没有创建任何对象,因此无法初始化delegate
。有人能解释一下发生了什么事吗
更新:一个可能的错误经过编译器并被部署!哎呀。因为
authenticatePrimeMember()
不是静态方法(而且delegate
不是静态变量),所以在调用之前必须创建一个名为MyAdapter
的MyAdapter
对象,否则程序甚至无法编译。再次检查代码。由于authenticatePrimeMember()
不是静态方法(并且delegate
不是静态变量),因此必须在调用之前创建名为MyAdapter
的MyAdapter
对象,否则程序甚至无法编译。再次检查代码。您可以按类名后跟点运算符(例如class.method)调用方法。这可以解释为什么没有实例化对象。但这仅适用于类的静态方法,因为静态方法只能调用同一类内的静态方法
要访问类内的普通(非静态)方法和属性,静态方法应具有对该类对象的引用
或者您有一个调用静态方法的静态方法,或者一个引用对象的静态方法,这样您就可以调用非静态方法
这意味着您必须具有用于调用该方法的MyAdapter对象,或者authenticatePrimeMember()是静态的
除非上面有帮助,或者您已经创建了类的对象,否则您必须仔细检查代码
编辑:太糟糕了,您没有标记答案或已解决,我现在键入了所有这些:(您可以按类名后跟点运算符调用方法(例如class.method)。这可以解释为什么没有实例化对象。但这仅适用于类的静态方法,因为静态方法只能调用同一类内的静态方法 要访问类内的普通(非静态)方法和属性,静态方法应具有对该类对象的引用 或者您有一个调用静态方法的静态方法,或者一个引用对象的静态方法,这样您就可以调用非静态方法 这意味着您必须具有用于调用该方法的MyAdapter对象,或者authenticatePrimeMember()是静态的 除非上面有帮助,或者您已经创建了类的对象,否则您必须仔细检查代码
编辑:太糟糕了,你没有标记答案或已解决,我现在键入了所有这些:(这是一个eclipse工作区错误。编译器未检测到此错误,应用程序已部署!我不知道这是否是由于我的旧应用程序的大小造成的,它需要10-15分钟才能部署。这是一个eclipse工作区错误。编译器未检测到此错误,应用程序已部署!我不知道这是否是错误由于我的遗留应用程序的大小,需要10-15分钟才能部署。我的意思是,如果
auth
为false,我就无法登录我的应用程序。问题是为什么编译器没有抱怨调用了非静态
方法。这里似乎有点问题-authenticatePrimeMember不是静态的,所以您应该无法调用MyAdapter.AuthenticatePrimeMember(someID,somePass)完全正确。这应该是一个编译错误。除非MyAdapter实际上是一个实例化变量,否则你能发布实例化变量的详细信息吗?证明它。显示一个最小的运行示例,因为我非常确定这甚至不会编译。ideone.com可能对这样的问题有用。复制并粘贴足够的代码到(1)显示问题;(2)编译。然后在问题的文本中添加一个链接。我的意思是,如果auth
为false,我将无法登录到我的应用程序。问题是为什么编译器没有抱怨调用了非static
方法。这里似乎有点问题-authenticatePrimeMember不是静态的,因此您应该无法调用MyAdapter.AuthenticatePrimeMember(someID,somePass)
完全正确。这应该是一个编译错误。除非MyAdapter实际上是一个实例化变量,否则你能发布实例化变量的详细信息吗?证明它。显示一个最小的运行示例,因为我非常确定这甚至不会编译。ideone.com可能对这样的问题有用。复制并粘贴足够的代码到(1)显示问题;(2)编译。然后在问题的文本中添加一个链接。不,我没有。我正在使用它作为适配器来委派调用,我刚刚调用了它的方法。@Prince:可能是这样,或者你发布的代码与你正在运行的代码不同。@Prince:请显示调用代码,这样我们就可以避免猜测答案(比如这个)@Jeroen:我不认为这是猜测。根据给出的代码,这是唯一可能的解释。@Keppil至少还有一种可能的解释:另一个包中有另一个MyAdapter
类。另一个MyAdapter
类有一个静态方法公共静态布尔authenticatePrimeMember(String userID,String userPwd)
。我推测还有其他可能的解释。不,我没有。我正在使用它作为适配器来委派调用,我刚刚调用了它的方法。@Prince:或者是这样,或者你发布的代码与你正在运行的代码不同。@Prince:请显示调用代码,这样我们就可以避免错误