Java构造方法和this

先说构造方法 当你new出一个对象时,它就会被调用.

特性:

1.名字必须与类名相同

2.没有返回值类型,设置void也不行

3.创建对象时由编译器自动调用,并且在对象的生命周期内只调用一次

4.构造方法可以重载(根据自己的需求提供不同的参数的构造方法

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

    public Person() { //构造方法
    }

    public void show() {
        System.out.println("姓名: " + name + "  年龄: " + age);
    }
}

)

如果你不主动写这个构造方法   Java会给每个类一个默认的构造方法 并且会处于隐藏 不会显示

class Person {
    public String name;
    public int age;

    public Person() { //构造方法
        System.out.println("这是一个构造方法");
    }

    public void show() {
        System.out.println("姓名: " + name + "  年龄: " + age);
    }
}


public class Test {
    public static void main(String[] args) {

        //在这句话执行完之前  会调用Person类的构造方法
        Person person1 = new Person();

    }
}

运行结果:

Person()构造方法没有任何参数   我们也将它称为无参构造

一般的我们通过调用有参构造来给成员变量赋值

class Person {
    public String name;
    public int age;

    public Person() { //构造方法
        System.out.println("这是一个构造方法");
    }

     public Person(String name1, int age1) {
        name = name1;
        age = age1;
    }


    public void show() {
        System.out.println("姓名: " + name + "  年龄: " + age);
    }
}

public class Test {
    public static void main(String[] args) {

        //在这句话执行完之前  会调用Person类的构造方法
        Person person1 = new Person();
        
        //调用有参构造
        Person person2 = new Person("张三",22);
        person2.show();
    }
}

运行结果:

 我们会发现通过构造方法我们就可以对成员变量进行赋值

有一个细节:当我们提供了有参构造那么Java将不会再给我们提供无参构造

class Person {
    public String name;
    public int age;
    

    public Person(String name1, int age1) {
        name = name1;
        age = age1;
    }

    public void show() {
        System.out.println("姓名: " + name + "  年龄: " + age);
    }
}

public class Test {
    public static void main(String[] args) {

        //这句就会报错
        Person person1 = new Person();

        Person person2 = new Person("张三",22);
        person2.show();
    }
}

下面就会报错  原因就在于你写了一个构造方法  那么java就不会再给你提供无参构造方法了

这时就需要你手动写进去

 接下来就说说this

先来看个例子吧

这是一个有参构造方法  目的很简单  我们想通过构造方法给成员变量赋值 

但是我们通过下面的代码会发现  形参与我们的成员变量命名一样  那这样的话编译器会认为这时形参给形参赋值    

public Person(String name, int age) {
        name = name;
        age = age;
    }

 那如何避免这种情况呢

没错   this

this  代表的是当前对象的引用

当前对象的引用是 person1   而person1中存的是 new Person()的地址

故this存的就是new Person()的地址

通过地址就可以找到要被赋值name成员变量   就相当于 person1.name

 这样就可以解决重命名的问题了

public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

再看一个例子

class DataUtil {
    public int year;
    public int month;
    public int day;

    public void setdataUtil(int year, int month, int day) {
        this.day = day;
        this.year = year;
        this.month = month;
    }

}
public class Test {
    public static void main(String[] args) {

        DataUtil dataUtil = new DataUtil();
        dataUtil.setdataUtil(2001,6,3);
    }
}

在我们调用方法时 其实讲的细一点  方法里面还有一项

public void setdataUtil(DataUtil this, int year, int month, int day) {
        this.day = day;
        this.year = year;
        this.month = month;
    }

在我们调用的时候相当于把引用的地址传给了this

当然了 下面这样写是错了  目的想让大家了解在调用方法的时候 它会把引用的地址传递给this

dataUtil.setdataUtil(dataUtil,2001,6,3);

欧克 到此就结束了  希望对大家有点帮助

溜了溜了

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值