super 关键字

super

super是直接对父类的引用,可通过super来访问父类中被子类覆盖的方法或属性

import java.util.Objects;

public class Wang {
    public static void main(String[] args){
       new User1().f();

    }

}
class User{
    public int value=100;
    public void f(){
        System.out.println("父类value的值:"+value);
    }
}
class User1 extends User{
    public int value;//若注释到这一行,则super.value值为子类value的值
    public void f(){
        super.f();//调用父类对象的普通方法
        value=200;
        System.out.println("子类value的值"+value);//200
        System.out.println(super.value);//100
    }
}

构造方法的第一句总是super()来调用父类的构造方法。

流程为先向上追溯到Object,然后在依次向下执行类的初始化块和构造方法,直到子类为止。 

import java.util.Objects;

public class Wang {
    public static void main(String[] args){
        new ChildClass();
    }
}


class FatherClass{
    super();
    public FatherClass(){
        System.out.println("父类");
    }
}
class ChildClass extends FatherClass{
    super();
    public ChildClass(){
        System.out.println("子类");
    }
}

运行结果见下 

父类

子类 

注意:

父类中有的属性,在子类中不必再次声明。否则该子类将会有一份父类属性,一份子类属性,且互不影响。

在继承中,子类对象的堆区内存里,既会有子类自身实例
变量,也会有父类继承来的实例变量。如果子类和父类有
同名的变量,堆内存会有 2 个变量。

子类不可以直接通过super.属性名和 super.方法名()访问父类的私有属性、私有方法

但是子类可以通过get方法使用父类的私有属性

通过调用父类的公有方法调用父类的私有方法(在公有方法中调用私有方法)

package com.lanou.superTest;

public class Father {
     int a;
    private int b;
    

    public int getB() {
        return b;
    }

    public void setB(int b) {
        this.b = b;
    }

    public Father() {
    }

    public Father(int a, int b) {
        this.a = a;
        this.b = b;
    }

    public void showInfo(){
        System.out.println("a="+a+",b="+b);
    }


    //私有方法---私有方法只能在类内部供类中别的方法调用,
    //例如在publicMethod方法中访问
    private void privateMethod(){
        System.out.println("这是私有方法");
    }

    public void publicMethod(){
        System.out.print("这是公开方法+");
        privateMethod();
    }
}
package com.lanou.superTest;

public class Son extends Father{
    private int a;
    private int c;

    public int getA() {
        return a;
    }

    public void setA(int a) {
        this.a = a;
    }

    public int getC() {
        return c;
    }

    public void setC(int c) {
        this.c = c;
    }
    public Son(){
        super();
    }

    public Son(int a, int b) {
        super(a,b);
    }

    public Son(int a, int b,  int c) {
        super(a, b);
        this.c = c;
    }

    public void showInfo(){
        System.out.println("a="+a+",b="+this.getB()+",c="+c);
    }

    //用super调用父类方法
    public void testSuperMethod(){
        super.showInfo();
    }


    //调用父类属性
    public void testSuperProperty(){
        System.out.println(a);              //0
        System.out.println(this.a);         //0
        System.out.println(super.a);        //10
        System.out.println(super.getB());   //20
    }

    public void testSuperPrivateMethod(){
        //父类的私有方法不能直接访问,但可以通过在父类中的公有方法调用私有方法,然后子类调用父类的公有方法
        //super.privateMethod();
        super.publicMethod();
    }
}
package com.lanou.superTest;

public class Test {
    public static void main(String[] args) {
        Son son=new Son(10,20,30);

        //子类和父类有同名方法,调用的是子类的方法
        son.showInfo();//a=0,b=20,c=30
        son.testSuperMethod();//a=10,b=20
        son.testSuperProperty();
        son.testSuperPrivateMethod();
        son.publicMethod();

        /*
        子类可以通过get方法使用父类的私有属性
              通过调用父类的公有方法调用父类的私有方法(在公有方法中调用私有方法)
         */
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值