哈喽,我是兔哥呀,今天就让我们继续这个JavaSE成神之路!

这一节啊,咱们要学习的内容还是Java的面向对象。

【JavaSE成神之路】Java面向对象(下)_开发语言

1. 构造方法

构造方法和new关键字是一对好拍档。

在之前GirlFriend的例子中,我们写了两个构造方法,一个是带参的,一个是无参的。

//类的构造方法
public GirlFriend(String name,String hair,boolean glasses,String skirt,String color){
this.name = name;
this.hair = hair;
this.glasses = glasses;
this.skirt = skirt;
this.color = color;
}

public GirlFriend() {

}

Java 构造方法是在创建 Java 类的实例时被调用的方法,它会为实例分配内存并初始化实例变量。

构造方法有两个特点:

1、构造方法的名称必须和类名相同,可以有参数,也可以没有参数;

2、构造方法没有返回值类型,不能使用return关键字。

记住这两点即可!

接下来看看构造方法的作用:

1、为实例变量赋初始值:

class Student{
private String name;
private int age;
public Student(){
this.name = "张三";
this.age = 18;
}
}

这段代码中的构造方法实现了给实例变量name和age赋初始值,即当创建新的Student实例时,name和age的值分别为“张三”和18。

2、可以通过构造方法实现重载:

class Student{
private String name;
private int age;
public Student(){
this.name = "张三";
this.age = 18;
}
public Student(String name,int age){
this.name = name;
this.age = age;
}
}

这段代码中的构造方法实现了重载,即通过传入不同的参数,可以创建不同的Student实例,name和age的值可以根据传入的参数而定。没错,构造方法也是可以重载的。

3、可以调用其他构造方法:

class Student{
private String name;
private int age;
public Student(){
this.name = "张三";
this.age = 18;
}
public Student(String name,int age){
this(name);
this.age = age;
}
public Student(String name){
this.name = name;
}
}

这段代码中的构造方法实现了调用其他构造方法,即通过调用其他构造方法,可以创建不同的Student实例,name和age的值可以根据调用的构造方法而定。

4、可以通过构造方法实现父类构造方法的调用:

class Person{
public Person(){
System.out.println("Person的构造方法");
}
}
class Student extends Person{
private String name;
private int age;
public Student(){
super();
this.name = "张三";
this.age = 18;
}
}

这段代码中的构造方法实现了父类构造方法的调用,即在创建Student实例之前,会先调用其父类的构造方法,即Person的构造方法。继承相关的知识我们会在后面讲到。

因此,构造方法是java编程中非常重要的组成部分,它可以实现对象的初始化,并且可以实现类的重载,支持多种构造方法,满足不同的需求。

还有一点就是上一节遇到的,如果你写了有参构造,就要显示定义无参构造方法。这是因为当程序运行时,会调用类中的构造函数,如果有参构造函数被定义,但是没有定义无参构造函数,那么程序就无法正常运行,因为它不知道如何去调用构造函数,从而导致程序运行出错。

所以程序强制要求你显示定义无参构造方法。

咱们再缕一缕:

-Java写个带参的构造方法,那默认的无参的就必须再显示写一个,但这是为什么呢?

-很简单

-jvm会在语义分析过程中来为没有构造函数的类搭建构造函数。

-如果有构造函数的话就不会自己默认搭建构造函数。

-如果设置了无论是否有构造函数都写构造函数

-那就有一个问题,如果已经有一个无参构造函数了,再构造一个,到时候调用哪个呢?

也就是说当一个类你没有给他构造函数,则编译器会自动补上一个无参的,若有的话就不会,你需要显示将此无参的构造函数写出来。这是编译器帮你做的,防止你忘了写无参构造函数,没什么好纠结的,记住就行了。

2.this关键字

this是java中的一个关键字,它代表当前对象的引用,它可以在构造方法、普通方法中使用。尤其在构造方法中可以指定某个属性,可以避免​​类的属性​​​和​​构造方法参数​​重名的尴尬。

例如:

public class Person { 
private String name;
private int age;

public Person(){
this.name="张三"; //使用this关键字来引用name变量
this.age=18; //使用this关键字来引用age变量
}
}

this关键字还有一个作用,就是在构造方法中调用另一个构造方法。注意,你不能在普通方法里面调用构造方法。只能在构造方法中用this去调用另一个构造方法。

public class Person {
private String name;
private int age;

public Person(){
this.name="张三"; //使用this关键字来引用name变量
this.age=18; //使用this关键字来引用age变量
}

//重载1
public Person(String name){
this.name = name;
}

//重载2
public Person(String name,int age){
this(name); //根据参数的类型和格式,会自动地去匹配对应地重载构造方法
this.age = age;
}
}

为了方便测试,我们用idea生成一下toString方法:

@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}

测试:

public class TestPerson {

public static void main(String[] args) {
Person p = new Person("jack",18);
System.out.println(p);
}
}

结果:

Person{name='jack', age=18}

this还可以用来在普通方法中调用属性和其他普通方法。

3.课后作业

又到课后练习啦,这一节比较重要,大家不要偷懒,一定要把习题做一做哦!

创建一个汽车类Car,拥有品牌brand和颜色color两个属性。分别用带参构造器和无参构造器来实例化Car类,并编写toString方法。再写一个测试类,在测试类的main方法中进行测试。

顺便附上上一节的答案,题目是:

设计一个宠物类Pet,构造方法用于接收宠物的名字、类型及性别,实例化宠物后,可以用实例化的宠物对象来访问宠物的名字、类型及性别,并实现宠物的叫声功能,要求叫声不同类型的宠物不同,实现叫声时可以显示出宠物的名字和类型。

参考答案:

public class Pet {
private String name;//宠物名字
private String type;//宠物类型
private String gender;//宠物性别

public Pet(String name, String type, String gender) {
this.name = name;
this.type = type;
this.gender = gender;
}

//获取宠物名字
public String getName() {
return name;
}

//获取宠物类型
public String getType() {
return type;
}

//获取宠物性别
public String getGender() {
return gender;
}

//宠物叫声
public void cry() {
if (type.equals("dog")) {
System.out.println(name + ": 汪汪汪");
} else if (type.equals("cat")) {
System.out.println(name + ": 喵喵喵");
} else {
System.out.println("叫声未知");
}
}
}

有任何不懂的地方,可以点击下方的“发消息”给我留言。