• Java super关键字


    Java super关键字代表当前对象的直接父类的默认引用。
    super关键字就类似于 C#中的base关键字。参见地址
     
     
    super的注意事项:
    1、super必须出现在子类中(子类的方法和构造方法中),而不是其他位置
    2、super用于访问父类的成员,例如父类的属性、方法、构造方法
    3、访问权限的限制,例如无法通过super访问父类的private成员。
     
    super的使用场景
    1、子类中使用了方法重写,但是又想调用父类的被重写了的方法,就要使用super关键字
    2、super在子类构造函数中显示调动父类的无参构造或者其他有参构造(如果不显示写super,那么初始化子类实例时会默认调用父类的无参构造,如果此时父类没有无参构造,编译器会报错)
     
    super使用方法:
    1、访问父类的属性或者对象,进行修改赋值操作 =》 super.变量/对象名;
    2、直接访问并调用父类的方法 =》super.方法名();
    3、显式调用父类的构造方法,不管无参还是有参 =》 super() 无参例子 super(name)有参例子,如果子类不想调父类的无参构造,那么就必须要在子类的构造方法中显式的使用super调用父类的有参构造!!!
     
     父类:
    public class A {
    
        public int age=11;
        public A()
        {
            System.out.println("Build A(无参构造)");
        }
          public A(String name)
          {
              System.out.println(name + "Build A(有参构造)");
          }
          public  void Hello()
          {
              System.out.println("Hello,我是A方法里的Hello方法");
          }
    }

    子类

    public class B extends A {
        public B()
        {
            System.out.println("Build B(无参构造)");
        }
        public B(String name)
        {
            System.out.println(name+"Build B(有参构造)");
        }
        
        public void Hello()
        {
            System.out.println("父类的age值是:"+super.age); //输出父类的成员变量
            super.Hello();//显式调用父类的方法
            System.out.println("Hello,我是B方法里的Hello方法");
        }
    
    }
    public class C extends A{
      public int age=99;
      public C() {
          System.out.println("Build C(无参构造)");
      }
      public C(String name) {
          super(name);//显式调用父类的有参构造,如果不写这句的话,默认调用父类无参构造,也就是等同于super();
          System.out.println(name+"Build C(有参构造)");
      }
      public  void Hello()
      {
          System.out.println("Hello,我是C方法里的Hello方法");
      }
    }

    测试:

    public class Test {
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
           
            //子类实例化无参
            //子类无参实例化,首先会默认调用父类的无参构造,再调用子类的无参构造
            //B b1=new B(); //输出:【Build A(无参构造)   Build B(无参构造)】
            
            //子类实例化有参,子类有参构造显式调用父类的无参构造(如果不显式,默认还是调父类的无参构造)
            //B b2=new B("猪");//输出: 【Build A(无参构造) 猪Build B(有参构造)】
            
            //子类实例化有参,子类显式的调用父类的有参构造
            //C c1=new C("驴");//输出:【驴Build A(有参构造) 驴Build C(有参构造)】
            
            //子类实例化,调用父类的方法
            /*
            B b3=new B();
            b3.Hello(); 
            //*/
            /* 输出:
             * Build A(无参构造)
    Build B(无参构造)
    父类的age值是:11
    Hello,我是A方法里的Hello方法
    Hello,我是B方法里的Hello方法
             */
            
            //子类和父类有公共的成员变量
            /*
            C c2=new C("虎");
            System.out.println("年龄: "+c2.age);//输出 99
            A a1=new C("虎");
            System.out.println("年龄: "+a1.age);//输出 11
            //*/
            
            //实例化子类,转为父类对象,输出的成员变量是父类的值,调用的方法是字类重写的方法
            A a2=new C();
            System.out.println("年龄: "+a2.age);//输出 11
            a2.Hello();//如果C有重写方法,就显示C内的方法,如果没重写,就显示A的方法
            
        }
    
    }
  • 相关阅读:
    剑指 Offer 25. 合并两个排序的链表
    剑指 Offer 26. 树的子结构
    剑指 Offer 27. 二叉树的镜像
    剑指 Offer 29. 顺时针打印矩阵
    剑指 Offer 30. 包含min函数的栈
    剑指 Offer 22. 链表中倒数第k个节点
    选轻量应用服务器还是云服务器ECS?一图彻底搞懂
    征文投稿丨使用云服务器ECS快速搭建halo博客
    运营给产品送的情人节礼物是?
    阿里云张献涛:自主最强DPU神龙的秘诀
  • 原文地址:https://www.cnblogs.com/schangxiang/p/11194264.html
Copyright © 2020-2023  润新知