zoukankan      html  css  js  c++  java
  • 面向对象之this关键字

    方法之间调用,可以通过方法名进行调用。但构造方法,无法通过构造方法名来相互调用。

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

    l  构造方法调用格式:

    this(参数列表);

    l  构造方法的调用

    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;
    	}
    }
    

     

    l  图列说明:

    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引用变量。

    l  注意:

    this到底代表什么呢?this代表的是对象,具体代表哪个对象呢?哪个对象调用了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();
    	}
    }
    

    需求:在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;
    	}
    }
    

      

     

  • 相关阅读:
    Win7+Centos7双系统安装/树莓派安装Centos7
    C++学习笔记
    Ubuntu Codeblocks配置Eigen Sophus
    Java笔记
    解决Mac下AndroidStudio内容时卡顿
    解决Android RadioGroup跑到输入法上面
    Activity去掉标题不成功的解决方法
    Synergy屏幕共享键鼠 (for Mac&Ubuntu)
    Android 限制控件多次点击
    Bitmap 创建、转换、圆角、设置透明度
  • 原文地址:https://www.cnblogs.com/lxx2014/p/9389735.html
Copyright © 2011-2022 走看看