我在练习构造方法过程中,遇到下面问题:1、在 1 的地方调用方法hhh();为什么必须是静态方法? 2、在 2 的地方,有void为什么显示此方法具有构造函数名?但当修改为构造函数时,u1.User();u2.User();u3.User();三句为什么又不合适了?
public class User {
int id;
String name;
String pwd;
public User() {
System.out.println("hhh");
}
public User(int id,String name) {
super();
this.id = id;
this.name = name;
System.out.println(id+name);
}
public User(int id,String name,String pwd) {
this.id = id;
this.name = name;
this.pwd = pwd;
System.out.println(id+name+pwd);
}
static void hhh() {
System.out.println("111");
}
public static void main(String[] args) {
User u1 = new User();
User u2 = new User(123,"xige");
User u3 = new User(123,"xige","456");
u2.id = 122;
u2.name = "xige";
u3.id = 133;
u3.name = "xige2";
u3.pwd = "123";
u1.User();
u2.User();
u3.User();
User.hhh(); // 1
}
private void User() { // 2
}
}
前提声明 :你声明的类只有一个
第一问:
这个与Java程序的加载机制有关,因为被static声明的方法与类同时在内存中创建(简单可认为被static声明的方法其生命周期与类一致。只有类结束执行,static声明的方法才结束生命周期),对于非static声明的方法,只在被调用时创建(即非static方法的创建晚于static声明的方法但其消亡时间不一定),Java的编译器是不允许一个已经创建的方法调用未创建的方法(编译时异常--这个必须在编译时处理),所以就会出现static方法无法调用非static方法。
第二问:
因为你这是一个类,在一个类里面除了构造器可以完全与类名相同,其余的都不能使用类名作为方法名(即平常写普通方法时,不要使用类名命名),如果使用类名作为方法名就会被编译器默认当做构造器。且你的构造器之间已经构成了重载。
如果,你重新声明一个类(不使用User作为类名),在该类内是可以定义User方法的,此时这是一个普通方法,不是构造方法。
Tips:看题主的代码。忽然想起了自己刚开始学Java的时候,也是分不清构造方法和普通方法的区别,经常将构造方法当作普通方法使用。