zoukankan      html  css  js  c++  java
  • 2020年8月13日 实例初始化方法 父子类实例初始化方法 (面试重点)

    package com.atguigu.test01.block;
    
    public class TestInit {
        public static void main(String[] args) {
            /*
            Father f = new Father();
            //父类的无参构造
            */
            
            /*
             * Son s = new Son();
             * 父类的无参构造
                子类的无参构造
             */
            
            //Son s2 = new Son("atguigu");
            /*
             * 父类的无参构造
            子类的有参构造
             */
            
            Son s3 = new Son("atguigu", 10);
            /*
             * 父类的无参构造
                子类的有参构造1
                子类的有参构造2
             */
        }
    }
    class Father{
        public Father(){
            System.out.println("父类的无参构造");
        }
    }
    class Son extends Father{
        private String str;
        private int num;
        
        public Son(){
            //隐含了super();  子类的构造器中一定会调用父类的构造器,默认调用父类的无参构造
            System.out.println("子类的无参构造");
        }
        
        public Son(String str){
            //隐含了super()
            this.str = str;
            System.out.println("子类的有参构造1");
        }
        
        public Son(String str,int num){
            this(str);
            this.num = num;
            System.out.println("子类的有参构造2");
        }
    }

    package com.atguigu.test01.block;
    
    /*
     * (1)先执行父类的实例初始化方法
     * 它由三部分:
     * ①成员变量的显式赋值
     * ②非静态代码块
     * ③构造器
     * (2)再执行子类的实例初始化方法
     * 它由三部分:
     * ①成员变量的显式赋值
     * ②非静态代码块
     * ③构造器
     * 
     * super()或super(实参列表)之前说的是调用父类的构造器,其实是调用父类对应的实例初始化方法
     * super()或super(实例列表)之前说的是在子类构造器的首行,其实是在子类实例初始化方法的首行
     */
    public class TestInit2 {
        public static void main(String[] args) {
            Zi z = new Zi();//312645
        }
    }
    class Fu{
        private String strFu = assignFu();
        {
            System.out.println("(1)父类的非静态代码块");
        }
        public Fu(){
            System.out.println("(2)父类的无参构造");
        }
        public String assignFu(){
            System.out.println("(3)父类的assignFu()");
            return "fu";
        }
    }
    class Zi extends Fu{
        private String strZi = assignZi();
        {
            System.out.println("(4)子类的非静态代码块");
        }
        public Zi(){
            //super()  ==>调用父类的实例初始化方法,而且它在子类实例初始化方法的首行
            System.out.println("(5)子类的无参构造");
        }
        
        public  String assignZi(){
            System.out.println("(6)子类的assignZi()");
            return "zi";
        }
    }

    图片中蓝色字体的部分重要,this在构造器,实例初始化方法中,代表的是正在创建的对象,现在正在创建子类的对象,因为子类重写的assign(),那么执行时子类重写的assign().

  • 相关阅读:
    【BZOJ】【1833】【ZJOI2010】count 数字计数
    bzoj2588: Spoj 10628. Count on a tree(树上第k大)(主席树)
    NOIP2017金秋冲刺训练营杯联赛模拟大奖赛第一轮Day2题解
    NOIP2017金秋冲刺训练营杯联赛模拟大奖赛第二轮Day2题解
    51nod 1962 区间计数(单调栈+二分)
    51nod 1486 大大走格子(DP+组合数学)
    bzoj2276: [Poi2011]Temperature(单调队列/堆)
    5028: 小Z的加油店(线段树)
    bzoj2216: [Poi2011]Lightning Conductor(分治决策单调性优化)
    bzoj1057: [ZJOI2007]棋盘制作(悬线法)
  • 原文地址:https://www.cnblogs.com/douyunpeng/p/13495168.html
Copyright © 2011-2022 走看看