A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

Java中this和super的用法总结

在学习java面向对象三大特性之一继承时,我们经常会使用到this与super关键字,对于初学来说还是不好区分的。那么这里就做一些总结。

this关键字
this是自身的一个对象,代表对象本身,可以理解为:指向对象本身的一个指针。
this的用法在java中大体可以分为3种:

1.this记录对象的内存地址
在对象调用每个非静态方法时,该非静态方法中都有一个隐式的变量this来记录该对象的内存地址。

    以下是学生类的代码:
    package com.itheima.sh.this_05;
    class Person {
            private int age = 10;
   
            public void say() {
                    System.out.println("say方法中的this:" + this);
            }
    }

    以下是测试类代码:

    package com.itheima.sh.this_05;
    public class Test1 {
            public static void main(String[] args) {
                    Person p = new Person();
                    System.out.println(p);
                    p.say();
            }
    }

打印结果输出:


    由此可以得出this的确记录了调用say方法的对象p的地址,便于之后根据这个地址获取p对象的属性值。

2.局部变量与成员变量名字重名时,用this来区分:
在开发中,局部变量与成员变量经常会重名,导致我们逻辑赋值出现问题,那么我们在使用成员变量时要加上this来进行区分。

    以下是学生类的代码:

    package com.itheima.sh.this_05;
    class Person {
            private int age = 10;//成员变量
            
            public void showAge(){
                    int age = 20;//局部变量
                    
                    System.out.println("局部变量age:"+age);
                    System.out.println("成员变量age:"+this.age);
            }
            
    }

    以下是测试类代码:

    package com.itheima.sh.this_05;
    public class Test1 {
            public static void main(String[] args) {
                    Person p = new Person();
                    p.showAge();
            }
    }

打印结果输出:

由此可以得到使用this.变量名可以来区分局部变量和成员变量。

3. 引用构造函数
    在java源码中我们经常会看到一些构造方法互相调用的情况,都是通过this关键字来实现的。

    以下是学生类的代码:
    package com.itheima.sh.this_05;
    class Person {
            private int age = 10;
   
            //有参构造方法
            public Person(int age) {
                    this();//这里使用this调用了无参构造方法
                    this.age = age;
                    System.out.println("调用了有参构造方法");
            }
   
            //无参构造方法
            public Person() {
                    System.out.println("调用了无参构造方法");
            }
    }

以下是测试类代码:

            package com.itheima.sh.this_05;
   
            public class Test1 {
                    public static void main(String[] args) {
                            //通过有参构造方法创建对象
                            Person p = new Person(18);
                    }
            }

打印结果输出:
由此可以得到使用this关键字可以在构造方法中调用其他构造方法,并且必须得写在第一行。


super关键字
super可以理解为是指向自己超(父)类对象的一个指针,而这个超类指的是离自己最近的一个父类。

super也有三种用法:
1.普通的引用父类的属性和方法
在子类中,我们有时候想要使用父类的属性或方法时,可以使用super关键字。

以下是父类国家类的代码:

            package com.itheima.sh.this_05;
   
            public class Country {
                    String name = "中国";
                    
                    public void show(){
                            System.out.println("父类的show方法");
                    }
            }

以下是子类城市类的代码:

            package com.itheima.sh.this_05;
   
            public class City extends Country {
                    String name = "上海";
                    
                    public void show(){
                            System.out.println("父类的name属性值为:"+super.name);
                    }
            }

以下是测试类代码:

            package com.itheima.sh.this_05;
   
            public class Test1 {
                    public static void main(String[] args) {
                            City city = new City();
                            city.show();
                    }
            }

打印结果输出:

由此在子类中获取到了父类的属性,方法同理。

2.子类与父类中的成员变量或成员方法同名时,可以使用super区分
在子类中与父类中有同名的成员变量与成员方法,可以使用super关键字来进行区分。

以下是父类国家类的代码:

            package com.itheima.sh.this_05;
   
            public class Country {
                    String name = "中国";
                    
                    public void show(){
                            System.out.println("父类的show方法");
                    }
            }

以下是子类城市类的代码:

            package com.itheima.sh.this_05;
   
            public class City extends Country {
                    String name = "上海";
                    
                    public void show(){
                            System.out.println("父类的name属性值为:"+super.name);
                            System.out.println("子类的name属性值为:"+this.name);
                            System.out.println("子类的show方法");
                            super.show();
                    }
            }

以下是测试类代码:

            package com.itheima.sh.this_05;
   
            public class Test1 {
                    public static void main(String[] args) {
                            City city = new City();
                            city.show();
                    }
            }

打印结果输出:

由此我们发现就算子类与父类有同名的成员变量和成员方法可以使用super来正确获取到父类的成员变量和成员方法。

3.引用父类构造函数

super(参数):调用父类中的某一个构造函数(应该为构造函数中的第一条语句)。

this(参数):调用本类中另一种形式的构造函数(应该为构造函数中的第一条语句)。

以下是父类国家类的代码:

            package com.itheima.sh.this_05;
   
            public class Country {
                    String name = "中国";
                    
                    public Country() {
                            super();
                            System.out.println("父类的无参构造方法");
                    }
            
                    public Country(String name) {
                            super();
                            this.name = name;
                            System.out.println("父类的有参构造方法");
                    }
            }

以下是子类城市类的代码:

            package com.itheima.sh.this_05;
   
            public class City extends Country {
                    String name = "上海";
                    
                    public City() {
                            super();
                            System.out.println("子类的无参构造方法");
                    }
            
                    public City(String name) {
                            super(name);
                            System.out.println("子类的有参构造方法");
                    }
            }

以下是测试类代码:

            package com.itheima.sh.this_05;
   
            public class Test1 {
                    public static void main(String[] args) {
                            City city = new City();
                            City city1 = new City("上海");
                    }
            }

打印结果输出:

由此我们发现就算子类构造方法中可以通过super关键字调用父类对应的构造方法。

this与super的异同

- super: 它引用当前对象的直接父类中的成员(用来访问直接父类中被隐藏的父类中成员数据或函数,基类与派生类中有相同成员定义时如:super.变量名    super.成员函数据名(实参)
- this:它代表当前对象名(在程序中易产生二义性之处,应使用this来指明当前对象;如果函数的形参与类中的成员数据同名,这时需用this来指明成员变量名)
- 调用super()必须写在子类构造方法的第一行,否则编译不通过。每个子类构造方法的第一条语句,都是隐含地调用super(),如果父类没有这种形式的构造函数,那么在编译的时候就会报错。
- super()和this()类似,区别是,super()从子类中调用父类的构造方法,this()在同一类内调用其它方法。
- super()和this()均需放在构造方法内第一行。
- this和super不能同时出现在一个构造函数里面,因为this必然会调用其它的构造函数,其它的构造函数必然也会有super语句的存在,所以在同一个构造函数里面有相同的语句,就失去了语句的意义,编译器也不会通过。
- this()和super()都指的是对象,所以,均不可以在static环境中使用。包括:static变量,static方法,static语句块。
- 从本质上讲,this是一个指向本对象的指针, 然而super是一个Java关键字。


1 个回复

倒序浏览
我来占层楼啊   
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马