zoukankan      html  css  js  c++  java
  • Java开发笔记(四十七)关键字this的用法

    前面介绍了类的基本定义,包括成员属性、成员方法、构造方法几个组成要素,可谓是具备了类的完整封装形态。不过在进行下一阶段的学习之前,有必要梳理一下前述的类定义代码,看看是否存在哪些需要优化的地方。
    首先观察以下的代码片段,主要是重量属性的定义及其设置方法:

    	// 定义了橘子的重量
    	private double weight;
    
    	// 设置橘子的重量
    	public void setWeight(double inputWeight) {
    		weight = inputWeight;
    	}
    

    注意到setWeight方法的输入参数名叫inputWeight,而重量属性的名称则为weight,之所以给参数名与属性名分配不同的名称,是因为在setWeight方法里面,蹦出一个名叫weight的家伙,编译器焉知这是名叫weight的输入参数,还是名叫weight的成员属性?事实上,对于名称一样的输入参数和成员属性,该方法内部只会把这个weight当作输入参数,而非成员属性。这就带来一个问题:万一不幸遇到参数名与属性名相同的情况,如何才能在方法内部操作同名的成员属性?为此Java提供了this关键字,它用于指代当前类自身,于是“this.变量名”就表示该类指定名称的成员属性了。如此一来,处理橘子重量的相关代码便可改成下面这样:

    	// 定义了橘子的重量
    	private double weight;
    
    	// 设置橘子的重量
    	public void setWeight(double weight) {
    		this.weight = weight;
    	}
    

    关键字this不仅用于修饰成员属性,也能用于修饰成员方法,且看以下的构造方法代码:

    	// 只有一个输入参数的构造方法
    	public OrangeThis(String inputPlace) {
    		place = inputPlace;
    		if (place.equals("淮北")) {
    			name = "枳子";
    		} else {
    			name = "橘子";
    		}
    	}
    

    可见该构造方法的内部代码只是设置橘子的产地,顺带修改橘子的名称,其作用等同于setPlace这个成员方法。故而以上的构造方法完全可以简化成下面这般:

    	// 只有一个输入参数的构造方法
    	public OrangeThis(String place) {
    		// 调用该类的成员方法
    		this.setPlace(place);
    	}
    

    由于此处setPlace指的必定是成员方法setPlace,而不可能是别的什么东西,因此这里的前缀“this.”可加可不加,不加也没有任何不良影响。所以类内部调用成员方法通常不加关键字this,此时构造方法的代码如下所示:

    	// 只有一个输入参数的构造方法
    	public OrangeThis(String place) {
    		// 调用该类的成员方法
    		setPlace(place);
    		// 此时成员方法前面的this可加可不加,即使不加也不会产生歧义
    		//this.setPlace(place);
    	}
    

    再来看以下的另一个构造方法,它拥有三个输入参数:

    	// 拥有三个输入参数的构造方法
    	public OrangeThis(String inputPlace, double inputWeight, boolean inputRipe) {
    		place = inputPlace;
    		if (place.equals("淮北")) {
    			name = "枳子";
    		} else {
    			name = "橘子";
    		}
    		weight = inputWeight;
    		isRipe = inputRipe;
    	}
    

    以上的构造方法,内部代码的前半部分仍旧是设置橘子产地并修改橘子名称,其功能与前述的构造方法“OrangeThis(String place)”雷同。既然前面的构造方法已经实现了同样的功能,后面的构造方法不妨直接调用前一个构造方法,这时依然利用关键字this代替构造方法之前的类名,譬如语句“this();”表示调用当前类默认的构造方法。那么依样画瓢,语句“this(place);”表达的便是拥有一个输入参数的构造方法了,这下可将原先带三个输入参数的构造方法改写成如下代码:

    	// 拥有三个输入参数的构造方法
    	public OrangeThis(String place, double weight, boolean isRipe) {
    		// 在一个构造方法中调用另一个构造方法,不能直接写类的名称,而要使用this指代构造方法
    		this(place);
    		this.weight = weight;
    		this.isRipe = isRipe;
    	}
    

    现在好了,不但类的局部代码得到了简化,并且实现了方法复用,从而增强了代码的可维护性。



    更多Java技术文章参见《Java开发笔记(序)章节目录

  • 相关阅读:
    第二章 Java程序设计环境
    第一章 Java程序设计概述
    (五)Java工程化--Jenkins
    (二)Java工程化--Maven实践
    (四)Java工程化--Git基础
    (三)Java工程化--Git起步
    (一)Java工程化--Maven基础
    codeblocks 中文编码问题
    win10安装virtualbox发生严重错误
    利用ssh传输文件
  • 原文地址:https://www.cnblogs.com/pinlantu/p/10252553.html
Copyright © 2011-2022 走看看