class Pa { String color="黑白"; public Pa() { System.out.println("Pa"+"@"+Test.NUM++); print(); } public void print(){ System.out.println(color+"@"+Test.NUM++); } } class Son extends Pa{ String color = "彩色"; String toy = "我有弹弓"; public Son() { System.out.println("Son"+"@"+Test.NUM++); } public void print(){ System.out.println(toy+"@"+color+"@"+Test.NUM++); } } /** * */ public class Test{ public static int NUM = 0; public static void main(String[] args) { new Son(); // new Pa(); } }
* 父类Pa构造方法中调用了print(),而子类Son也重写了print();
* 在new Son()初始化的过程中,子类的成员color和toy都尚未完成赋值,
* 但是:还是会将方法动态绑定到子类的print()
* 这点值得注意,现实中很可能因此出现bug。切记!
这是程序输出:
Pa@0 null@null@1 Son@2
相关推荐
- **调用父类构造器**:最重要的是,`super`可以用于在子类构造器中调用父类的构造器。这对于初始化父类的状态非常有用。 - **追溯父类**:`super`不仅可以用于直接父类,还可以追溯到更远的祖先类。 **2. 调用父类...
2. **构造器与初始化**:子类对象在创建时会先调用父类的构造器,确保父类的状态得到正确初始化,然后执行子类自己的构造逻辑。 3. **变量隐藏**:如果子类和父类有同名的实例变量,子类变量会“隐藏”父类变量。...
综上所述,程序执行顺序的基本原则是:首先初始化并执行父类的构造器、静态和实例初始化块,然后执行子类的构造器、实例初始化块。最后,当通过子类对象调用方法时,优先执行子类覆盖的方法。理解这一顺序对于编写可...
以下我们将详细探讨构造器的调用、初始化成员变量、默认构造器以及继承中的构造器调用。 1. **构造器的调用**: - 当我们创建一个类的实例时,会自动调用构造器来设置初始状态。例如: ```java class MyClass { ...
子类可以通过`super`关键字调用父类的构造函数,确保初始化时父类的属性得到正确的设置。 总结一下,子类调用抽象父类涉及到以下主要知识点: 1. **抽象类**:不能被实例化,含有抽象方法。 2. **抽象方法**:只有...
这是因为子类继承了父类的属性和方法,所以在创建子类对象时,必须确保父类的数据成员被正确初始化。这是通过隐式调用super()来实现的,super()是子类构造器中调用父类无参构造器的语法。如果父类没有无参构造器,...
在父类中定义构造器,子类可以通过`super`关键字调用,以确保父类的初始化逻辑得以执行。例如,子类的构造器可能会这样写:`public Student(String name) { super(name); }`,这里`super(name)`调用了父类的构造器。...
举个例子,如果我们有一个名为`Animal`的父类和一个名为`Dog`的子类,`Animal`有一个`sound()`方法,`Dog`重写这个方法,那么创建`Dog`的实例时,调用`sound()`会执行`Dog`的实现,而不是`Animal`的。 总之,Java类...
4. **父类的非静态实例初始化**:在调用子类构造器之前,父类的实例变量会被初始化。在这个例子中,`Art`类的构造器`Art()`被调用,打印出"Art"。注意,这是在`Cartoon`的构造器开始执行之前发生的,即使`Art`的构造...
5. **父类的用户定义构造器**:如果在子类构造器中指定了父类的特定构造器,那么该构造器会被调用,执行其相应代码。 6. **子类的非静态初始化块**:接下来,子类的非静态初始化块被执行,用于初始化子类的实例变量...
`Son`类的非静态属性`b4`、非静态块以及`b5`的初始化按顺序进行,然后调用子类构造器`TestTest 类的构造器`。 6. **子类构造器**: - **子类构造器**:子类构造器负责设置子类的非静态属性初始值,如果在子类构造...
- **super调用构造器**:子类的构造器可以使用`super(参数列表)`来调用父类的构造器,初始化父类的状态。 举例1:在`Person`类中定义了`eat()`和`sleep()`方法,`Student`类继承`Person`并重写了这两个方法。在`...
当创建子类对象时,会先调用父类的构造器来初始化父类部分,然后执行子类的构造器。如果子类没有显式调用父类构造器,Java会默认调用无参构造器。如果父类没有无参构造器,则子类必须显式调用一个合适的父类构造器。...
当创建对象时,构造器会被调用来初始化对象的属性。 ```java public class Parent { public Parent() { System.out.println("Parent constructor"); } } ``` ### 继承中的调用顺序 在Java继承体系中,子类会...
需要注意的是,如果父类中有参数化的构造器,而在子类中没有显式调用它,Java会自动添加一个`super()`调用来确保父类的构造器被调用。此外,静态成员不会因为创建类的实例而重新初始化,它们只在类加载时初始化一次...
2. **类成员变量初始化**:在所有父类构造器执行完毕后,接着会初始化枚举类自身的成员变量。这些变量包括在枚举声明中定义的任何字段。成员变量的初始化按照它们在代码中的顺序进行。 3. **子类构造器**:最后,...
子类构造器在执行时,首先会调用父类的构造器来初始化父类的状态,然后才进行子类自身的初始化。 - `super`关键字通常用在子类构造器的第一行,以确保父类的构造器先被调用。 6. **访问限制** - `super`关键字...
C#也支持这种方法,但它还引入了一种称为“构造函数重定向”或“构造函数初始化器”的特性,这使得可以通过一个构造器调用另一个构造器,从而避免代码重复。 C++中的构造器可以是虚函数,而C#的构造器则不能。在C++...
2. **实例变量和初始化块**:当创建子类对象时,先执行父类的实例变量初始化和初始化块,接着执行子类的实例变量初始化和初始化块。这是因为在创建子类对象时,首先会创建父类的部分,然后再创建子类的部分。 3. **...