java 构造函数一系列问题

构造函数与类名
a. 类中的构造方法可以省略不写的
b. 构造方法必须跟类名相同,普通的类方法能与类同名的,但是要返回一个值。
c. 构造方法都在new 对象的时候调用的
d. 一个类可以定义多个构造方法的


本类构造调用本类构造:
1,this()
2,new data();
构造方法的继承:

构造方法用来初始化类的对象,与父类的其它成员不同,它不能被子类继承(子类可以继承父类所有的成员变量和成员方法,但不继承父类的构造方法)。因此,在创建子类对象时,为了初始化从父类继承来的数据成员,系统需要调用其父类的构造方法。如果没有显式的构造函数,编译器会给一个默认的构造函数,并且该默认的构造函数仅仅在没有显式地声明构造函数情况下创建。
1,父类无任何构造,子类无构,有参,无参,有两参四种情况都会初始化时或调用子类构造时自动调用父类的默认无参。然后执行子类构造。
2,父类定义了无参构造,子类无构,有参,无参,有两参四种情况都会初始化时或调用子类构造时首先调用父类的无参。当然可以在子类中super()来显示调用。然后执行子类构造。
3,父类定义了有参和无参,那么子类必须显示调用有参初始化父类变量,否则执行2.
4,父类只定义了有参,这是不会有默认无参,也没有无参,则必须显示调用有参初始化父类变量,否则执行2,报错。

构造原则如下:
1. 如果子类没有定义构造方法,则调用父类的无参数的构造方法。
2. 如果子类定义了构造方法,不论是无参数还是带参数,在创建子类的对象的时候,首先执行父类无参数的构造方法,然后执行自己的构造方法。
3. 在创建子类对象时候,如果子类的构造函数没有显示调用父类的构造函数,父类没有定义构造,则会调用父类的默认无参构造函数。
4. 在创建子类对象时候,如果子类的构造函数没有显示调用父类的构造函数且父类自己提供了无参构造函数,则会调用父类自己的无参构造函数。
5. 在创建子类对象时候,如果子类的构造函数没有显示调用父类的构造函数且父类只定义了自己的有参构造函数,则会出错(如果父类只有有参数的构造方法,则子类必须显示调用此带参构造方法)。
6. 如果子类调用父类带参数的构造方法,需要用初始化父类成员对象的方式,比如:
[cpp] view plain copy



super,this问题。
0,显示调用父类有参构造,否则调用无参构造,没有则编译错误
1,this用于本类形参实参名相同时,用于指代实参,或成员方法,然可省略。
2,super可以在子类调用父类的成员或者方法
super(参数):调用父类中的某一个构造函数(应该为构造函数中的第一条语句)。
this(参数):调用本类中另一种形式的构造函数(应该为构造函数中的第一条语句)。
3,构造时,this(),this(a),super(无参),super(a);
4,构造函数中默认的第一条语句是super(),super()与this()不能同时出现在一个构造函数里,因为都必须是第一条语句
5,都不能在static中,是指对象的。

牢记初始化顺序(完全是这个)=》只初始化一次

虚拟机在首次加载Java类时,会对静态成员变量、静态初始化块、静态方法进行一次初始化。只执行一次,不随创建再执行。我们不要去纠结这里的顺序,一般来说我们只需要知道,静态方法一般在最后。
父类静态变量>父类B静态代码块->子类静态变量-》子类A静态代码块->父类B非静态代码块->父类B构造函数->子类A非静态代码块->子类A构造函数
静态初始化按声名顺序

类定义中,构造函数可以通过this,或者new A()调用其他构造函数。
构造函数有多种方式 所以是可以用private的 只是在外部这种方法不能给实例化


继承的初始化特点:
首先new了一个子类对象,那么就要调用构造方法来初始化该子类对象,但是该类继承自A,所以要先调用父类的构造方法,这里通过super("B")显示的调用了父类的带参构造。执行父类的带参构造前要先对父类中的对象进行初始化,对父类中的c成员进行初始化,调用了C类的无参构造,所以调用顺序为:
先调用C类的无参构造
再调用A类的带参构造
最后调用调用子类的构造
总结:
父类静态变量>父类B静态代码块->子类静态变量-》子类A静态代码块->父类B非静态代码块->父类B构造函数->子类A非静态代码块->子类A构造函数

一个文件中可以有多个类,如果没有public类,则可以与任意类名相同,如果有public类则文件名必须与此类名相同,因为一个文件中只能有一个public类。如果文件中只有一个类,则文件名必须与类名相同,匿名类内部类等。

### Java 构造函数初始化顺序解析 在Java中,构造函数用于对象的初始化。当创建一个新的对象实例,按照特定的顺序来执行一系列操作以确保对象被正确初始化。 #### 静态变量与静态代码块 首先被执行的是类级别的静态成员变量赋值语以及静态代码块。这些部分在整个程序运行期间只会加载一次,并是在第一次使用该类前完成初始化[^2]。 #### 父类构造过程 接着,在子类任何其他逻辑发生之前,会先处理其父类的相关构造流程。这意味着即便开发者未显式写出`super()`调用来启动这一机制,编译器也会自动插入这条指令作为子类构造方法的第一条命令去触发超类(即父类)相应版本的方法调用[^3]。 #### 成员变量声明及其初始值设定 随后是当前类内部定义的所有字段(属性),它们会被赋予各自指定的数据类型默认值或者是程序员自定的初值表达式的结果;此阶段还包括非静态域内含有的任意数量的实例初始化区块——也叫做“初始化块”,这类特殊结构会在每次新实体诞生之际早于常规构造器主体内容而先行运作起来[^1]。 #### 子类自身的构造函数体 最后才是用户所编写的具体构造函数内的具体实现细节得以展开并最终形成完整的对象状态配置。这一步骤可能涉及更多复杂的业务逻辑设置或是依赖注入等高级特性应用。 ```java class Parent { public Parent() { System.out.println("Parent constructor"); } } class Child extends Parent { // Static initialization block runs first when the class is loaded. static { System.out.println("Child static init block"); } // Instance initialization block runs before constructors. { System.out.println("Child instance init block"); } public Child(){ super(); // Implicitly called by compiler if not specified explicitly. System.out.println("Child constructor"); } } ``` 上述代码展示了典型的继承关系下各组件之间的相对位置及相应的打印输出次序,可以直观地帮助理解整个初始化过程中各个组成部分是如何协同工作的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值