zoukankan      html  css  js  c++  java
  • 从头认识java-6.2 继承(Generalization)(2)

    接着上一章节。

    (4)无参构造器初始化

    这里我们来聊聊初始化的话题,特别是初始化基类,父类会怎样?

    继续沿用上面的代码,我们做出一些精简。

    package com.ray.testobject;
    
    public class Test {
    
    	public static void main(String[] args) {
    		new Sub();
    	}
    }
    
    class Father {
    	public Father() {
    		System.out.println("create father");
    	}
    }
    
    class Sub extends Father {
    	public Sub() {
    		System.out.println("create Sub");
    	}
    }
    

    输出:

    create father
    create Sub

    为什么?

    其实,在编译的过程中,编译器已经为我们在子类里面new一个隐藏的父类,所以就会出现我们虽然只是new子类,但是父类也同时new。

    而且有一点需要注意的是,父类是在子类之前就已经new出来的。

    对于执行顺序这个东西,我们再来一个实验,因为说到顺序这个,我们就必须引进静态代码块,因为这个也是关键

    package com.ray.testobject;
    
    public class Test {
    
    	public static void main(String[] args) {
    		new Sub();
    	}
    }
    
    class Father {
    	private static int id;
    	static {
    		System.out.println("id:" + id);
    		System.out.println("a");
    	}
    
    	public Father() {
    		System.out.println("create father");
    	}
    }
    
    class Sub extends Father {
    	private static String name;
    	static {
    		System.out.println("name:" + name);
    		System.out.println("b");
    	}
    
    	public Sub() {
    		System.out.println("create Sub");
    	}
    }
    

    输出:

    id:0
    a
    name:null
    b
    create father
    create Sub

    从输出结果可以看见执行顺序:

    1.静态属性域

    2.静态代码块

    3.父类构造器

    4.子类构造器


    (5)有参构造器初始化

    上面已经讨论了无参的情况,我们下面来聊一下有参的情况。

    注意点:

    1.子类必须具有相关参数的构造器

    2.构造器必须引用super(父类)的构造器

    package com.ray.testobject;
    
    public class Test {
    
    	public static void main(String[] args) {
    	}
    }
    
    class Father {
    
    	public Father(int id) {
    		System.out.println("create father");
    	}
    }
    
    class Sub extends Father {
    
    	public Sub(int id) {
    		super(id);// 如果没有这一句,报错,找不到父类相关的构造器。
    		System.out.println("create Sub");
    	}
    
    	public Sub(int id, String name) {
    		super(id);// 如果没有这一句,报错,找不到父类相关的构造器。
    		System.out.println("create Sub");
    	}
    }
    


    就像sub的两个构造器,只要有相关的参数id(有其他参数也无所谓),而且构造器必须调用super()。


    总结:这一章节主要讨论了有参和无参的构造器初始化情况。


    这一章节就到这里,谢谢。

    -----------------------------------

    目录


    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    windows 按时自动化任务
    Linux libusb 安装及简单使用
    Linux 交换eth0和eth1
    I.MX6 GPS JNI HAL register init hacking
    I.MX6 Android mmm convenient to use
    I.MX6 GPS Android HAL Framework 调试
    Android GPS GPSBasics project hacking
    Python windows serial
    【JAVA】别特注意,POI中getLastRowNum() 和getLastCellNum()的区别
    freemarker跳出循环
  • 原文地址:https://www.cnblogs.com/raylee2007/p/4944461.html
Copyright © 2011-2022 走看看