关键字:this

this是什么

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

            它在方法(准确的说是实例方法或非static的方法)内部使用,表示调用该方法的对象

           它在构造器内部使用,表示该构造器正在初始化的对象。

this可以调用的结构:成员变量、方法和构造器

什么时候使用this

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

在实例方法或构造器中,如果使用当前类的成员变量或成员方法可以在其前面添加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('%');
    }
}

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

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(参数列表)

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

 Boy

public class Boy {
    private String name;

    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;
    }

    private int age;

    public Boy() {
    }


    public Boy(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public void marry(Girl girl) {
        System.out.println("我想娶 " + girl.getName());
    }

    public void shout() {
        if (age > 22) {
            System.out.println("可以结婚了");
        } else {
            System.out.println("先恋爱吧");
        }
    }
}
View Code

Girl

public class Girl {
    private String name;
    private int age;

    public Girl() {
    }

    public Girl(String name, int age) {
        this.name = name;
        this.age = age;
    }


    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void marry(Boy boy) {
        System.out.println("我要嫁给你 " + boy.getName());
        boy.marry(this); // 这里的 this 指的是当前对象 girl
    }

    /**
     * 比较两个对象
     *
     * @param girl
     * @return
     */
    public int compare(Girl girl) {
        if (this.age > girl.age) {
            return 1;
        } else if (this.age < girl.age) {
            return -1;
        } else {
            return 0;
        }
    }
}
View Code

测试、

    public static void main(String[] args) {
        Boy boy = new Boy("令狐冲", 29);
        Girl girl = new Girl("任盈盈", 24);

        girl.marry(boy);

        boy.shout();

        Girl girl1 = new Girl("依琳", 18);

        System.out.println(girl.compare(girl1));

    }
posted @ 2023-05-09 09:31  晓枫的春天  阅读(28)  评论(0编辑  收藏  举报