• 基础知识-super与继承方法详解


    📈阅读下面代码,思考输出结果

    package Homework343;
    
    import javax.print.DocFlavor;
    
    public class homework348 {
        public static void main(String[] args) {
           new Demo().test();
           new Demo("Join").test();
        }
     class  Test{
            String name="Rose";
            Test(){
                System.out.println("Test");
            }
            Test(String name){
                this.name=name;
            }
        }
    class Demo extends Test{
            String name="jack";
            Demo(){
                super();
                System.out.println("Demo");
            }
            Demo(String s){
                super(s);
            }
            public void test(){
                System.out.println(super.name);
                System.out.println(this.name);
            }
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34

    📚详解分析:

    ✏️(1)在主函数里, new Demo().test()没有指向对象,所以为一个匿名对象,new Demo("Join").test()也为一个匿名对象。
    ✏️(2)在主函数中,创建一个匿名对象,第一步走Demo的无参构造,

    Demo(){
    super();
    System.out.println(“Demo”);
    }

    首先调用其父类的无参构造,找到Test的无参构造,即输出"Test";
    输出完以后,回到Demo的无参构造,输出"Demo";
    ✏️(3)Demo对象创建完毕,调用test方法,该方法输出super.name,super.name找的是父类的name属性,父类name属性为"Rose",
    即输出Rose;this.name是本类的name,即输出jack.
    ✏️(4) 执行以下语句:
    new Demo(“Join”).test();
    走的是子类的有参构造器,s在这里就是Join,调用父类的有参构造器,
          Test(String name){//是传进来的Join
            this.name=name;//将Join赋给this.name,将父类的name改为Join
        }
    
    • 1
    • 2
    • 3

    属性没有动态绑定机制,哪里声明就在哪里使用

    ✏️(5) 调用test方法,super.name,在这里找父类的name,但是父类的name已经被改为Join,所以在此输出为Join;
    ✏️(6) 指的是本类name,即jack;

    ⛳️知识点补充

    1. 继承的特点

    (1)子类只能继承一个父类(单继承),可以多层继承,例如C继承自B,B继承自A,那么C同样可以调用A类的属性或者方法;
    (2)子类继承父类的普通属性和方法
    (3)子类不能继承父类的构造方法,但是在子类的构造方法第一行隐 式的存在一个super(),用来调用父类的构造方法;
    (4)子类无法继承父类中被private修饰的属性或者方法;
    (5)子类可以继承父类中的静态方法和静态属性;
    (6)父类中必须有无参构造方法,才能被继承,只有有参构造方法无法被继承。

    2. super关键字

    (1) super.属性——调用父类的属性
    (2) super.方法——调用父类的方法
    (3)super()——调用父类的构造方法

    2.1 super注意事项

    (1)super调用父类的构造方法,必须在构造方法的第一个
    (2)super 必须只能出现在子类的方法或者构造方法中!
    (3)super 和 this 不能同时调用构造方法

    2.1 super与this不同

    代表的对象不同:
        this :本身调用者这个对象
        super : 代表父类这个对象的应用
    
    • 1
    • 2
    前提
        this :没有继承也可以使用
        super :只能在继承的条件下才可以使用
    
    • 1
    • 2
    构造方法
        this :本类的构造
        super :父类的构造
    
    • 1
    • 2
  • 相关阅读:
    nginx 剔除请求参数 $args 变量中任意指定参数之万金油
    PCB板各层定义及解释
    SqlBoy:分组问题
    Stable Diffusion WebUI中COMMANDLINE_ARGS参数配置说明
    安装chromadb遇到的问题与python3升级
    nginx的location中配置路径讲解
    如何做delay chain?
    Jetpack WorkManager 看这一篇就够了~
    linux shell 编程之运算符详解
    【从头构筑C#知识体系】2.2 分部类型
  • 原文地址:https://blog.csdn.net/yangqiqi1997/article/details/126332717