类和对象(this的三种用法)

这三种方法this不能调用静态的成员方法和属性

this访问成员变量

this.data:访问当前对象的成员变量

public class DataUtil {
    public int year;
    public int month;
    public int day;
 
    //每个成员方法第一个参数默认是this // public void setDate(DataUtil this,int y,int m,int d)
    public void setDate(int y,int m,int d){
        year=y;// 还可写成 this.year=y;  //加上this表示给当前的对象的属性赋值
        month=m; 
        day=d;
    }
    //public void show(DataUtil)
    public void show(){
        //这样也对--> System.out.println("年:"+year+" 月:"+month+" 日:"+day);
        System.out.println("年:"+this.year+" 月:"+this.month+" 日:"+this.day);
    }
 
    public static void main(String[] args) {
        DataUtil dataUtil = new DataUtil();
        dataUtil.setDate(2023,12,4);
        dataUtil.show();
 
        DataUtil dataUtil2 = new DataUtil();
        dataUtil2.setDate(2023,12,5);
        dataUtil2.show();
 
        DataUtil dataUtil3 = new DataUtil();
        dataUtil3.setDate(2023,12,6);
        dataUtil3.show();
    }
}
this访问构造方法

this.func():访问当前对象的成员方法

对象的构造及初始化

在Java方法内部定义一个局部变量时,必须初始化,否则会编译失败;

构造方法

概念:构造方法(也称构造器)是一个特殊的成员方法,名字必须与类名相同,在创建对象时,由编译器自动调用,并且在整个对象的生命周期内只调用一次。

注意:构造方法的作用就是对对象中的成员进行初始化,并不负责给对象开辟空间。

特性:

  1. 名字必须与类名相同;
  2. 没有返回值,设置void也不行;
  3. 创建对象时由编译器自动调用,并且在对象的生命周期内只调用一次;
  4. 构造方法可以重载(用户根据自己的需要提供不同参数的构造方法);
public class DataUtil {
    //public主要是权限问题 不写public也是成员变量
    //成员变量:定义在方法外部 类的内部的变量 (对象创建出生 对象销毁结束)
    //局部变量:在方法内部定义的变量(在栈上)  (进入方法创建 出方法结束)
    public int year;
    public int month;
    public int day;

    //此时以下两个构造方法的关系:重载
    //重载:方法名必须相同 参数列表不同 返回值没有影响
    public DataUtil(){
        this.year = 1111;
        this.month = 11;
        this.day = 11;
        System.out.println("不带参数的构造方法,这个方法如果没有写,Java会默认提供!");
    }

    public DataUtil(int year,int month,int day){
        this.year=year;
        this.month=month;
        this.day=day;
        System.out.println("调用了带有三个参数的构造方法!");
    }
    
        public void show(){
        System.out.println("年:"+this.year+" 月:"+this.month+" 日:"+this.day);
    }

    public static void main(String[] args) {
        DataUtil dataUtil = new DataUtil();
        dataUtil.show();
    }
}

上述两个构造方法:名字相同,参数列表不同,因此构成了方法重载

    5.如果用户没有显式定义,编译器会生成一份默认的构造方法,生成默认构造方法一定是无参的。

public class DataUtil {
    public int year;
    public int month;
    public int day;
    
    public void show(){
    System.out.println("年:"+this.year+" 月:"+this.month+" 日:"+this.day);
    }

    public static void main(String[] args) {
        DataUtil d = new DataUtil();
        d.show();
    }
}
//此时DataUtil类中没有定义任何构造方法,编译器会默认生成一个不带参数的构造方法

注意:一旦用户定义,编译器则不再生成!

     6.构造方法中,可以通过this调用其他构造方法来简化代码;

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

    //无参构造方法-->内部给各个成员赋初值
    //此时可以在无参构造方法中通过this调用带有三个参数的构造方法
    public DataUtil(){
        //调用当前对象的其他构造方法
        //this调用构造方法的时候必须放在第一行!!! 只能在构造方法内部才能使用
        this(1111,11,11);
        System.out.println("不带参数的构造方法");
    }
    
    //带有三个参数的构造方法
    public DataUtil(int year,int month,int day){
        this.year=year;
        this.month=month;
        this.day=day;
        System.out.println("调用了带有三个参数的构造方法!");
    }
}

注意:this()必须是构造方法中的第一条语句;不能形成环

    public DataUtil(){
        this(1111,11,11);
    }
    
    public DataUtil(int year,int month,int day){
        this();
    }
//无参构造器调用三个参数的构造器,三个参数的构造器调用无参的构造器,形成构造器的递归调用
//此时编译报错 原因:循环调用

   7.大多数情况下使用public来修饰特殊场景下会被private修饰;

初始化

默认初始化:局部变量在使用时必须初始化,而成员变量可以不用;

就地初始化:在声明成员变量时,就直接给出了初始值。

注意:代码编译完成后,编译器会将所有给成员初始化的这些语句添加到各个构造函数中

this访问成员方法

this():调用当前对象的其他构造方法

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

    //每个成员方法第一个参数默认是this
    //this代表当前对象的引用 --> 就看谁调用这个方法 --> 谁就是this
    //一般情况下不会写DataUtil this 此处写只是为了更好的理解对那个对象赋值-->可以把this看作隐式参数
    //DataUtil 表示当前对象的类型
    public void setDate(DataUtil this,int y,int m,int d){
        //在setDate中使用show方法 (不能访问静态成员方法!)
        show();     //或者写成this.show();
        year=y;// 还可写成 this.year=y;  //加上this表示给当前的对象的属性赋值
        month=m;
        day=d;
    }
    public void show(){
        System.out.println("年:"+this.year+" 月:"+this.month+" 日:"+this.day);
    }
}

完整代码

public class DataUtil {
    //public主要是权限问题 不写public也是成员变量
    //成员变量:定义在方法外部 类的内部的变量 (对象创建出生 对象销毁结束)
    //局部变量:在方法内部定义的变量(在栈上)  (进入方法创建 出方法结束)
    public int year;
    public int month;
    public int day;

    //此时两个构造方法的关系:重载
    //重载:方法名必须相同 参数列表不同 返回值没有影响
    public DataUtil(){
        //调用当前对象的其他构造方法
        //this调用构造方法的时候必须放在第一行!!! 只能在构造方法内部才能使用
        this(1111,11,11);
        System.out.println("不带参数的构造方法,这个方法如果没有写,Java会默认提供!");
    }
    //构造方法没有返回值 加void也不对!!!
    //此时就不需要再调用setDate了
    //当调用完成 构造方法  那么对象也就生成了
    // 一个对象的生成必要:1.为对象分配内存  2.调用合适的构造方法
    public DataUtil(int year,int month,int day){
        this.year=year;
        this.month=month;
        this.day=day;
        System.out.println("调用了带有三个参数的构造方法!");
    }

    //每个成员方法第一个参数默认是this
    //this代表当前对象的引用 --> 就看谁调用这个方法 --> 谁就是this
    //一般情况下不会写DataUtil this 此处写只是为了更好的理解对那个对象赋值-->可以把this看作隐式参数
    //DataUtil 表示当前对象的类型
    public void setDate(DataUtil this,int y,int m,int d){
        //在setDate中使用show方法 (不能访问静态成员方法!)
        show();     //或者写成this.show();
        year=y;// 还可写成 this.year=y;  //加上this表示给当前的对象的属性赋值
        month=m;
        day=d;
    }
    //此时形参名和成员变量名相同 局部变量优先使用,因此方法内部只能识别形参,此时相当于是自己给自己赋值没有给对象赋值
    //此时可添加this 来指明给当前对象的属性赋值 就不会报错了
    public void setDate2(int year,int month,int day){
        this.year=year;
        this.month=month;
        this.day=day;
    }
    public void show(){
        System.out.println("年:"+this.year+" 月:"+this.month+" 日:"+this.day);
    }

    public static void main(String[] args) {
        DataUtil dataUtil = new DataUtil();
        dataUtil.show();
    }

    public static void main2(String[] args) {
        DataUtil dataUtil = new DataUtil(2023,12,9);
        dataUtil.show();
    }

    public static void main1(String[] args) {
        //也就是说不管写了什么构造方法  Java都不会提供不带参数的构造方法了
        //构造方法:这个方法没有返回值,方法名和类名是一样的    如果没写构造方法Java会提供默认的不带参数的构造方法 如果写了就会调用自己写的
        //                  new DataUtil() 这里是实例化对象-->此时调用对象的构造方法(构造方法只会被调用一次)
        DataUtil dataUtil = new DataUtil();
        //dataUtil.setDate(2023,12,4);
       // dataUtil.show();
        dataUtil.setDate2(2023,12,6);
        dataUtil.show();

        DataUtil dataUtil2 = new DataUtil();
        dataUtil2.setDate(2023,12,5);
        dataUtil2.show();

        DataUtil dataUtil3 = new DataUtil();
        dataUtil3.setDate(2023,12,6);
        dataUtil3.show();
    }
}
  • 7
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

半颗星辰、

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值