• 构造器的执行顺序


    1,在没有静态块的情况下,子类的对象创建时,父类的无参构造器-->子类的构造器(产生对象的构造器,如果

    是无参则执行的是无参构造器,如果执行的是有参则执行的有参构造器)
    现在的父类中只有两个构造器:

    Father.java
     Father {
    	public Father(){
    		System.out.println("我是父类的无参构造器");
    	}
    	
    	public Father(String username){
    		System.out.println("我是父类有参构造器,传过来的参数是+"+username);
    	}
    public class SonDemo extends Father{
    
    	public SonDemo(){
    		System.out.println("我是--子类--的无参构造器");
    	}
    	public SonDemo(String username){
    		System.out.println("我是子类的有参构造器,参数是"+username);
    	}
    	
    	public void sys(){
    		System.out.println("我是子类的sys方法");
    	}
    	
    	public static void main(String[] args) {
    		//里面的内容在下面有说明
    	}
    	
    	
    	
    }

    ①,子类使用无参构造器创建对象:
    在SonDemo 的main方法中加入创建对象的代码:

    SonDemo son = new SonDemo();
    	
    }

        我是父类的无参构造器
        我是--子类--的无参构造器
    ②,子类使用有参构造器创建对象:
    SonDemo的main方法中加入

    SonDemo son = new SonDemo("than you ma");


    那么控制台打印的结果是:
    我是父类的无参构造器
    我是子类的有参构造器,参数是than you ma
    也就是说在子类调用无参构造器创建对象的时候,在执行它自己的有参构造器之前首先执行父类的无参构造器。
    ③,在子类中创建父类的对象,使用无参,

    SonDemo son = new SonDemo("than you ma");
    Father ff = new Father();

    SonDemo的main方法中加入
    我是父类的无参构造器
    我是--子类--的无参构造器
    我是父类的无参构造器
    调用了父类的无参构造器,有参的创建对象调用的是有参构造器。

    总结:在创建子类对象的时候,首先会调用父类的构造器,让后在调用子类相应的构造器创建对象,在子类创建父类对象时,就是直接调用父类自己相应的构造器。

    2.如果在子类和父类中存在静态块;执行顺序有会是怎么样的了?
    答,静态块会在构造器之前运行。不管是子类还是父类。创建一个对象的时候,会首先加载它的静态块。

    Father.java
    public class Father {
    
    	//静态块
    	static{
    		System.out.println("father  static ");
    	}
    	
    	public Father(){
    		System.out.println("我是父类的无参构造器");
    	}
    	
    	public Father(String username){
    		System.out.println("我是父类有参构造器,传过来的参数是+"+username);
    	}
    }
    
    SonDemo.java
    public class SonDemo extends Father{
    	//静态块
    	static{
    		System.out.println("sonDemo static ");
    	}
    	
    	public SonDemo(){
    		System.out.println("我是--子类--的无参构造器");
    	}
    	public SonDemo(String username){
    		System.out.println("我是子类的有参构造器,参数是"+username);
    	}
    	
    	public void sys(){
    		System.out.println("我是子类的sys方法");
    	}
    	
    	public static void main(String[] args) {
    		SonDemo son = new SonDemo();
    	}
    }

    ①程序的结果:
    father  static
    sonDemo static
    我是父类的无参构造器
    我是--子类--的无参构造器
    因为在创建子类对象之前:会创建父类的一个对象,而静态块会在main之前被加载,
    所以两个类的静态块首先执行。
    然后执行构造器。
    ②,如果在子类中的main中只创建父类的对象结果是怎么样的呢?

    打印结果:
    father  static
    sonDemo static
    我是父类的无参构造器
    为什么子类的静态块会被加载了?是因为我们是在
    SonDemo中测试,如果在其他类中测试就不会打印。
    总结:我们说了这么多就是重要的一点。静态块会在构造器器之前执行。

  • 相关阅读:
    Javascript中Promise对象的实现
    SQL 问题记录
    转:十步完全理解SQL
    转:SQL Server 动态行转列
    SQL in、not in、exists和not exists的区别:
    SQL之left join、right join、inner join的区别
    转 .NET4.5之初识async与await
    macOS USB连接iPhone反复重连解决方法
    MacOS: 找到被占用的端口并释放
    解决rust编译包含diesel类库时,cannot find -lmysqlclient的错误
  • 原文地址:https://www.cnblogs.com/pengqinping/p/2498892.html
Copyright © 2020-2023  润新知