Java面向对象程序设计:this的用法
this可以算是Java里面比较复杂的关键字,this的使用形式决定了它的灵活性,在程序里面,使用this可以实现以下三类作用的描述:
- 当前类中的属性:this.属性
- 当前类中的方法(普通方法、构造方法):this()、this.方法名称();
- this描述当前对象
this调用本类属性
现在的分析可以发现,利用构造方法或者是setter方法都可以进行类中的属性赋值,但是在赋值的时候,采用的是如下的定义形式:
class Person{
private String name ;
private int age;
public Person (String n ,int a)
{
name=n;
age=a;
}
public void tell()
{
System.out.println("姓名:"+name+" 年龄:"+age);
}
//省略setter和getter
}
public class JavaDemo{
public static void main(String [] args)
{
Person per =new Person("张三",18);
per.tell();
}
}
这是一个简单的Java程序,但是有一些有问题的地方。
public Person (String n ,int a)
{
name=n;
age=a;
}
这个问题出现在参数名称上,可以发现,这个时候构造方法中两个参数的目的是为了类中的name或age属性初始化,但是现在却发现,此时现在的代码n和a的参数名称不行,如下改动:
public Person (String name ,int age)
{
name=name;
age=age;
}
此时的结果为空。无法进行属性的正确设置。
在Java中“{}”是作为一个结构体的边界符号,那么在程序里面当进行变量(参数、属性都成为变量)使用的时候,以“{}”作为一个查找边界,所以按照就近取用的原则,所以此时的构造方法并没有能够访问类中的属性,但是为了明确类中的属性与参数的区别,往往会在属性前追加一个“this”,表示本类属性
public Person (String name ,int age)
{
this.name=name;
this.age=age;
}
在以后程序开发过程中,只要是访问本类中属性的时候,一定要加上“this”直接访问。
使用this调用方法
this也可以实现方法的调用,考虑构造方法与普通方法
- 构造方法调用(this()):使用关键字new实例化对象的时候才会调用构造方法。
- 普通方法调用(this.方法名称()):实例化对象产生之后就可以调用普通方法。
范例:调用类中的普通方法
class Person{
private String name ;
private int age;
public Person (String name ,int age)
{
//this.name=name;
//this.age=age;
this.setName(name);
this.setAge(age);//加与不加this都表示本类方法。
}
public void tell()
{
System.out.println("姓名:"+name+" 年龄:"+age);
}
public void setName(String name)
{
this.name=name;
}
public void setAge(int age)
{
this.age=age;
}
public String getName(String name)
{
return this.name;
}
public int getAge(int age)
{
return this.age;
}
}
public class JavaDemo{
public static void main(String [] args)
{
Person per =new Person("张三",18);
per.tell();
}
}
public Person (String name ,int age)
{
//this.name=name;
//this.age=age;
this.setName(name);
setAge(age);//加与不加this都表示本类方法。
}
除了普通方法的调用之外,还需要进行构造方法的调用,对于构造方法的调用,肯定是要放在构造方法中执行。现在假设说类中一共定义有三个构造方法,但是不管调用哪个构造方法,都执行一行输出语句:“一个新的Person类的对象实例化”
传统做法实现:
class Person{
private String name ;
private int age;
public Person()
{
System.out.println("*** 一个新的Person类的对象实例化 ***");
}
public Person (String name)
{
System.out.println("*** 一个新的Person类的对象实例化 ***");
this.name=name;
}
public Person (String name ,int age)
{
this.name=name;
this.age=age;
System.out.println("*** 一个新的Person类的对象实例化 ***");
}
public void tell()
{
System.out.println("姓名:"+name+" 年龄:"+age);
}
//setter、getter略
}
public class JavaDemo{
public static void main(String [] args)
{
Person per =new Person("张三",18);
per.tell();
}
}
但是如果
System.out.println("*** 一个新的Person类的对象实例化 ***");
是一个十行的代码,就会造成程序里面代码重复。
如果想要评价一个代码的好坏:
- 代码结构可以复用,提供的是一 个中间独立的支持
- 我们的目标是:没有重复代码;
利用this构造调用优化:
class Person{
private String name ;
private int age;
public Person()
{
System.out.println("*** 一个新的Person类的对象实例化 ***");
}
public Person (String name)
{
this();//调用本类无参构造方法;
this.name=name;
}
public Person (String name ,int age)
{
this(name);//调用本类单个参数构造方法
this.age=age;
}
public void tell()
{
System.out.println("姓名:"+name+" 年龄:"+age);
}
//setter、getter略
}
public class JavaDemo{
public static void main(String [] args)
{
Person per =new Person("张三");
per.tell();
}
}
对于本类构造方法的互相调用需要注意以下几个问题:
- 构造方法必须在实例化新对象的时候调用,所以“this”只能放在构造方法的首行。普通方法里面不能用this调用构造方法。
- 构造方法互相调用的时候保留程序的出口,别形成死循环。
本文来自博客园,作者:{Zeker62},转载请注明原文链接:https://www.cnblogs.com/Zeker62/p/15046311.html