一、什么是构造方法?
构造方法(也被称为构造器)是类的一个特殊成员方法,在类实例化对象时自动调用。
注意事项:
1.构造方法的名称必须和类名保持一致
2.构造方法没有任何返回值类型
3.构造方法在类对象创建时自动被调用,一个对象只调用一次
二、什么是静态代码块?
静态代码块就是被static关键字修饰的代码块
public class Test1 {
public Test1() {
System.out.println("类的初始化数据构造方法");
}
static {
System.out.println("类的初始化数据static");
}
public static void main(String[] args) {
Test1 a = new Test1();
Test1 b = new Test1();
}
}
运行结果:
类的初始化数据static
类的初始化数据构造方法
类的初始化数据构造方法
可以看出当创建两个类的对象时,构造方法被调用了两次而静态代码块只调用了一次,并且静态代码块比构造方法优先执行,这说明构造方法可以反复初始化调用,而静态代码块只调用一次
三、构造方法的重载
从上述代码可以知道类对象被创建时,构造方法会被自动调用,而一般情况下我们并不会在每个类里面都写上构造方法,那为什么还能创建对象呢?原因是在每个类中都会有默认的构造方法,这个构造方法的方法体没有任何代码
public class Test1 {
public Test1() {//默认存在的构造方法,方法体为空
}
}
方法重载:
在同一个类中有多个方法名字相同 但是参数的个数和参数的类型不同叫做方法重载 (与返回值无关)
public class Dog {
//定义三个属性:姓名、年龄、性别
String name;
int age;
String sex;
public Dog(String a,int b) {//两个参数
name = a;
age = b;
}
public Dog(String a,int b,String c) {//三个参数
name = a;
age = b;
sex = c;
}
//定义一个自我介绍的方法
public void introduce() {
System.out.println("我是"+name+",今年"+age+"岁,我的性别是"+sex);
}
public static void main(String[] args) {
Dog dog1 = new Dog("旺财",4);
Dog dog2 = new Dog("哈士奇",2,"男");
dog1.introduce();
dog2.introduce();
}
}
运行结果:
我是旺财,今年4岁,我的性别是null
我是哈士奇,今年2岁,我的性别是男
可以看出dog1调用了两个参数的构造方法,dog2调用了三个参数的构造方法,因为dog1没有给性别赋值所以为空
四、this关键字
作用:
1.调用该类中的属性
2.调用该类中的普通方法
3.调用该类中的构造方法
4.当构造方法的形参和类的成员变量名相同时,可以用this区分
public class Dog {
String name;
int age;
String sex;
public Dog() {//无参
System.err.println("我是一只狗");
}
public Dog(String a,int b,String c) {
this();//用this调用无参的构造方法
name = a;
age = b;
sex = c;
}
public void cry() {
System.out.println("呜呜呜呜~");
}
public void shout() {
System.out.println("我要大叫了");
this.cry();//用this调用类中的普通方法
}
public static void main(String[] args) {
Dog dog2 = new Dog("哈士奇",2,"男");
dog2.shout();
}
}
运行结果:
我要大叫了
呜呜呜呜~
我是一只狗
注意:
1.使用this关键字调用构造方法只能在其他的构造方法中调用
2.必须位于第一行且只能调用一次
3.格式为this(参数1,参数2,参数3…)
当构造方法的参数和成员变量名相同时:
public class Dog {
String name;
int age;
String sex;
public Dog(String name,int age,String sex) {
name = name;
age = age;
sex = sex;
}
public void introduce() {
System.out.println("我是"+name+",今年"+age+"岁,我的性别是"+sex);
}
public static void main(String[] args) {
Dog dog2 = new Dog("哈士奇",2,"男");
dog2.introduce();
}
}
运行结果:
我是null,今年0岁,我的性别是null
可以看到实参并没有赋值给成员变量,那是应为构造方法中的形参和成员变量的名称相同,编译器无法区分形参和成员变量,因此无法赋值,针对此问题,Java中可以用this关键字来区分
public class Dog {
String name;
int age;
String sex;
public Dog(String name,int age,String sex) {
this.name = name;//this.name表示成员变量
this.age = age;
this.sex = sex;
}
public void introduce() {
System.out.println("我是"+name+",今年"+age+"岁,我的性别是"+sex);
}
public static void main(String[] args) {
Dog dog2 = new Dog("哈士奇",2,"男");
dog2.introduce();
}
}
运行结果:
我是哈士奇,今年2岁,我的性别是男