哈喽,我是兔哥呀,今天就让我们继续这个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("叫声未知");
        }
    }
}

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

PS:从这一节开始,欢迎你使用任何你喜欢的IDE完成作业,比如eclipse,IDEA,如果不会使用工具,可以去B站搜索相关的视频进行学习哈。

posted on 2022-12-31 17:31  剽悍一小兔  阅读(7)  评论(0编辑  收藏  举报  来源