zoukankan      html  css  js  c++  java
  • super关键字小结(构造方法的执行是不是一定会创建对象?)

    1.父类

    public class Person {
    
        private String name = "李四";
    
        private int age;
    
        public Person() {
            System.out.println("Person的构造方法执行了!");
            System.out.println(this.getClass().hashCode());
        }
    
        public Person(String name, int age) {
            this.name = name;
            this.age = age;
        }
    
        public String getName() {
            return name;
        }
    
        public int getAge() {
            return age;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    }

    2.子类

    public class Student extends Person {
    
        private double mark;
    
        private int num;
    
        private String name = "赵六";
    
        public Student() {
            // 系统会默认有一个super();
            super();
            System.out.println("Student的构造方法执行了");
            System.out.println(this.getClass().hashCode());
        }
    
        public Student(double mark, int num) {
            // super可以用在构造函数中,为了代码的重复利用,还可以初始化从父类继承过来的属性
            super("张三", 10);
            this.mark = mark;
            this.num = num;
        }
    
        public void study() {
            System.out.println(super.getName() + "在学习!");
        }
    
        // ==================================================================
    
        public double getMark() {
            return mark;
        }
    
        public int getNum() {
            return num;
        }
    
        public void setMark(double mark) {
            this.mark = mark;
        }
    
        public void setNum(int num) {
            this.num = num;
        }
    }

    3.测试类:

    public class Test {
        public static void main(String[] args) {
            /**
             * 在创建子类对象的时候会先调用父类的构造方法
             * 调用父类的构造方法仅仅是为了给继承过来的父类属性初始化而已,并不会创建父类对象!
             */
            Student student1 = new Student();
            Student student2 = new Student(100.0, 001);
            student2.study();
        }
    }

    在此,我也翻了很多论坛,调用构造方法并不一定会创建对象,new 的时候才一定会创建对象,,也就是构造方法的执行不一定会创建对象

    super跟this不同,this是一个引用,是一个地址,而super仅仅代表父类的特征,特征,特征

    ===================================================================================

    更新时间:2017年12月21日22:06:48 ------->构造方法的执行并不一定会创建对象例证:

    1.抽象父类:

    public abstract class AbstractObject {
    
        public AbstractObject() {
            System.out.println("抽象类的构造方法执行了!");
        }
    
    }

    2.子类:

    public class SomeObject extends AbstractObject {
    
        public SomeObject() {
            System.out.println("子类的构造方法执行了!");
        }
        
    }

    3.测试类:

    public class Test01 {
    
        public static void main(String[] args) {
            
            // 抽象类无法new对象
    //        AbstractObject obj = new AbstractObject();
            SomeObject obj = new SomeObject();
    
        }
    
    }

    4.执行结果:

    抽象类的构造方法执行了!
    子类的构造方法执行了!

    结论:众所周知抽象类是不能够创建对象的,可见父类的构造方法执行了,但是不会创建父类的对象,突发奇想,特来mark一下

  • 相关阅读:
    卡特兰数
    割点和桥
    子序列(超级水)
    react 进行时
    又开启react之路
    关于特殊字体
    react 组件传值
    git 的安装和项目建立
    ES6 let and const
    js封装的一行半显示省略号(字数自由控制)
  • 原文地址:https://www.cnblogs.com/zhangjianbing/p/8072821.html
Copyright © 2011-2022 走看看