Java中构造方法的执行顺序

news/2024/6/29 12:16:26 标签: java, class, constructor, string, 编译器
class="baidu_pl">
class="article_content clearfix">
class="htmledit_views">

一、先执行内部静态对象的构造方法,如果有多个按定义的先后顺序执行;静态对象在构造的时候也是也先执行其内部的静态对象。

二、再调用父类的构造方法(父类还有父类的话,从最开始的基类开始调用),如果没有明显指定调用父类自定义的构造方法,那么编译器会调用默认的父类构造方法super()。但是如果要调用父类自定义的构造方法,要在子类的构造方法中明确指定。

三、按声明顺序将成员引用对象变量初始化。

四、最后调用自身的构造方法。

下面以一个例子来说明代码如下:

class="language-class="tags" href="/tags/JAVA.html" title=java>java">class Animal{
	String name;
	Animal() {
		System.out.println("class Animal");
	}
	Animal(String name){
		this.name = name;
		System.out.println(name + "  class Animal");
		printNumber();
	}
	
	public void printNumber(){
		
	}
}

class Fish extends Animal{
	Fish() {
		System.out.println("class Fish");
	}
}

class GoldFish extends Fish {
	GoldFish() {
		System.out.println("class GoldFish");
	}
}

class Cat {
	Cat(){
		System.out.println("class cat");
	}
}

class Rabbit {
	private static int number;
	private static Cat cat = new Cat();
	public Rabbit() {
		number++;
		System.out.println(number + "class rabbit");
	}
}

class Dog extends Animal{
	public int dogNumber;
	private GoldFish goldFish = new GoldFish();
	static  Rabbit blackRabbit = new Rabbit(); 
	static  Rabbit whiterabbit = new Rabbit(); 
	
	public Dog() {
		super("Tom");
		System.out.println("class Dog");
		dogNumber = 10;
		System.out.println("The dog's number is:" + dogNumber);
	}
	
	public void printNumber(){
		System.out.println("The dog's number is:" + dogNumber);
	}
}

public class TestInheritanceConstructor extends Animal {
	public static void main(String[] args){
		new Dog();	//Test the executive order of constructor 
	}
}
执行结果:

class cat 
1class rabbit
2class rabbit
Tom  class Animal
The dog's number is:0
class Animal
class Fish
class GoldFish
class Dog
The dog's number is:10

解释:

输出:class cat  是因为Dog类中有静态成员。而静态成员所在的类Rabbit中又有静态成员。所以最先执行它。验证第 一句。

输出:1class rabbit 和 2class rabbit 是执行类Rabbit构造函数。

输出:Tomclass Animal 执行父类的构造函数,因为用super("")。

输出:The dog's number is:0 可以看出子类的dogNumber还是默认值0

输出:class Animal 和 class Fish 和 class GoldFish是构造goldFish引用对象类型。验证第三句。

输出:class Dog  和The dog's number is:10是执行自己的构造函数。


http://www.niftyadmin.cn/n/1332008.html

相关文章

Spring中如Service有多个实现类,它怎么知道该注入哪个ServiceImpl类?

点击上方 果汁简历 ,选择“置顶公众号”优质文章,第一时间送达来源:cnblogs.com/zoe-java/p/11530888.htmlService注解,其实做了两件事情:Autowired注解的意思就是:Autowired和Resource两个注解的区别:方法…

C++中构造函数的执行顺序

上篇文章写了:Java中构造方法的执行顺序,这次是C中构造函数的执行顺序。 经测试按照如下顺序: 一、先执行静态成员的构造函数,如果静态成员只是在类定义中声明了,而没有实现,是不用构造的。必须初始化后才…

看看人家SpringBoot的全局异常处理多么优雅...

作者:虚无境https://www.cnblogs.com/xuwujing/p/10933082.htmlSpringBoot全局异常准备说明:如果想直接获取工程那么可以直接跳到底部,通过链接下载工程代码。开发准备环境要求JDK:1.8SpringBoot:1.5.17.RELEASE首先还…

类名.this与类名.class

原文链接:http://leiming32.blog.51cto.com/1021363/494913 1、当在内部类中使用this指的就是内部类的对象, 为了访问外层类对象,就可以使用外层类名.this来访问。 2、在java中,每个class都有一个相应的Class对象,当编写好一个类&#xff0c…

Android切换Activity时的淡入动画和缩小动画

原文地址&#xff1a;http://blog.csdn.net/xiaochun91103/article/details/6199120 一、淡入效果&#xff1a; /anim/fade.xml内容如下&#xff1a; <?xml version"1.0" encoding"utf-8"?> <alpha xmlns:android"http://schemas.androi…

这份简历竟然值50w年薪?

面试官&#xff1a;用过哪些 Map我&#xff1a;LinkedHashMap、TreeMap面试官&#xff1a;说一说这两个 Map 的区别我&#xff1a;ConcurrentHashMap 线程安全&#xff0c;TreeMap 可以自定义排序面试官&#xff1a;ConcurrentHashMap 怎么保证线程安全我&#xff1a;……面试官…

编程大佬是否能记住代码,不用百度就能啪啪啪敲出来么?

点击上方“果汁简历”&#xff0c;选择“置顶公众号”有位新接触编程的新手在知乎上提问[1]&#xff1a;想知道那些编程大佬是不是代码都能记住&#xff0c;然后不用查百度就能啪啪啪打出来呢&#xff1f;从大一接触编程到现在一直在练习代码&#xff0c;但是很多函数和库还是没…

Java IO简介

Java 流在处理上分为字符流和字节流。 字符流处理的单元为 2 个字节的 Unicode 字符&#xff0c;分别操作字符、字符数组或字符串&#xff1b; 字节流处理单元为 1 个字节&#xff0c;操作字节和字节数组。 ( 一 )以字节为导向的流------InputStream/OutputStream 以字节为…