我们知道,动态绑定的调用是在运行时才决定的,对象无法知道到底调用的是哪个类的方法。
当我们在构造器中调用动态绑定的方法,就会用到该方法被覆盖之后的定义。但是这种调用的效果难以预计,因为被覆盖的方法在对象被完全构造之前就会被调用。我们先来看看下面这段代码:
class Base{
private String name = "base";
Base(){
tellName();
printName(name);
}
public void tellName(){
System.out.println("tellFather "+ name);
}
public void printName(String name){
System.out.println("printFather "+ name);
}
}
class Drived extends Base{
private String name = "Drived";
Drived(){
tellName();
printName(name);
}
public void tellName(){
System.out.println("tellChild "+ name);
}
public void printName(String name){
System.out.println("printChild "+ name);
}
}
public class TestObject {
public static void main(String args[]){
new Drived();
}
}
从代码中可以看出,子类Derived覆盖了父类Base的方法。当我们实例化一个Derived对象的时候,会自动调用父类的构造器,而父类构造器中却调用了动态绑定方法
tellName();
这样一来,在父类构造器中就会调用子类的tellChild()方法。此时父类Base已完成初始化。。由于此时子类Derived还没有完成初始化,其实例变量name为默认为null。然后父类构造器退出,回到子类构造器调用处,然后完成子类初始化,接下来子类构造器调用完成。
代码的运行结果如下;
tellChild null
printChild base
tellChild Drived
printChild Drived
实际的初始化过程应该是这样的:
1. 在其他任何事物发生之前,将分配给对象的存储空间初始化为二进制的零。
2. 如上文一般,调用父类构造器,在父类构造器中会调用被子类覆盖的方法(如果有在构造器中调用了动态绑定的方法)。
3. 按照声明的顺序调用成员的初始化方法。
4. 调用子类的构造器。
从上例可以看出,在构造器中能安全调用的方法是不能被继承的,即该方法被final修饰,或者方法是private的(private方法自动属于是final的,嘿嘿)。
- 大小: 230.7 KB
分享到:
相关推荐
Java中构造器内部的多态方法的行为实例分析是Java编程语言中一个非常重要的知识点,本文将详细介绍Java中构造器内部的多态方法的行为,结合实例形式分析了java构造器内部多态方法相关原理、功能及操作技巧。...
在Java中,多态主要通过继承和方法重写实现。 **3.2 方法重写** 方法重写允许子类重新定义父类的方法。这样,当一个对象被当作父类处理时,实际调用的是子类的方法实现。方法重写的规则包括: - 子类方法的签名...
在Java中,多态可以通过继承和方法覆盖来实现。 **特点:** - **方法覆盖实现多态:** 子类可以覆盖父类的方法,根据运行时的对象类型动态决定调用哪个方法。 - **接口实现多态:** 实现接口的多个类可以拥有相同的...
子类构造器的第一行通常是`super(parameters)`,用于调用特定的父类构造器。 8. **访问父类的私有成员**: 虽然父类的私有成员不能直接在子类中访问,但可以通过友元类(friend class)或者使用内部类等方式实现...
- 私有类 `Base` 的实例化会在 `Pri` 类的实例化过程中进行,但由于 `Base` 中的 `i` 是局部变量,它的输出只会在 `Base` 构造器内部显示。而 `Pri` 类的静态变量 `i` 在类加载时初始化,所以输出只有 `200`,答案...
此外,Java还支持构造器,用于初始化对象的状态,以及getter和setter方法,实现数据的读取和修改。 **继承**是面向对象编程的另一个关键特性,它允许一个类(子类)从另一个类(父类)继承属性和行为。这有助于代码...
5. 构造器:构造器是一种特殊的方法,用于初始化新创建的对象。Java中的构造器与类名相同,没有返回类型,通常在创建对象时调用。 6. 抽象:抽象是指对一类事物的通用描述,不关注具体细节。在Java中,可以使用...
构造方法不参与多态,因为它们是类的实例化过程的一部分,与具体的类紧密相关。但是,构造方法可以在子类中被重写以满足特定的初始化需求。 **5.6 内部类** 内部类是Java中一种特殊的形式,它在一个类的内部定义。...
子类构造器可以通过`super`关键字调用父类的构造函数,确保初始化过程正确进行。 6. **内部类与匿名类** 内部类是定义在另一个类内部的类,可以是静态的或非静态的。非静态内部类可以访问外部类的所有成员,包括...
6. **构造器**:构造器是用于初始化新创建对象的特殊方法,它的名字与类名相同,没有返回类型。构造器在创建对象时自动调用,确保对象的初始状态正确。 7. **访问控制与权限修饰符**:Java有四种访问级别,分别是...
- **局部内部类**:定义在方法、构造器或块中的类,其作用域仅限于该方法、构造器或块。 - **匿名内部类**:没有名称的内部类,通常用于快速实现接口或抽象类的一个简短的、一次性版本。 - **嵌套接口**:虽然...
2. **局部内部类**:局部内部类定义在方法、构造器或块的内部,它们的作用域仅限于该方法、构造器或块。由于其局限性,它们常用于实现匿名类,尤其是当需要实现一个接口但只需要用一次时。 3. **匿名内部类**:匿名...
4. **构造器**:特殊的方法,用于初始化新创建的对象。 5. **getter和setter方法**:提供对类中数据的访问和修改的控制,防止直接暴露内部状态。 ### 二、继承 继承允许一个类(子类)继承另一个类(父类)的属性...
面向对象是Java的核心特性,主要包括类、对象、属性、方法、构造器、代码块和内部类。类是对象的模板,它包含属性(成员变量)和方法。属性是对象的状态,方法是对象的行为。构造器用于初始化新创建的对象,代码块...
构造器是一种特殊的方法,用于初始化对象,可以带有参数(有参构造)也可以不带参数(无参构造)。在Java中,静态方法属于类,非静态方法属于对象,静态方法可以直接通过类名调用,而非静态方法需要先创建类的实例后...
Java面试宝典是Java开发者面试的必备知识点总结,涵盖了Java基础知识、Java面向对象编程、Java多态、Java继承、Java接口、Java抽象类、Java内部类、Java静态变量、Java构造器、Java重载和覆盖等方面。 Java基础知识...
listConstructors.java 利用反射机制获取构造器列表 listFields.java 利用反射机制获取成员属性列表 listMethods.java 利用反射机制获取成员方法列表 loadClass.java 动态装载一个类 Shape.java 一个用于测试的...
3. **局部内部类**:局部内部类定义在方法、构造器或代码块内部,它的作用域仅限于该方法、构造器或代码块。这种类型的内部类只能访问包含它的方法或代码块中的局部变量,但必须是final的。 4. **嵌套接口**:虽然...
Java构造器(Constructor) 构造器是一种特殊的方法,在创建对象时自动执行。它与类名相同,并且不能有返回类型。 - 如果开发者没有显式创建一个构造器,编译器会提供一个默认构造器。 - 可以通过构造器重载...
为了实现面向对象编程,我们还需要了解构造器、抽象方法、接口、访问控制、重载和重写等概念。 构造器用于初始化新创建的对象,比如`public MyClass(int value) {...}`。抽象方法没有实现,仅在抽象类中声明,由...