构造函数
- 构造函数的作用
调用
public static void main(String[] args) {
new Demo("Test",18);
}
class Demo{
public String name;
public int age;
public Demo(){
构造函数没有返回值
方法名与类名相同
}
对类对象进行初始化,允许以重载的形式存在多个构造函数
public Demo(String name,int age){
this.name = name;
this.age = age;
System.out.println(this.name+"\r\n"+this.age);
}
}
如果一个类没有显式的声明构造函数,Java编译器在编译时会自动添加一个无参的构造函数,当显式声明了构造函数,将不会自动添加。
为什么一定要有这个构造函数?
因为成员变量的初始化都是通过调用构造函数完成(类加载的准备阶段)。添加的构造函数,其权限修饰符与类的权限修饰符是一致的。
如果当前类的权限修饰符为private class,那么这个构造方法的权限修饰符就是private,同理,如果是public class,构造方法的权限修饰符即为public。
构造代码块
- 构造代码块的作用
class Demo{
public String name;
public int age;
public static int count;
其实构造代码块中的代码也是在构造函数中执行。
.class文件经过Java编译器编译后,构造代码块中的代码会被移动到构造函数中,
放置在构造函数中代码的最前端,
{
this.name = "Test";
this.age = 18;
System.out.println("只执行一次" + count);
}
静态代码块是在.class文件加载到内存时就马上执行,不需要等到创建对象
由于类只加载一次,因此静态代码块只执行一次。
static{
count++;
System.out.println("只执行一次" + count);
}
public void test(){
{
//局部代码块:缩短局部变量的生命周期,节省一点点内存,其实没什么作用
System.out.println(name+"\r\n"+age);
}
}
}
- 补充
class Demo {
{
i = 18;
}
Java编译器在编译时,会把成员变量的声明语句提前至一个类的最前端。
注意,提到最前端的只是声明(private int i),实际的赋值还是按调用顺序。
public int i = 19;
public void test() {
System.out.println(i + "输出19");
}
}