java继承当中都有一些什么样的构造函数规则?

6.继承当中的构造函数规则  

马克-to-win:继承当中的构造函数规则貌似复杂: 记住我给你的以下几条口诀, 你高枕无忧。1)如果你在某类中写了带参构造函数,系统就不会再为你在那类中自动添加无参构造函数了。2)如你没有写无参构造函数,且机器也不会为你自动添加这个无参构造函 数时(因为你已经有带参构造函数了),你不可以主动调无参构造函数。3)子类的构造函数中不能人为的写两个super。4)构造函数中要是你人工想写super,super必须为第一句话。构造函数中要是你不写super,机器会为你加无参数super().马克-to-win:5)既然super必须为第一句话,创建子类对象时,构造函数调用次序为,先最低的超类直到最高的子类。

例1.6.1---

class AAAMark_to_win {
    AAAMark_to_win() {
        System.out.println("Inside AAAMark_to_win's constructor.");
    }
    AAAMark_to_win(int j) {
        System.out.println(j);
    }
}
class BBB extends AAAMark_to_win {
    BBB() {
        super(3);
        System.out.println("Inside BBB's constructor.");
    }
    BBB(int i) {
        System.out.println(i);
    }
}
class C extends BBB {
    C(int a) {
/*马克-to-win: super必须是第一句话,彻底不写也行。因为机器会为你自动加。
super must be the first statement. without it, also ok.the result
is exactly the same as right now, because machine will add automatically for you. but if you have it, it must be the first statement.
*/      
//        super();//注意这上下两句,只能保留一个
        super(1);
        System.out.println("Inside C's constructor.");
    }
}

public class Test {
    public static void main(String args[]) {
/*马克-to-win: 这里你不能写成C(),即使不谈继承,也一样。因为你已经有C(int a) {} ,系统不会为你自动添加C() {} 。
 
here you can not write as new C(); even without inheritance,still, you can not write as new C(); because if you have C(int a) {} already, machine will not automatically add C() {} for you.*/
        C c = new C(5);
    }
}

 

更多请见:https://blog.youkuaiyun.com/qq_44639795/article/details/103117875

 

 

 

<think>嗯,用户问的是Java中直接初始化成员变量和在构造函数中初始化有什么区别。这个问题看起来基础,但其实涉及对象初始化的流程和设计上的考虑。我需要仔细分析两者的不同点,然后组织成一个清晰的回答。 首先,直接初始化是在声明成员变量的时候直接赋值,比如int a = 5;。而构造函数初始化则是在构造函数里给变量赋值。那它们的执行顺序是什么样的呢?我记得Java中成员变量的直接初始化是在构造函数之前执行的。比如,如果有多个构造函数,直接初始化的值会被所有构造函数共享,除非构造函数里覆盖了那个值。 然后,考虑代码的可维护性。直接初始化让变量的初始值一目了然,特别是当有多个构造函数的时候,不需要在每个构造器里都写一遍。但如果不同的构造器需要不同的初始值,这时候在构造函数里初始化会更灵活。比如,有的构造器可能用默认值,有的可能根据参数设置不同的值。 还有默认构造函数的情况。如果用户没有写任何构造函数,直接初始化的值会生效。但如果用户写了带参数的构造函数,而没有显式定义默认构造,这时候直接初始化仍然有效,但必须通过自定义的构造函数来创建对象,这时候可能需要考虑是否覆盖初始值。 另外,继承的情况。子类的初始化过程会先执行父类的构造器,然后才是子类的直接初始化和构造器代码。这时候直接初始化的变量可能在父类构造器执行之后被赋值,但如果在子类构造函数里初始化的话,顺序会不同。 还有异常处理的问题。构造函数中可以处理异常,比如抛出或者捕获,但直接初始化的时候如果有复杂的逻辑导致异常,可能不太好处理,只能用静态块或者更复杂的方式。 例子方面,可以举一个变量直接初始化和构造函数初始化的对比。比如,直接初始化a=5,而构造函数里设置a=10,这时候最终结果取决于使用的是哪个构造函数。如果有多个构造函数,部分可能覆盖初始值,部分可能保留。 还要提到静态成员变量,不过用户的问题可能更多在实例变量。但如果有静态变量的话,它们的初始化时机更早,在类加载的时候,但这也属于另一个话题了。 总结下来,主要区别在于初始化时机、代码复用、灵活性和异常处理。需要把这些点分清楚,用例子说明,结构要清晰,让用户容易理解。</think>在Java中,直接初始化成员变量和在构造函数中初始化成员变量的区别主要体现在 **执行时机、代码复用性、可维护性** 和 **灵活性** 上。以下是分步说明: --- ### 1. **执行时机** - **直接初始化**:在声明成员变量时直接赋值(如 `private int x = 10;`)。 - 在对象创建时,**先于构造函数执行**。 - 无论调用哪个构造函数,直接初始化都会生效。 - **构造函数初始化**:在构造函数内部赋值(如 `public MyClass() { x = 10; }`)。 - 在构造函数被调用时执行。 - 可以通过不同构造函数实现不同的初始化逻辑。 #### 示例: ```java class Example { private int a = 5; // 直接初始化 private int b; public Example() { b = 10; // 构造函数初始化 } } ``` 对象创建流程: `a=5` → 执行构造函数 → `b=10`。 --- ### 2. **代码复用性** - **直接初始化**: - 适合所有构造函数共享的默认值。 - 避免在多个构造函数中重复相同代码。 - **构造函数初始化**: - 适合需要根据不同构造函数参数动态赋值的场景。 - 可为不同构造函数提供不同的初始化逻辑。 #### 示例: ```java class Car { private String type = "Sedan"; // 所有构造函数默认使用"Sedan" public Car() {} // type = "Sedan" public Car(String type) { this.type = type; // 覆盖默认值 } } ``` --- ### 3. **可维护性** - **直接初始化**: - 变量声明与初始化写在一起,便于阅读。 - 但当需要动态计算初始值时,可能不适用(如依赖构造函数参数)。 - **构造函数初始化**: - 允许基于参数或外部条件进行复杂逻辑计算。 - 适合需要异常处理的场景(构造函数可抛出异常)。 --- ### 4. **灵活性** - **直接初始化**的局限性: - 无法直接访问构造函数参数。 - 无法处理初始化时的异常(除非使用静态块)。 - **构造函数初始化**的优势: - 可结合参数动态赋值,例如: ```java class Student { private String name; public Student(String name) { if (name == null) throw new IllegalArgumentException(); this.name = name; } } ``` --- ### 总结对比表 | 特性 | 直接初始化 | 构造函数初始化 | |---------------------|-----------------------------------|----------------------------------| | 执行时机 | 先于构造函数执行 | 在构造函数内部执行 | | 默认值共享 | ✔️(适用于所有构造函数) | ❌(需在每个构造函数中重复) | | 动态依赖参数 | ❌ | ✔️(可通过参数动态赋值) | | 异常处理 | ❌(除非使用静态块) | ✔️(可在构造函数中抛出异常) | | 代码集中性 | ✔️(声明与初始化在一起) | ❌(分散在构造函数中) | --- ### 使用建议 - 如果成员变量有 **固定默认值**,优先用直接初始化。 - 如果初始化依赖 **参数、外部资源或复杂逻辑**,用构造函数初始化。 - 若需 **统一管理多个构造函数的公共初始化逻辑**,可结合两者使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mark_to_win

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值