1.this
this在Java中指的是指向当前引用对象,具体的使用方法分为三种
1.区分成员变量与局部变量
我们在写代码时遇到了这种情况:
定义的方法中参数的名称和成员变量的名称相同
那么在main函数中传参数给成员方法会给到谁呢?
public class Test1 {
static class Student{
public int age;
public String name;
public void func(int age,String name){
age = age;
name = name;
}
public void printF(){
System.out.println(age +"-"+name);
}
}
public static void main(String[] args) {
Student student = new Student();
student.func(10, "Tom");
student.printF();
}
}
在这一段代码中,我们将值传到 Student中的func 这个方法中,当我们运行后会发现
运行结果打印出来的是初始值
这是因为在方法当中局部变量优先
而在参数中的变量就是局部变量,当我们赋值以后值就传到了参数当中去
所以我们并没有给成员变量赋值,这个时候成员变量里面的值就是初始值
而当我们给成员变量加上 this 以后
public void func(int age,String name){
this.age = age;
this.name = name;
}
我们再来打印就可以得到我们想要的结果了
2.访问成员方法
当我们在同一个类中在一个方法里面想要调用另一个方法时使用 this 来调用
public void func2(){
System.out.println("Hello");
}
public void printF(){
this.func2();
System.out.print("World!");
}
2.构造方法
所谓构造方法:名字与类名相同,没有返回值,在创建对象的时候由编译器自动调用
当我们没有在我们自己创建的类里面定义一个构造方法时
编译器会自动给我们提供一个构造方法,并且这个构造方法没有参数
也就是说,当构造方法创建完毕以后我们自己定义的类才定义好了
我们可以在构造方法里面定义我们想要定义的东西,但我们需要注意的是
构造方法的生命周期只有一次,也就是说构造方法只会调用一次
我们用代码演示一下构造方法
public class Test2 {
static class Man{
Man(){
int age = 10;
String name = "Tom";
String gender = "man";
System.out.println("Hello! I am a Man!");
}
}
public static void main(String[] args) {
Man man = new Man();
}
}
当我们在主函数里面实例化 man 后我们运行一下可以发现
当我们在构造方法里面将变量初始化以后
如果我们在后面要使用这些变量那么我们无需再初始化
因为编译器会帮我们自动的将初始化好的变量添加到各个方法当中去
1.3 this访问构造方法
当我们想要在一个构造方法中访问另一个构造方法时我们可以使用 this
public class Test2 {
static class Man{
public int age;
public String name;
public Man(){
this("Tom",18);
System.out.println("这是不带参数的Man");
}
public Man(String name, int age){
this.name = name;
this.age = age;
System.out.println("这是带参数的Man");
}
}
public static void main(String[] args) {
Man man = new Man();
}
}
我们在类中定义了两个构造方法,一个带参数一个不带参数
我们在不带参数的构造方法中使用 this() 来访问另一个带参数的构造方法
我们在第一行的this()中输入参数来调用另一个构造方法
运行结果如下
很显然,第一个构造方法调用了第二个构造方法后再运行自己的代码
我们在使用this()时需要注意的是
1.所有的this()都要放在构造方法的第一行运行
2.不要形成闭环
这里的不要形成闭环我们可以用代码进行演示
当两个构造一直在相互调用的时候我们的编译就会报错
3.绝大部分的构造方法都是用public来修饰的,只有极少部分是用private来修饰的