Java基础——8.5 super关键字

8.5 super关键字

  • super代表父类的引用,用于访问父类的属性、方法、构造器。
8.5.1 基本语法
  • super.属性名,访问父类的属性,但不能访问父类的private属性;
  • super.方法名(参数列表),访问父类的方法,但不能访问父类的private方法;
  • super(参数列表);,访问父类的构造器,只能放在构造器的第一句且只能出现一句;
  • 例:
    package com.edu.super_;
    public class A extends Base{
        //4个属性
        public int n1 = 100;
        protected int n2 = 200;
        int n3 = 300;
        private int n4 = 400;
        public A() {}                          //无参构造器
        public A(String name) {}               //一个参数的构造器
        public A(String name, int age) {}      //两个参数的构造器
    
        public void cal() {
            System.out.println("A 类的 cal() 方法...");
        }
        //四种方法
        public void test100() {
        }
        protected void test200() {
        }
        void test300() {
        }
        private void test400() {
        }
    }
    
    package com.edu.super_;
    public class B extends A {
        public int n1 = 888;
        public void test() {
        //super的访问不限于直接父类,如果爷爷类和本类中有同名的成员,也可以使用 super 去访问爷爷类的成员;
        //如果多个基类中都有同名的成员,使用 super 访问遵循就近原则。例如此处是A->B->C
            System.out.println("super.n1 = " + super.n1);
            super.cal();
        }
    
        //通过 super.属性 访问父类的属性, 但不能访问父类的 private 属性
        public void hi() {
            System.out.println(super.n1 + " " + super.n2 + " " + super.n3);
        }
    
        public void cal() {
            System.out.println("B 类的 cal() 方法...");
        }
    
        public void sum() {
            System.out.println("B 类的 sum()");
            //希望调用父类A的 cal方法。此时,因为子类B没有cal方法,因此可以使用下面三种方式来调用
            //找 cal 方法时(cal() 和 this.cal()),顺序是:
            // (1)先找本类,如果有,则调用
            // (2)如果没有,则找父类(如果有,并可以调用,则调用)
            // (3)如果父类没有,则继续找父类的父类,直到 Object 类
            // 提示:如果查找方法的过程中,找到了,但是不能访问,则报错;如果查找方法的过程中,没有找到,则提示方法不存在
            //方法一
            this.cal(); //等价于cal();方法二
            //super.cal();//方法三
            System.out.println(n1);
            System.out.println(this.n1);
            //找 n1 (super.n1) 的顺序是直接查找父类属性,其他的规则一样
            System.out.println(super.n1);
        }
    
        //用 super.方法名(参数列表); 访问父类的方法,不能访问父类的 private 方法
        public void ok() {
            super.test100();
            super.test200();
            super.test300();
            //super.test400();//不能访问父类 private 方法
        }
    
        //用 super(参数列表); 访问父类的构造器。注意:只能放在构造器的第一句,只能出现一句!
        public B() {
            //super();
            //super("jack", 10);
            super("jack");
        }
    }
    
    package com.edu.super_;
    public class Base { //父类是 Object
        public int n1 = 999;
        public int age = 111;
        public void cal() {
            System.out.println("Base 类的 cal() 方法...");
        }
        public void eat() {
            System.out.println("Base 类的 eat().....");
        }
    }
    
    package com.edu.super_;
    public class super01 {
        public static void main(String[] args) {
            B b = new B();//子类对象
            //b.sum();
            b.test();
        }
    }
    
8.5.2 优点
  • 调用父类的构造器(分工明确,父类属性由父类初始化,子类的属性由子类初始化);
  • 当子类中有和父亲中的成员(属性和方法)重名时,为了访问父类的成员,必须通过super;如果没有重名,使用superthis和直接访问是一样的效果;
  • super的访问不局限于父类,假设爷爷类和本类中有同名的成员,也可以使用super去访问爷爷类的成员;如果多个基类中都有同名成员,使用super访问遵循就近原则
8.5.3 super和this的比较
区别点 this super
访问属性 访问本类中的属性,如果本类没有此属性则从父类中继续查找 从父类开始查找属性
调用方法 访问本类中的方法,如果本类没有此方法则从父类继续查找 从父类开始查找方法
调用构造器 调用本类构造器,必须放在构造器的首行 调用父类构造器,必须放在子类构造器的首行
特殊 表示当前对象 子类中访问父类对象

你可能感兴趣的:(Java基础,java,开发语言)