• java this关键字调用构造方法


    一 this调用构造方法

      构造方法之间的调用,可以通过this关键字来完成。

    格式:

      this(参数列表);

     

    构造方法的调用举例:

    class Person {
        // Person的成员属性
        private int age;
        private String name;
    
        // 无参数的构造方法
        Person() {
        }
    
        // 给姓名初始化的构造方法
        Person(String nm) {
            name = nm;
        }
        // 给姓名和年龄初始化的构造方法
        Person(String nm, int a) {
            // 由于已经存在给姓名进行初始化的构造方法 name = nm;因此只需要调用即可
            // 调用其他构造方法,需要通过this关键字来调用
            this(nm);
            // 给年龄初始化
            age = a;
        }
    }

    二 this的原理图解

     

    例如:

     

    class Person {
        private int age;
        private String name;
    
        Person() {
        }
        Person(String nm) {
            name = nm;
        }
        Person(String nm, int a) {
            this(nm);
            age = a;
        }
    }
    
    class PersonDemo {
        public static void main(String[] args) {
            Person p = new Person("张三", 23);
        }
    }

     

    内存图解:

      1、先执行main方法,main方法压栈,执行其中的new Person(“张三”,23);

      2、堆内存中开辟空间,并为其分配内存地址0x33,,紧接着成员变量默认初始化(name=null age = 0);

      3、拥有两个参数的构造方法(Person(String nm , int a))压栈,在这个构造方法中有一个隐式的this,

    因为构造方法是给对象初始化的,那个对象调用到这个构造方法,this就指向堆中的那个对象。

      4、由于Person(String nm , int a)构造方法中使用了this(nm);构造方法Person(String nm)就会压栈,

    并将“张三”传递给nm。在Person(String nm , int a)构造方法中同样也有隐式的this,this的值同样也为

    0x33,这时会执行其中name = nm,即把“张三”赋值给成员的name。当赋值结束后Person(String nm , int a)

    构造方法弹栈。

      5、程序继续执行构造方法(Person(String nm , int a)中的age = a;这时会将23赋值给成员属性age。

    赋值结束构造方法(Person(String nm , int a)弹栈。

      6、当构造方法(Person(String nm , int a)弹栈结束后,Person对象在内存中创建完成,并将0x33赋值

    给main方法中的p引用变量。

     注意事项:

      this所在的方法,this就代表哪个对象。

      调用其他构造方法的语句必须定义在构造方法的第一行,原因是初始化动作要最先执行。

    三 成员变量和局部变量同名问题

      以在成员变量名前面加上this.来区别成员变量和局部变量

    例如:

    class Person {
        private int age;
        private String name;
    
        // 给姓名和年龄初始化的构造方法
        Person(String name, int age) {
            // 当需要访问成员变量是,只需要在成员变量前面加上this.即可
            this.name = name;
            this.age = age;
        }
    
        public void speak() {
            System.out.println("name=" + this.name + ",age=" + this.age);
        }
    }
    
    class PersonDemo {
        public static void main(String[] args) {
            Person p = new Person("张三", 23);
            p.speak();
        }
    }

    四 this的应用

    例如:Person类中定义功能,判断两个人是否是同龄人

    class Person {
        private int age;
        private String name;
    
        // 给姓名和年龄初始化的构造方法
        Person(String name, int age) {
            // 当需要访问成员变量是,只需要在成员变量前面加上this.即可
            this.name = name;
            this.age = age;
        }
    
        public void speak() {
            System.out.println("name=" + this.name + ",age=" + this.age);
        }
    
        // 判断是否为同龄人
        public boolean equalsAge(Person p) {
            // 使用当前调用该equalsAge方法对象的age和传递进来p的age进行比较
            // 由于无法确定具体是哪一个对象调用equalsAge方法,这里就可以使用this来代替
            /*
             * if(this.age == p.age) { return true; } return false;
             */
            return this.age = p.age;
        }
    }

     

  • 相关阅读:
    CommonJs模块和ES6模块的区别
    【代码笔记】Web-JavaScript-JavaScript JSON
    【代码笔记】Web-JavaScript-JavaScript表单验证
    【代码笔记】Web-JavaScript-JavaScript调试
    【代码笔记】Web-JavaScript-JavaScript错误
    【代码笔记】Web-JavaScript-JavaScript正则表达式
    【代码笔记】Web-JavaScript-JavaScript 类型转换
    【代码笔记】Web-Javascript-Javascript typeof
    【代码笔记】Web-Javascript-javascript break和continue语句
    【代码笔记】Web-JavaScript-javascript while循环
  • 原文地址:https://www.cnblogs.com/jiejava/p/13265824.html
Copyright © 2020-2023  润新知