3.1.5 this关键字与supper关键字



1.this关键字的概念

this代表本类对象的一个引用对象

2.this关键字的形式

this.name = name;

3.this关键字的功能

3.1 功能一:

当局部变量与成员变量同名时,可以使用this关键字,指定本类的成员变量
练习: this练习之变量名相同时使用

package partTwo;
/*
本类用于this关键字的学习
 */
public class TestThis {
    public static void main(String[] args) {
        Pig p =new Pig();
        p.eat();

    }
}

//1.创建一个小猪类
class Pig{
    //2.定义成员变量
    int sum = 20;
    int count = 999;
    //3.定义一个普通方法
    public void eat(){
        //4.定义一个局部变量
        int a = 5;
        int sum = 200;
        System.out.println(a);
        //变量有一个就近原则,离谁近,使用谁,所以输出sum结果为200;
        System.out.println(sum);
        //this功能一:当局部变量与成员变量同名时,可以使用this关键字,指定本类的成员变量
        System.out.println(this.sum);  //指定输出为成员变量
        System.out.println(count);
    }
}

3.2 功能二:

this(参数); 在类的构造函数中,可以调用另一构造函数;
注意,this不能同时出现在俩个互相调用的方法语句中,会死循环
this调用构造方法的语句,必须在构造方法的第一行

package partTwo;
/*
本类用于this第二个功能测试
 */
public class TestThis2 {
    public static void main(String[] args) {
        Apple a = new Apple();   //创建对象,触发被动调用无参构造
        //Apple a1 = new Apple("红富士");  //创建对象,触发被动调用含参构造
        a.clean();

        //a.Apple();  不允许,会报错,不能直接写出调用,只能被动调用
        // a.Apple("红富士");  不允许,会报错,不能直接写出调用,只能被动调用
    }
}

//1.创建类Apple
class  Apple{
    //创建类的无参构造
    public Apple(){
        /* this(参数); 表示在本构造中,调用本类的对应参数的构造方法
         * main中调用无参构造,无参构造中第一句为含参构造,所以输出含参后再输出无参,均调用
         * this调用构造方法的语句,不能来回互相调用,会死循环,只能选一个执行
         * this调用构造方法的语句,必须在构造方法的第一行*/
        this("青苹果");
        System.out.println("无参构造");
    }
    //创建类的含参构造
    public Apple(String s){
        /* this();表示在本构造方法中调用本类的无参构造*/
        //this();
        System.out.println("含参构造");
    }
    //创建普通方法
    public void clean(){
        System.out.println("测试调用");
    }
}

2.super关键字的概念

可以通过这个关键字使用父类的内容,Super代表的是父类的一个引用对象

注意:在构造方法里,出现的调用位置必须是第一行

2.1 super关键字的功能

package partTwo;
/*
* 本类我们用于测试super关键字的作用
* */
public class TestSuper {
    public static void main(String[] args) {
        B b = new B();
        b.getName();
    }
}

class A {

    private String nameA="A";

    public void getName() {
        System.out.println("父类"+nameA);
    }
}


class B extends A{
    private String nameB="B";

    @Override
    public void getName() {
        System.out.println("子类"+nameB);
        super.getName();
    }
}

2.2 代码分析

在子类B中,我们重写了父类的getName方法,如果在重写的getName方法中我们去调用了父类的相同方法,必须要通过super关键字显示的指明出来。

如果不明确出来,按照子类优先的原则,相当于还是再调用重写的getName()方法,此时就形成了死循环,执行后会报java.lang.StackOverflowError异常。如下图所示:

其实在继承关系中,子类会默认调用父类的无参构造,其就是靠super关键字实现的。

因为super关键字更多依赖继承关系出现,所以关于super关键字更多的内容将在下一节继承中进行更多的代码实例介绍。

3.this与super的区别

  1. this代表的是本类对象的引用,我们可以把this看作是Cat this = new Cat();
  2. super代表的是父类对象的引用,我们可以把super看作是Father super = new Father();
    当本类的成员变量与父类的成员变量同名时,需要使用super变量名指定父类的成员变量
  3. this可以实现调用本类构造方法的功能
    this(); 表示调用本类的无参构造 this(参数);表示调用本类的对应参数的构造;
    super也可以实现调用父类构造方法的功能
  4. 注意:super的使用前提是继承,没有父子类关系,就没有super
  5. 注意:this调用构造方法或者super调用构造方法,都必须出现在构造方法的第一行
  6. 注意:如果父类没有无参构造,需要手动在子类构造方法的第一行调用其他的含参构造
  7. 拓展:如果子类重写了父类的方法以后,可以使用super.方法名(参数列表)来再次调用父类的方法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值