这三种方法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方法内部定义一个局部变量时,必须初始化,否则会编译失败;
构造方法
概念:构造方法(也称构造器)是一个特殊的成员方法,名字必须与类名相同,在创建对象时,由编译器自动调用,并且在整个对象的生命周期内只调用一次。
注意:构造方法的作用就是对对象中的成员进行初始化,并不负责给对象开辟空间。
特性:
- 名字必须与类名相同;
- 没有返回值,设置void也不行;
- 创建对象时由编译器自动调用,并且在对象的生命周期内只调用一次;
- 构造方法可以重载(用户根据自己的需要提供不同参数的构造方法);
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();
}
}