1.构造方法
在一个类中定义的方法如果满足以下三个条件,该方法称为构造方法,具体如下:
- 方法名与类名同名
- 在方法名的前面没有返回值类型声明
- 在方法中不能使用return语句返回
无参的构造方法
class Student{ public Student() { System.out.println("无参的构造方法被调用"); } } public class text3 { public static void main(String[] args) { Student s = new Student(); } }
程序运行结果
从代码可以看出,“new Student()”除了实例化对象,还调用了构造方法Student();
有参的构造方法
class Person{
int age;
public Person(int a) {
age=a;
}
public void speak() {
System.out.println("小明的年龄是"+age+"岁");
}
}
public class Text1 {
public static void main(String[] args) {
Person p2 = new Person(20);
p2.speak();
}
}
程序运行的结果
从代码可以看到“Person(int a)”这是一个有参的构造方法,在“new Person(20)”实例化对象的同时把参数传给a赋值给age并调用了speak()这个构造方法。
构造方法的重载
构造方法也可以重载,在一个中只要构造方法的参数类型或参数个数不同即可。用不同的构造方法可以给不同的属性赋值。
class People{
String name;
int age;
public People(String con_name,int con_age) {
name = con_name;
age = con_age;
}
public People(String con_name) {
name = con_name;
}
public void speak() {
System.out.println("我叫"+name+"今年"+age+"岁");
}
}
public class text2 {
public static void main(String[] args) {
People p1 = new People("李白");
People p2 = new People("李青",19);
p1.speak();
p2.speak();
}
}
根据代码看出People类中定义了两个构造方法,它们构成了重载。在创建p1和p2时根据不同的参数,分别调用了不同的构造方法。根据结果看出这两个构造方法针对不同参数赋值。其中一个仅为name赋值而age属性默认为0.
易错
该代码Person构造方法是有参的构造方法,实例化中没有参数,导致系统找不到无参的构造方法,并且系统不在自动生成无参的构造方法。
因为构造方法是私有的不被外界调用,也就无法在类的外部创建该类的实例化对象。因此,为了方便实例化对象,实例化对象同常用private来修饰。
2.this
- 通过this可以明确去访问一个类的成员变量,解决与局部变量名称冲突问题。
class Animal{
int age;
public Animal(int age) {
this.age=age;
}
public int getAge() {
return this.age;
}
}
在构造方法中访问age是局部变量,如果访问成员变量就要使用“this.age”来访问
- 通过this调用成员方法
class Animal{
public void song() {
System.out.println("");
}
public void sing() {
this.song();
}
}
- 构造方法是在实例化对象时被虚拟机自动调用,在程序中不能像调用其他方法一样去调用构造方法,,但是可以在一个构造方法中使用“this([参数1,参数2······])”的形式来调用其它的构造方法。
package text; class Animal{ public Animal() { System.out.println("无参的构造方法被调用"); } public Animal(String name) { this(); System.out.println("有参的构造方法被调用"+name+""); } } public class text4 { public static void main(String[] args) { Animal a = new Animal("猫"); } }
this调用了无参构造方法
在使用this时注意以下几点:
- 只能在构造方法中使用this调用其他方法,不能在成员变量中使用
- 在构造方法中,this只能出现在第一行且只能出现一次
- 不能再一个类的两个构造方法中使用this互相调用