JavaSE——面向对象基础(2/4)-this关键字、构造器(this的执行原理、应用场景,构造器的特点、应用)

简介: JavaSE——面向对象基础(2/4)-this关键字、构造器(this的执行原理、应用场景,构造器的特点、应用)

this

this是什么

  • this作为一个变量,可以用在方法中,可以来获取当前对象的地址。

例如现在有一个学生类:

public class Student(){
    //该学生类中定义了一个方法,用来输出this
    public void printThis(){
        System.out.println(this);
    }
}

然后我们创建一个学生对象s1和s2,并尝试输出这个学生对象的this变量

public class Test{
    public static void main(String[] args){
        Student s1 = new Student();
        System.out.println(s1);
        s1.printThis();
 
        Student s2 = new Student();
        System.out.println(s2);
        s1.printThis();
    }
}

运行之后就会得到两对结果相同的地址值,例如:

包名.类名.对象名@776ec8df

包名.类名.对象名@776ec8df

com.user.thisdemo.Student@4eec7777

com.user.thisdemo.Student@4eec7777

this的执行原理

首先会先加载Test类到方法区里来执行,然后把Test类里面的main方法提取到栈里面来执行


接着执行main方法里的第一行代码,这行代码会把这个学生类也加载到方法区里面去执行

然后通过这个学生类创建一个学生对象s1 ,这个方法一执行完,在栈中就会有一个s1变量去指向一个新的学生对象,新的学生对象可以找到定义它的学生类

新的学生对象就可以找到学生类,代码里输出的s1,输出的就是这个新的学生对象的地址


这行代码用s1去调用printThis方法,它通过s1找到这个学生对象,然后通过这个学生对象去调用printThis方法

当这个学生对象调用这个方法的时候,它会把自己对象的地址传给这个方法里面的this接收,因此此时这个方法输出的this变量就是这个学生变量的地址

this的应用场景

  • this主要用来解决:变量名称冲突问题的

例如现在我们想在学生类中定义一个比较考试分数的方法:

public class Student{
    double score;
    
    public void printPass(double score){
        //假设恰好变量名称重复了
        if(score > score){
            System.out.println("......");
        }else{
            System.out.println("......");
        }
        //这样就会产生冲突
    }
}

使用this关键字

public class Student{
    double score;
    
    public void printPass(double score){
        //使用this关键字
        if(this.score > score){
            System.out.println("......");
        }else{
            System.out.println("......");
        }
        //这样就可以避免冲突,当然,也可以改变方法内部的变量名称,
        //如: public void printPass(double score1)
    }
}

方法里的this是如何拿到调用它的对象的?

实际上,编译器在编译时,会给方法加一个参数,这个参数就是this,也就是用来接收当前对象的地址的

public void printThis(Student this){
    System.out.println(this);
}

构造器

构造器是什么

  • 构造器可以说是一个特殊的方法,它也可以重载;分为无参数构造器和有参数构造器。

它的方法名必须与类名一致,且不用写明是何返回类型,结构为:

 public class Student{

       // 构造器

       public Student(){

               ...

               ...

       }

}

构造器的特点

  • 创建对象时,对象会去调用构造器。
Student s = new Student();

应用场景

  • 创建对象时,同时完成对对象成员变量(属性)的初始化赋值
public class Student{
    String name;
    double score;
    
    public Student(){
        
    }
    
    public Student(String name,double score){
        this.name = name;
        this.score = score;
    }
}
public class Test{
    public static void main(String[] args){
        Student s1 = new Student();
        s1.name = "张三";
        s1.score = 100;
        
        //可以写成这样直接给成员变量赋值
        Student s2 = new Student("李四",59);
    }
}

注意事项

  • 类在设计时,如果不写构造器,Java是会为类自动生成一个无参构造器的。
  • 一旦定义了有参数构造器,Java就不会帮我们的类自动生成无参构造器了,此时就建议自己手写一个无参数构造器出来了。



END



目录
相关文章
|
5月前
|
Java 程序员
【Java探索之旅】继承概念_语法_父类的成员访问
【Java探索之旅】继承概念_语法_父类的成员访问
61 10
|
6月前
|
存储 Java 程序员
JavaSE——面向对象基础(1/4)-面向对象编程、程序中的对象、对象的产生、对象的执行原理、类和对象的一些注意事项
JavaSE——面向对象基础(1/4)-面向对象编程、程序中的对象、对象的产生、对象的执行原理、类和对象的一些注意事项
56 7
|
7月前
|
Java
java面向对象——包+继承+多态(一)-2
java面向对象——包+继承+多态(一)
46 3
|
7月前
|
SQL Java 编译器
java面向对象——包+继承+多态(一)-1
java面向对象——包+继承+多态(一)
42 2
|
6月前
|
Java 程序员 API
JavaSE——面向对象高级三(2/5)-匿名内部类(重点)-认识匿名内部类、匿名内部类的应用场景
JavaSE——面向对象高级三(2/5)-匿名内部类(重点)-认识匿名内部类、匿名内部类的应用场景
36 0
|
6月前
|
Java 编译器 数据处理
JavaSE——面相对象高级一(4/4)-继承相关的注意事项:权限修饰符、单继承、Object类、方法重写、子类访问成员的特点......
JavaSE——面相对象高级一(4/4)-继承相关的注意事项:权限修饰符、单继承、Object类、方法重写、子类访问成员的特点......
63 0
|
6月前
|
Java
JavaSE——面向对象高级二(4/4)-接口的其他细节-三个新方法(默认方法、私有方法、静态方法),接口的多继承
JavaSE——面向对象高级二(4/4)-接口的其他细节-三个新方法(默认方法、私有方法、静态方法),接口的多继承
42 0
|
7月前
|
Python
python面型对象编程进阶(继承、多态、私有化、异常捕获、类属性和类方法)(上)
python面型对象编程进阶(继承、多态、私有化、异常捕获、类属性和类方法)(上)
86 0
|
7月前
|
数据库 Python
python面型对象编程进阶(继承、多态、私有化、异常捕获、类属性和类方法)(下)
python面型对象编程进阶(继承、多态、私有化、异常捕获、类属性和类方法)
84 0
|
7月前
|
Java
Java面向对象编程,构造函数和方法的区别是什么?
Java面向对象编程,构造函数和方法的区别是什么?
127 2
下一篇
DataWorks