其他分享
首页 > 其他分享> > 构造器、this关键字、setter和getter

构造器、this关键字、setter和getter

作者:互联网

构造器、this关键字、setter和getter

构造器

我们一直在学习怎么封装class,一个class封装好之后的目的一般是创建实例对象,我们其实已经做过了。

Dog dog = new Dog();

new 一个对象的时候到底发生了什么事情呢?

  1. java在new一个对象的时候,会先查看对象所属的类有没有被加载到内存,如果没有的话,就会先通过类的权限定名来加载,这个过程我们后边聊。
  2. 加载并初始化类完成后,再进行对象的创建工作。

我们先聊聊创建的过程:

  1. 在堆区分配对象需要的内存。
  2. 对所有实例变量赋默认值。
  3. 执行构造方法,比如我们可以使用构造方法赋值。(不太准确,以后会慢慢补充)
  4. 在栈区定义引用变量,然后将堆区对象的地址赋值给它。

image

构造方法,也叫构造器,会在new对象的时候主动被调用。

但是,事实上,我们并没有看到任何构造方法。

每个java类,会默认送你一个构造方法,这个方法它是这个样子的:

public Dog(){        
}

我们可以写出来,也可以不写,这个构造方法什么都没做,我们可以想办法让它做一些事情,比如:

public Dog(){
    name = "teddy";
    age = 12;
}

public static void main(String[] args) {
    Dog dog = new Dog();
    System.out.println(dog.name);
    System.out.println(dog.age);
}

我们并没有调用这个方法啊:
但是,结果却出来了:
    teddy
    12

当然如果我们想自己按照自己的意愿去构造实例,我们还可以定义这样的构造器:

同时new的时候就要传递参数了:

public Dog(String name,int age){
    System.out.println("验证构造方法被调用的时机:【"+ name + "】被创建!");
    this.name = name;
    this.age = age;
}

public static void main(String[] args) {
    Dog dog = new Dog("jinmao",23);
    System.out.println(dog.name);
    System.out.println(dog.age);
}

结果:
    验证构造方法被调用的时机:【jinmao】被创建!
    jinmao
	23

此时,如果我们把那个没有参数的构造器删除,

你会发现已经不能这么去new对象了。

image-20210721170629934

【注】一旦自己写了构造器,系统将不再赠送,所以我们一般【会自己补充上】。

#6、this关键字

image

#(1)this访问属性和方法

写段代码:

//构造方法和其他方法一样可以重载,可以有参数,名字必须和类名一样,不能有一点区别
public Dog(String name){
    System.out.println("验证构造方法被调用的时机:【"+ name + "】被创建!");
    this.name = name;
}

public void eat(){
    // this也可以在成员方法中使用
    System.out.printf("【%s】再吃骨头。",this.name);
}

public static void main(String[] args) {
    //直接new对象看看new的时候是不是调用了构造方法,事实证明是的
    new Dog("哈士奇").eat();
}

一个方法只有在调用的时候,才能明确方法中的【this】具体指向哪个实例对象。

我们可以使用this访问当前对象的方法和属性。

#(2)this访问构造器

还可以访问当前类的构造器:

//构造方法和其他方法一样可以重载,可以有参数,名字必须和类名一样,不能有一点区别
public Dog(String name){
    System.out.println("验证构造方法被调用的时机:【"+ name + "】被创建!");
    this.name = name;
}

public Dog(){
    this("default");
}

如果我们使用无参构造会传入一个默认值,这就是典型的案例

this当做构造器只能放在第一行

#7、setter和getter

我们之前调用一个实例对象的属性的时候,都是 dog.name 但事实上,java程序员从来不会这么干。

我们有这样的规定,所有的属性必须私有化,使用setter和getter赋值或者取值,

public class Dog {
    
    //有哪些特点
    //定义狗有颜色这个属性
    private String color;
    //定义狗有种类这个属性
    private String type;
    //定义狗有年龄这个属性
    private int age;
    
    //java约定使用setter和getter方法进行属性的取值和赋值
    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
    //..狗还有很多属性和方法,我们无法一一列举
}

为什么呢?

举个例子:

public class Girl {
    
    private int age;

    public int getAge() {
        // 你问我多大了,真实年龄大于18岁,都是18岁
        if(this.age > 18){
            return 18;
        }
        return age;
    }

    public void setAge(int age) {
        // 每过一年,如果我超过了18岁,我永远是18岁。
        if(age > 18){
            this.age = 18;
        }
        this.age = age;
    }
}

所以,正确的定义一个类,一定是

这是规矩,你得遵守。

package com.ydlclass;

public class Girl {
    //第一块成员变量
    private String name;
    private int age;
    private int weight;
    //第二块构造器
    public Girl(){
    }
    public Girl(String name){
        this.name = name;
    }
    public Girl(int age,int weight){
        this.age = age;
        this.weight = weight;
    }
    //第三块成员方法
    int feeling = 0;
    public void happy(int feeling){
        if (feeling >= 60){
            System.out.println(name+"很开心!");
        }else if (feeling >= 0 & feeling < 60){
            System.out.println(name+"很平静!");
        }else {
            System.out.println(name+"很伤心!");
        }
    }
    //第四块get和set
    public void setName(String name){
        this.name = name;
    }

    public String getName() {
        return this.name;
    }

    public void setAge(int age){
        this.age = age;
    }

    public int getAge() {
        return this.age;
    }

    public void setWeight(int weight){
        this.weight = weight;
    }
    public int getWeight(){
        return this.weight;
    }
}
package com.ydlclass;

public class Test {
    public static void main(String[] args) {
        Girl girl = new Girl();
        girl.setName("安妮");
        girl.setAge(19);
        girl.setWeight(50);
        System.out.println("女孩的名字叫:"+girl.getName());
        System.out.println("她的年龄:"+girl.getAge()+"岁");
        System.out.println("她的体重:"+girl.getWeight()+"kg");
        girl.happy(60);
    }
}

女孩的名字叫:安妮
她的年龄:19岁
她的体重:50kg
安妮很开心!

Process finished with exit code 0

标签:name,String,int,age,System,关键字,getter,public,setter
来源: https://www.cnblogs.com/zuifengdeyang/p/16286469.html