Java 面向对象:super关键字的理解

Java 面向对象:super关键字的理解

一、Super关键字:

1. super调用父类的构造方法,必须在构造方法的第一个

2. super只能出现在子类的方法或构造方法中!

3. super和this不能同时调用构造方法!


二、this与super的区别:

1. 代表的对象不同:

this:本身调用者的这个对象,保存着调用对象的内存地址
super:代表父类的对象

2. 前提:

this:没有继承也可以使用
super:只能符合继承条件才能使用

3.构造方法:

this() 表示本类的构造器
super() 表示父类的构造器

范例:

Person类只有有参构造
public class Person {
   //有参构造
   public Person(String name) {
       System.out.println("Person无参执行了");
   }

   protected String name = "Person";

   public void print() {
       System.out.println("Person");
   }


}

子类:Student类则需显示调用父类的构造方法

//学生 is 人 人的子类
//子类继承父类,子类就会拥有父类所有的方法
public class Student extends Person {
    public String name = "Student";

    public Student() {
        super("name");// 如果调用父类的有参构造器,super()须放在子类构造器的第一行且要显示调用
        System.out.println("Student无参执行了");
    }
    public void print() {
        System.out.println("Student");
    }

    public void test() {
        print();
        this.print();
        super.print();
    }
}

三、何时用super关键字?

1.如果父类和子类有同名属性,子类要访问父类的同名属性,需要加super关键字!

示例一,子类Vip没有父类的name属性,子类去访问父类的name:
package Day0206.Demo02;

public class Customer {
    String name;

    public Customer() {

    }

    public Customer(String name) {
        this.name = name;
    }

    public static void main(String[] args) {
        Vip vip = new Vip("张三");
        vip.shopping();
    }
}
class Vip extends Customer{

    public Vip() {
        
    }
    public Vip(String name) {
        super(name);
    }

    public void shopping() {
        System.out.println(this.name+"正在购物");
        System.out.println(super.name+"正在购物");
        System.out.println(name+"正在购物");
    }

}
结果:当子类Vip没有父类的name属性,子类可以直接通过name去访问父类的name

在这里插入图片描述


示例二,子类Vip有父类的name属性,子类则需要通过super.name去访问父类的name:
package Day0206.Demo02;


public class Customer {
    String name;

    public Customer() {

    }

    public Customer(String name) {
        this.name = name;
    }

    public static void main(String[] args) {
        Vip vip = new Vip("张三");
        vip.shopping();
    }
}
class Vip extends Customer{
    String name;

    public Vip() {

    }
    public Vip(String name) {
        super(name);
    }

    public void shopping() {
        System.out.println(this.name+"正在购物");
        System.out.println(super.name+"正在购物");
        System.out.println(name+"正在购物");
    }

}

结果:当子类Vip有父类的name属性,子类则需要通过super.name去访问父类的name,此时的name即this.name值为null。

在这里插入图片描述

粗略的内存图如下:

在这里插入图片描述

2.子类访问父类的相同方法,与上面的访问同名属性类似

super.父类方法(),在父与子中有相同方法,如果在子类中想访问父类中的方法,必须使用“super.”进行区分!

四、Super关键字总结:

  1. super表示父类的内存地址
  2. super.属性名,访问父类的属性
  3. super.方法名,访问父类的方法
  4. super(实参),调用父类构造方法
  5. super不能用在静态方法
  6. super()只能出现在子类构造方法体的第一行!目的是创建子类对象时,初始化父类型特征
  7. 在父与子中有同名属性或者相同方法,如果在子类中想访问父类中的数据,必须使用“super.”进行区分!
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值