
正文
JAVA & .NET创建对象构造函数调用顺序
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
JAVA
定义Person类
package models;
public class Person {
public Person() {
System.out.println("person constructor");
}
{
System.out.println("person init block");
}
static {
System.out.println("person static block");
}
}
定义Chinese类
package models;
public class Chinese extends Person {
public Chinese() {
// super();
System.out.println("chinese constructor");
}
{
System.out.println("chinese init block");
}
{
System.out.println("chinese init block2");
}
static {
System.out.println("chinese static block");
}
static {
System.out.println("chinese static block 2");
}
}
创建Chinese类实例
public class Program {
public static void main(String[] args) {
new Chinese();
}
}
输出结果如下:
person static block
chinese static block
chinese static block 2
person init block
person constructor
chinese init block
chinese init block2
chinese constructor
执行顺序为:
基类静态初始化块——当前类静态初始化块——基类初始化块——基类构造函数——当前类初始化块——当前类构造函数
⚠️ JAVA中加载类时会调用类的静态代码块
try {
Class.forName("models.Chinese");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
执行结果如下:
person static block
chinese static block
chinese static block 2
.NET
与JAVA相比,.NET中没有初始化块及静态初始化块
定义类型如下:
class Person
{
public Person()
{
Console.WriteLine("person constructor");
}
static Person()
{
Console.WriteLine("person static constructor");
}
}
class Chinese : Person
{
public Chinese()
{
Console.WriteLine("chinese constructor");
}
static Chinese()
{
Console.WriteLine("chinese static constructor");
}
}
创建对象:
class Program
{
static void Main(string[] args)
{
new Chinese();
}
}
输出结果如下:
chinese static constructor
person static constructor
person constructor
chinese constructor
执行顺序为:
当前类静态构造函数——基类静态构造函数——基类构造函数——当前类构造函数
小结
JAVA与.NET创建对象时都是先执行静态代码块后执行非静态代码块;
JAVA先执行基类中的静态及非静态代码块;
.NET先执行当前类中的静态代码块,然后先执行基类中的实例构造函数;
JAVA & .NET创建对象构造函数调用顺序的更多相关文章
-
java初始化构造函数调用顺序
类初始化时构造函数调用顺序: (1)初始化对象的存储空间为零或null值: (2)调用父类构造函数: (3)按顺序分别调用类成员变量和实例成员变量的初始化表达式: (4)调用本身构造函数. 例子 ...
-
C# 构造函数调用顺序
了解C#的一个类的加载过程,对于语言机制的理解和写出高效的语言很有帮助,这里简单介绍一下类的实例的构造函数调用过程.C#类的实例的构造过程是,先为实例的数据字段分配内存,并对所有字段按字节置零(0或者 ...
-
C++派生类构造函数调用顺序(详解)
我们来看下面一段代码: class B1 { public: B1(int i) {cout<<"constructing B1 "<<i<<e ...
-
Java的默认构造函数调用
// 注意,这里不能是 public class OOO,否则编译无法通过,需把文件命名成 OOO.java class OOO { // 注意:如果不定义OOO(),那么Shapes(int i)编 ...
-
Java类的成员函数调用顺序
class A { public A() { System.out.println("----------A 构造-------------"); } static void sb ...
-
C++ 全局构造函数调用的顺序
C++的全局类和静态类的构造函数是在main函数之前调用的.但是,不同的类的构造函数以什么顺序调用呢? 对于g++编译器来说,这个顺序是由链接时,文件顺序决定的. 我们用一个例子来说明这一点. 我们有 ...
-
java创建对象 的初始化顺序
java创建对象 的初始化顺序 1.初始化块 初始化块通常写在类的构造方法之前,由花括号括起来,通常包含对成员属性进行初始化的语句: 初始化块分为instance初始化块和static初始化块,初始化 ...
-
Java中创建对象的5种方式
作为Java开发者,我们每天创建很多对象,但我们通常使用依赖管理系统,比如Spring去创建对象.然而这里有很多创建对象的方法,我们会在这篇文章中学到. Java中有5种创建对象的方式,下面给出它们的 ...
-
Java多线程之构造与发布
资料来源 http://www.ibm.com/developerworks/library/j-jtp0618/ http://www.javaspecialists.eu/archive/Issu ...
随机推荐
-
java与eclipse的工作小结
1.Eclipse 的启动画面 A.加启动参数.如: eclipse.exe -showsplash C:/splash.bmp 更多可参考:http://www.cnblogs.com/sharew ...
-
UICollectionView添加 HeaderView FooterView
UICollectionView显示HeaderView FooterView 不如UITableView那么容易,常用会有两种做法: 1.Xib或者Storyboard 在属性一栏中设置一下: 如图 ...
-
Ubuntu18.04搭建nodejs环境
首先安装sudo apt install curl 然后安装命令(当前最新版本是0.33.2,最新版本可以在https://github.com/creationix/nvm查看): curl -o- ...
-
网管到CEO的10年逆袭之路
把我个人近一年来讲的技术人员如何成长的鸡汤课整理了出来,送给大家<网管到CEO的10年逆袭之路>
-
基于 jq 实现拖拽上传 APK 文件,js解析 APK 信息
技术栈 jquery 文件上传:jquery.fileupload,github 文档 apk 文件解析:app-info-parser,github 文档 参考:前端解析ipa.apk安装包信息 - ...
-
Spring 通知和顾问进行增强
使用顾问增加前置增强和后置增强 <bean id="1" class="目标对象"></bean> <bean id=" ...
-
Boostnote 为程序员的开源式记事本
以前使用win10的时候,有个edairy可以使用,并且效果非常好,现在ubuntu上使用的时候,才找个这样的程序员实在太难了,找了好久,才找到一个使用比较顺手的,这里就做个备忘了,顺便做个推荐,实在 ...
-
java中的http请求的封装(GET、POST、form表单形式)
目前JAVA实现HTTP请求的方法用的最多的有两种:一种是通过HTTPClient这种第三方的开源框架去实现.HTTPClient对HTTP的封装性比较不错,通过它基本上能够满足我们大部分的需求,Ht ...
-
GloVe损失函数的理解
简介 GloVe是一种非常简单快速的训练词向量的算法.与复杂的word2vec相比,其是一个log双线性模型,仅通过一个简单的损失函数就能够得到很好的结果. (1)J=∑i,jNf(Xi,j) ...
-
mysql 开发基础系列19 触发器
触发器是与表有关的数据库对象,触发器只能是针对创建的永久表,而不能是临时表. 1.1 创建触发器 -- 语法: CREATE TRIGGER trigger_name trigger_time tri ...
类初始化时构造函数调用顺序: (1)初始化对象的存储空间为零或null值: (2)调用父类构造函数: (3)按顺序分别调用类成员变量和实例成员变量的初始化表达式: (4)调用本身构造函数. 例子 ...
了解C#的一个类的加载过程,对于语言机制的理解和写出高效的语言很有帮助,这里简单介绍一下类的实例的构造函数调用过程.C#类的实例的构造过程是,先为实例的数据字段分配内存,并对所有字段按字节置零(0或者 ...
我们来看下面一段代码: class B1 { public: B1(int i) {cout<<"constructing B1 "<<i<<e ...
// 注意,这里不能是 public class OOO,否则编译无法通过,需把文件命名成 OOO.java class OOO { // 注意:如果不定义OOO(),那么Shapes(int i)编 ...
class A { public A() { System.out.println("----------A 构造-------------"); } static void sb ...
C++的全局类和静态类的构造函数是在main函数之前调用的.但是,不同的类的构造函数以什么顺序调用呢? 对于g++编译器来说,这个顺序是由链接时,文件顺序决定的. 我们用一个例子来说明这一点. 我们有 ...
java创建对象 的初始化顺序 1.初始化块 初始化块通常写在类的构造方法之前,由花括号括起来,通常包含对成员属性进行初始化的语句: 初始化块分为instance初始化块和static初始化块,初始化 ...
作为Java开发者,我们每天创建很多对象,但我们通常使用依赖管理系统,比如Spring去创建对象.然而这里有很多创建对象的方法,我们会在这篇文章中学到. Java中有5种创建对象的方式,下面给出它们的 ...
资料来源 http://www.ibm.com/developerworks/library/j-jtp0618/ http://www.javaspecialists.eu/archive/Issu ...
-
java与eclipse的工作小结
1.Eclipse 的启动画面 A.加启动参数.如: eclipse.exe -showsplash C:/splash.bmp 更多可参考:http://www.cnblogs.com/sharew ...
-
UICollectionView添加 HeaderView FooterView
UICollectionView显示HeaderView FooterView 不如UITableView那么容易,常用会有两种做法: 1.Xib或者Storyboard 在属性一栏中设置一下: 如图 ...
-
Ubuntu18.04搭建nodejs环境
首先安装sudo apt install curl 然后安装命令(当前最新版本是0.33.2,最新版本可以在https://github.com/creationix/nvm查看): curl -o- ...
-
网管到CEO的10年逆袭之路
把我个人近一年来讲的技术人员如何成长的鸡汤课整理了出来,送给大家<网管到CEO的10年逆袭之路>
-
基于 jq 实现拖拽上传 APK 文件,js解析 APK 信息
技术栈 jquery 文件上传:jquery.fileupload,github 文档 apk 文件解析:app-info-parser,github 文档 参考:前端解析ipa.apk安装包信息 - ...
-
Spring 通知和顾问进行增强
使用顾问增加前置增强和后置增强 <bean id="1" class="目标对象"></bean> <bean id=" ...
-
Boostnote 为程序员的开源式记事本
以前使用win10的时候,有个edairy可以使用,并且效果非常好,现在ubuntu上使用的时候,才找个这样的程序员实在太难了,找了好久,才找到一个使用比较顺手的,这里就做个备忘了,顺便做个推荐,实在 ...
-
java中的http请求的封装(GET、POST、form表单形式)
目前JAVA实现HTTP请求的方法用的最多的有两种:一种是通过HTTPClient这种第三方的开源框架去实现.HTTPClient对HTTP的封装性比较不错,通过它基本上能够满足我们大部分的需求,Ht ...
-
GloVe损失函数的理解
简介 GloVe是一种非常简单快速的训练词向量的算法.与复杂的word2vec相比,其是一个log双线性模型,仅通过一个简单的损失函数就能够得到很好的结果. (1)J=∑i,jNf(Xi,j) ...
-
mysql 开发基础系列19 触发器
触发器是与表有关的数据库对象,触发器只能是针对创建的永久表,而不能是临时表. 1.1 创建触发器 -- 语法: CREATE TRIGGER trigger_name trigger_time tri ...







