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调用构造方法。
  • 构造方法互相调用的时候保留程序的出口,别形成死循环。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
JAVA是一种面向对象的编程语言,它持封装、继承和多态等向对象的特性。下面是一个简单的JAVA面向对象的例子: 假设我们有一个物类Animal,它有属性name和age,并且有一个方法speak()用于输出动物的叫声。然后我们派生出两个子类Dog和Cat,它们分别继承了Animal类,并且重写了speak()方法。 ```java // Animal类 class Animal { private String name; private int age; public Animal(String name, int age) { this.name = name; this.age = age; } public void speak() { System.out.println("动物发出叫声"); } } // Dog类 class Dog extends Animal { public Dog(String name, int age) { super(name, age); } @Override public void speak() { System.out.println("汪汪汪"); } } // Cat类 class Cat extends Animal { public Cat(String name, int age) { super(name, age); } @Override public void speak() { System.out.println("喵喵喵"); } } // 测试类 public class Main { public static void main(String[] args) { Animal animal1 = new Dog("旺财", 3); Animal animal2 = new Cat("咪咪", 2); animal1.speak(); // 输出:汪汪汪 animal2.speak(); // 输出:喵喵喵 } } ``` 在上面的例子中,Animal类是一个基类,它定义了动物的属性和方法。Dog和Cat类是Animal类的子类,它们继承了Animal类的属性和方法,并且分别重写了speak()方法,实现了不同的叫声。在测试类中,我们创建了一个Dog对象和一个Cat对象,并调用它们的speak()方法,分别输出了不同的叫声。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Zeker62

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值