> 文章列表 > 面向对象编程(进阶)1:关键字:this

面向对象编程(进阶)1:关键字:this

面向对象编程(进阶)1:关键字:this

目录

1.1 this是什么?

1.2 什么时候使用this

1.2.1 实例方法或构造器中使用当前对象的成员

举例1:

举例2:

测试类:

1.2.2 同一个类中构造器互相调用

注意:

1.3 练习

**练习1:**

练习2:


1.1 this是什么?

  • 在Java中,this关键字不算难理解,它的作用和其词义很接近。

    • 它在方法(准确的说是实例方法或非static的方法)内部使用,表示调用该方法的对象
    • 它在构造器内部使用,表示该构造器正在初始化的对象。
  • this可以调用的结构:成员变量、方法和构造器

1.2 什么时候使用this

1.2.1 实例方法或构造器中使用当前对象的成员

在实例方法或构造器中,如果使用当前类的成员变量或成员方法可以在其前面添加this,增强程序的可读性。不过,通常我们都习惯省略this。

但是,当形参与成员变量同名时,如果在方法内或构造器内需要使用成员变量,必须添加this来表明该变量是类的成员变量。即:我们可以用this来区分成员变量局部变量。比如:

另外,使用this访问属性和方法时,如果在本类中未找到,会从父类中查找。这个在继承中会讲到。

举例1:

class Person{		// 定义Person类private String name ;	private int age ;			public Person(String name,int age){	this.name = name ;   this.age = age ;  }public void setName(String name){this.name = name;}public void setAge(int age){this.age = age;}public void getInfo(){	System.out.println("姓名:" + name) ;this.speak();}public void speak(){System.out.println(“年龄:” + this.age);	}
}

举例2:

public class Rectangle {int length;int width;public int area() {return this.length * this.width;}public int perimeter(){return 2 * (this.length + this.width);}public void print(char sign) {for (int i = 1; i <= this.width; i++) {for (int j = 1; j <= this.length; j++) {System.out.print(sign);}System.out.println();}}public String getInfo(){return "长:" + this.length + ",宽:" + this.width +",面积:" + this.area() +",周长:" + this.perimeter();}
}

测试类:

public class TestRectangle {public static void main(String[] args) {Rectangle r1 = new Rectangle();Rectangle r2 = new Rectangle();System.out.println("r1对象:" + r1.getInfo());System.out.println("r2对象:" + r2.getInfo());r1.length = 10;r1.width = 2;System.out.println("r1对象:" + r1.getInfo());System.out.println("r2对象:" + r2.getInfo());r1.print('#');System.out.println("---------------------");r1.print('&');System.out.println("---------------------");r2.print('#');System.out.println("---------------------");r2.print('%');}
}

1.2.2 同一个类中构造器互相调用

this可以作为一个类中构造器相互调用的特殊格式。

  • this():调用本类的无参构造器
  • this(实参列表):调用本类的有参构造器
public class Student {private String name;private int age;// 无参构造public Student() {
//        this("",18);//调用本类有参构造器}// 有参构造public Student(String name) {this();//调用本类无参构造器this.name = name;}// 有参构造public Student(String name,int age){this(name);//调用本类中有一个String参数的构造器this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getInfo(){return "姓名:" + name +",年龄:" + age;}
}

注意:

  • 不能出现递归调用。比如,调用自身构造器。
    • 推论:如果一个类中声明了n个构造器,则最多有 n - 1个构造器中使用了"this(形参列表)"
  • this()和this(实参列表)只能声明在构造器首行。
    • 推论:在类的一个构造器中,最多只能声明一个"this(参数列表)"

1.3 练习

**练习1:**

添加必要的构造器,综合应用构造器的重载,this关键字。

练习2:

(1)按照如下的UML类图,创建相应的类,提供必要的结构:

在提款方法withdraw()中,需要判断用户余额是否能够满足提款数额的要求,如果不能,应给出提示。deposit()方法表示存款。

(2)按照如下的UML类图,创建相应的类,提供必要的结构

(3)按照如下的UML类图,创建相应的类,提供必要的结构

  • addCustomer 方法必须依照参数(姓,名)构造一个新的 Customer对象,然后把它放到 customer 数组中。还必须把 numberOfCustomer 属性的值加 1。

  • getNumOfCustomers 方法返回 numberofCustomers 属性值。

  • getCustomer方法返回与给出的index参数相关的客户。

(4)创建BankTest类,进行测试。

内存解析图: