天天看点

Java——this关键字

Java——this关键字

(调用本类属性、调用本类方法、表示当前对象)

1、 调用本类属性

类中有许多成员,大部分情况下类中直接进行成员调用,但是为了清楚的描述调用是本类属性,会用this.属性表示。

package mypackage;
//定义一个主类,创建一个person类的对象,并且定义内容  name=88,age=99
public class C {
	
	public static void main(String []args)
	{
		Person  td=new Person(88,99);
		
		td.print();
		
	}

}
//定义一个person类
class Person{
    int name;
    int age;
    public Person(){}
    public Person(int name, int age) {
    //此处没有使用this
    name = name;  
    age =age;
       
    }
    //定义一个打印的方法
    public void print()
	{
		System.out.println("name="+name+",age="+age);
	}
}
           

运行结果:

Java——this关键字

(可以看出结果并没有使用我们自己定义的内容)

如上定义的类,构造方法按上述写法,对象中不会保存我们定义的内容,而是默认值,因为程序以{}为界定范围,如果在此范围内有指定的变量名称,则会直接调用,若没有,则会调用类中的相应属性。

当参数与属性名称相同时,则会出现混淆,则需要用户自己手动明确调用的是属性还是方法中的参数,若是属性,则需要加this.属性,标准程序开发中都会以此方式进行:

package mypackage;



public class C {
	
	public static void main(String []args)
	{
		Person  td=new Person(88,99);
		
		td.print();
		
	}

}
class Person{
    int name;
    int age;
    public Person(){}
    public Person(int name, int age) {
    //此处加上了关键字this
   this.name = name;
   this. age =age;
       
    }
    public void print()
	{
		System.out.println("name="+name+",age="+age);
	}
}
           

运行结果:

Java——this关键字

当加上this之后,就可以使用自己定义的内容

当参数与属性名称相同时,this很关键,但是当参数与属性名称不同时,this没有作用,均可以使用自己定义的内容

比如:

当有this 时

package mypackage;

import First.ThisDemo;

public class C {
	
	public static void main(String []args)
	{
		Person  td=new Person(88,99);
		
		td.print();
		
	}

}
class Person{
    int name;
    int age;
    public Person(){}
    public Person(int p, int q) {
    this.name = p;
    this.age =q;
       
    }
    public void print()
	{
		System.out.println("name="+name+",age="+age);
	}
}
           

运行结果:

Java——this关键字

没有this :

package mypackage;

import First.ThisDemo;

public class C {
	
	public static void main(String []args)
	{
		Person  td=new Person(88,99);
		
		td.print();
		
	}

}
class Person{
    int name;
    int age;
    public Person(){}
    public Person(int p, int q) {
    name = p;
    age =q;
       
    }
    public void print()
	{
		System.out.println("name="+name+",age="+age);
	}
}
           

运行结果:

Java——this关键字

2、调用本类方法

一个类中存在普通方法和构造方法,this调用本类方法时,对应的语法不同:

1)调用本类中的其他方法:this.方法()

一个类中可能存在很多方法,这些方法之间可以直接进行调用,但是不够标准,应用this.方法()调用,标准化风格。

2)调用本类其他构造方法:this()

一个类中可以有多个方法,且可以重载,并且构造方法在实例化对象时只能被调用一次。

若现在需求:Person类中中有三个构造方法,无论调用哪个构造方法,都要求执行语句"**********"。

【举例】:原始实现方式

class Person{
        String name;
        int age;
        public Person(){
            System.out.println("********");
        }
        public Person(String name, int age) {
            this.name = name;
            this.age = age;
            System.out.println("********");
        }
    }
           

程序设计的一个重要原则,避免重复代码。按照这个原则,以上的代码并不符合开发要求,这时可以使用this()形式实现,调用本类无参构造。

class Person{
        String name;
        int age;
        public Person(){
            System.out.println("********");
        }
        public Person(String name) {
            this();
            this.name = name;
        }
        public Person(String name, int age) {
            this(name);
            this.name = name;
            this.age = age;
        }
    }
           

需要注意的是,this()形式只能放在构造方法的首行。在使用this()调用本类其他构造方法时,应该避免循环调用。

下面通过实例说明构造方法互调的意义所在。

【举例】:写一个雇员的信息类,类中提供如下四个属性:姓名、职位、部门、工资,还有4个构造方法:

• 无参构造:姓名未知、职位待定、部门后勤、工资为0;

• 单参构造(姓名):职位主管、部门技术部、工资10;

• 双参构造(姓名、部门):职位工程师、工资5;

• 四参构造。

针对以上要求可以有两种代码实现方法:

第一种:传统实现

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        Emp emp = new Emp();
        System.out.println(emp.getInfo());

    }


    class Emp{
        private String name;
        private String job;
        private String dept;
        private double sal;

        public Emp(){
            this.name ="未知";
            this.job = "待定";
            this.dept = "后勤";
            this.sal = 0.0;
        }
        public Emp(String name){
            this.name =name;
            this.job = "主管";
            this.dept = "技术部";
            this.sal = 10.0;
        }
        public Emp(String name,String dept){
            this.name =name;
            this.job = "工程师";
            this.dept = dept;
            this.sal = 5.0;
        }

        public Emp(String name,String job, String dept, double sal){
            this.name =name;
            this.job =job;
            this.dept = dept;
            this.sal = sal;


        }
        public String getInfo(){
            return "姓名:"+this.name+"职位:"+this.job+"部门:"+this.dept+"工资:"+this.sal;
        }
    }
           

以上程序重复的代码太多,过于冗余。

第二种:使用this改进

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        Emp emp = new Emp();
        System.out.println(emp.getInfo());

    }


    class Emp{
        private String name;
        private String job;
        private String dept;
        private double sal;

        public Emp(){
            this("未知","待定","后勤",0.0);
        }
        public Emp(String name){
            this(name,"主管","技术部",10.0);
        }
        public Emp(String name,String dept){
            this(name,"工程师",dept,5.0);
        }

        public Emp(String name,String job, String dept, double sal){
            this.name =name;
            this.job =job;
            this.dept = dept;
            this.sal = sal;
        }
        public String getInfo(){
            return "姓名:"+this.name+"职位:"+this.job+"部门:"+this.dept+"工资:"+this.sal;
        }
    }


           
Java——this关键字