• java 中的 super


    super

        super是啥? 我第一次看见这个词首先想到的是superman~~ 超人. superstar. 超级巨星. 翻译过来就是”超”. 所谓超人. 就是比人牛B那么一点点的人. 表示高一级.

    那么到了程序里. 这个鬼东西是干嘛的? 原来我们讲过一个词叫this. this的作用是区分成员变量和局部变量. 对吧.

    this.name = name

    Ok, super的作用和this差不多. 它是区分当前类和父类中重名的问题.

    调用父类中重名的内容

    写个Programmer

    package com.lewen.day18;
    
    public class Programmer {
        public String name = "程序员";
    
    }

    写个 Front,此时在Front里就会有两个name. 默认用的是孙悟空的, 但是我想用hero的, 怎么办. 用super

    package com.lewen.day18;
    
    public class Front extends Programmer {
        public String name = "前端";
    
        public void skill() {
            System.out.println(this.name);
            System.out.println(super.name);
        }
    
    }

    测试

    package com.lewen.day18;
    
    public class Test {
        public static void main(String[] args) {
            Front fr = new Front();
            fr.skill();
        }
    }

    OK. 我们对super有了一个初步的认识. 说白了就是找父类中的东西.

    调用父类的构造方法

    接下来. 我们给父类设置一个构造方法.

    package com.lewen.day18;
    
    public class Programmer {
        public String name = "程序员";
    
        public Programmer(String name) {
            this.name = name;
        }
    }

    Front里报错了….

    为什么呢? 这就涉及到一个创建对象的过程

    在执行new的时候. 整个java就开始动起来, 先加载父类. 没有父类就没有子类. 对吧, 所以先加载父类, 然后加载子类. 然后. 会先执行父类的构造方法, 创建一个父类的对象 然后才是子类的构造方法. 这样一个对象才被创建出来.

    package com.lewen.day18;
    
    public class Programmer {
        public String name = "程序员";
        public Programmer(){
            System.out.println("父类的构造方法");
        }
    
    }
    
    
    package com.lewen.day18;
    
    public class Front extends Programmer {
        public String name = "前端";
    
        public Front() {
            System.out.println("子类的构造方法");
        }
    
    }
    
    package com.lewen.day18;
    
    public class Test {
        public static void main(String[] args) {
            Front fr = new Front();
        }
    }
    

    打印结果

    父类的构造

    子类的构造

        那为什么前面我们不写父类的构造的时候, 程序就不报错呢? 我们说过, java会自动送给每一个类一个构造方法, 注意, 这个构造方法是空的. 没有参数的. 所以, 前面的一切调用都是自动的.

    但是, 此时我们给出了父类的构造方法. 那在创建父类对象的时候就必须要调用父类的构造方法. 但是父类中没有无参数的构造方法. 这样就必须由程序员手动去调用父类中的构造方法. 记住,. 这个是必须的.

    package com.lewen.day18;
    
    public class Programmer {
        public String name = "程序员";
    
        public Programmer(String name) {
            this.name = name;
        }
    
    }
    
    package com.lewen.day18;
    
    public class Front extends Programmer {
        public String name = "前端";
    
        public void skill() {
            System.out.println(this.name);
            System.out.println(super.name);
        }
    
        public Front() {
            super("调用父类程序员");   // 必须手动调用父类中的构造方法, super()必须写在第一行
    //        System.out.println("子类的构造方法");
        }
    
    }
    
    package com.lewen.day18;
    
    public class Test {
        public static void main(String[] args) {
            Front fr = new Front();
            fr.skill();
        }
    }

    输出:
    前端
    调用父类程序员

    切记, 父类如果没有无参数的构造. 子类必须手动使用super调用父类的构造方法. 来完成父类对象的创建.

    super:

    调用父类中重名的内容

    调用父类的构造方法

  • 相关阅读:
    准确率,召回率,F值
    残差
    字典学习
    深度学习
    cnn 滤波
    tensorflow
    kaggle 泰坦尼克
    python matplotlib
    数学家西蒙斯:华尔街最赚钱的基金经理
    Oracle学习笔记:删除数据空格(trim、ltrim、rtrim函数)
  • 原文地址:https://www.cnblogs.com/wenyule/p/12209782.html
Copyright © 2020-2023  润新知