• java| this关键字


    java| this关键字

      1. 一个对象一个this。
      2. this是一个变量,是一个引用,this保存当前对象的内存地址,指向自身。
        所以严格意义上说,this就是表示“当前对象”
      3. this存储在堆内存当中对象的内部。
      4. 当局部变量和成员变量重名的时候,在方法中使用this表示成员变量来区分。
      5. 所以,this代表的是当前变量。

    为什么this不能用在静态方法?

    public static void doSome(){
        System.out.println(this); //报错!
    }

    this代表的是当前对象,而静态方法的调用不需要对象。矛盾了。

    当程序运行的时候,Java编译器将java文件编译成class文件,jvm操作Java解释器执行字节码文件。
    具体来说就是首先会在方法区创建class文件区,之后main方法进栈,在栈中进行对象的创建,在堆中进行实例化,栈中的对象通过内存中的位置标识指向堆中的new出来的对象的实例,对象中的方法的执行在栈中,执行完之后就会销毁。

    源代码:

    public class _001 {
        public static void main(String[] args) {
            Customer q1 = new Customer("憨包");
            Customer q2 = new Customer("hh");
        }}
    //顾客类
     class Customer{
        //属性
            String name ;
            //构造方法//无参构造方法
          public Customer(){}
          //有参构造方法
          public Customer(String s){
              name = s;}
          //顾客购物方法实例方法
        public void shopping (){
            System.out.println(name + "正在购物");
        }}

                                   

     从内存图上看,c2 和this 也是一样的

    this在set、get方法中

    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    View Code

    THIS什么时候不能省?

      · 在set 、 get方法中

     原代码:

    public void setNo(int i){   //缺点: 形式参数名没有意义。(i和s)
        i = no;     
    }
    
    public int getNo() {
        return no;
    }
    public void setName(String s){
        name = s;
    }
    public String getName(){
        return name;
    }

    此时多定义了i,和s,方法名中的形式参数没有意义。

     

     

    修改后(也是目前常用setget版本,增强了可读性)

    public void setNo(int no){  
        this.no = no;    
    }
    public int getNo() {
        return no;
    }
    public void setName(String name){
        this.name = name;
    }
    public String getName(){
        return name;
    }

    若定义 no = no,在java中存在就近原则,则只会复制给方法名中的no,相当于自己赋值给自己,无关main方法中的no

    class Student {
        private int no;
        private String name;

    当前对象nothis.noclass中的no,后面no等于上一行int no

    这里使用this关键字。这里this指实例变量,此时this.不能省略。

    this作用: 区分实例变量和静态变量。

    public String getName(){
        return name;  
    //name前省略了this,getName 获取的是“当前对象”的名字
    }

     

    综上,在实例方法或者构造方法中,为了区分局部变量和实例变量,这种情况下this不能省。

    this() 

      1. this除了可以在实例方法中,也可以在构造方法中。

      2. 通过当前构造方法,调用同类的另一个构造方法:

         语法格式:  this(实参列表)

        例如:

    public data(){
       
    /** this.year = 1970;
        this.month = 1;
        this.day = 1;
         */
        //通过一个构造方法调用当前类的另一个构造方法。
        this(1970,1,1);
    
    }

    通过构造方法1 调用构造方法2,可以做到代码的复用。

    需要注意的是,两个构造方法要在同一个类中。

    this()要出现在构造器的第一个语句,即出现在构造方法的第一行。

     

      3.this()语句的语法作用?

          实现代码的复用。 

  • 相关阅读:
    koa2跨域模块koa2-cors
    使用spring等框架的web程序在Tomcat下的启动顺序及思路理清
    logback 配置解析
    java 学习总结
    如何删除git远程分支
    C++11 锁 lock
    CAS 与 无锁队列
    docker 配置
    vim 中Taglist的安装和使用
    基于C++11的线程池,简洁且可以带任意多的参数
  • 原文地址:https://www.cnblogs.com/caoxingxing/p/13423519.html
Copyright © 2020-2023  润新知