`
得小白者天下得
  • 浏览: 8282 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

java构造器内部的多态方法

    博客分类:
  • java
阅读更多
  我们知道,动态绑定的调用是在运行时才决定的,对象无法知道到底调用的是哪个类的方法。
  当我们在构造器中调用动态绑定的方法,就会用到该方法被覆盖之后的定义。但是这种调用的效果难以预计,因为被覆盖的方法在对象被完全构造之前就会被调用。我们先来看看下面这段代码:
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
0
0
分享到:
评论

相关推荐

    Java中构造器内部的多态方法的行为实例分析

    Java中构造器内部的多态方法的行为实例分析是Java编程语言中一个非常重要的知识点,本文将详细介绍Java中构造器内部的多态方法的行为,结合实例形式分析了java构造器内部多态方法相关原理、功能及操作技巧。...

    java继承与多态

    在Java中,多态主要通过继承和方法重写实现。 **3.2 方法重写** 方法重写允许子类重新定义父类的方法。这样,当一个对象被当作父类处理时,实际调用的是子类的方法实现。方法重写的规则包括: - 子类方法的签名...

    java---- 封装,接口,继承,覆盖,构造过程,多态,static、this、super、final用法

    在Java中,多态可以通过继承和方法覆盖来实现。 **特点:** - **方法覆盖实现多态:** 子类可以覆盖父类的方法,根据运行时的对象类型动态决定调用哪个方法。 - **接口实现多态:** 实现接口的多个类可以拥有相同的...

    继承和多态的相关Java源码下载

    子类构造器的第一行通常是`super(parameters)`,用于调用特定的父类构造器。 8. **访问父类的私有成员**: 虽然父类的私有成员不能直接在子类中访问,但可以通过友元类(friend class)或者使用内部类等方式实现...

    JAVA基础第章继承与多态练习题.docx

    - 私有类 `Base` 的实例化会在 `Pri` 类的实例化过程中进行,但由于 `Base` 中的 `i` 是局部变量,它的输出只会在 `Base` 构造器内部显示。而 `Pri` 类的静态变量 `i` 在类加载时初始化,所以输出只有 `200`,答案...

    java 三大特性--封装、继承和多态理解

    此外,Java还支持构造器,用于初始化对象的状态,以及getter和setter方法,实现数据的读取和修改。 **继承**是面向对象编程的另一个关键特性,它允许一个类(子类)从另一个类(父类)继承属性和行为。这有助于代码...

    ACCP 5.0 S2_使用JAVA实现面向对象编程

    5. 构造器:构造器是一种特殊的方法,用于初始化新创建的对象。Java中的构造器与类名相同,没有返回类型,通常在创建对象时调用。 6. 抽象:抽象是指对一类事物的通用描述,不关注具体细节。在Java中,可以使用...

    Java学习课件第5章接口与多态.ppt

    构造方法不参与多态,因为它们是类的实例化过程的一部分,与具体的类紧密相关。但是,构造方法可以在子类中被重写以满足特定的初始化需求。 **5.6 内部类** 内部类是Java中一种特殊的形式,它在一个类的内部定义。...

    java程序设计-第5章-继承、多态、重载与接口

    子类构造器可以通过`super`关键字调用父类的构造函数,确保初始化过程正确进行。 6. **内部类与匿名类** 内部类是定义在另一个类内部的类,可以是静态的或非静态的。非静态内部类可以访问外部类的所有成员,包括...

    ACCP5.0 S2 javaoop理论及上机答案

    6. **构造器**:构造器是用于初始化新创建对象的特殊方法,它的名字与类名相同,没有返回类型。构造器在创建对象时自动调用,确保对象的初始状态正确。 7. **访问控制与权限修饰符**:Java有四种访问级别,分别是...

    有关JAVA的内部类的好东西

    - **局部内部类**:定义在方法、构造器或块中的类,其作用域仅限于该方法、构造器或块。 - **匿名内部类**:没有名称的内部类,通常用于快速实现接口或抽象类的一个简短的、一次性版本。 - **嵌套接口**:虽然...

    JAVA_12内部类

    2. **局部内部类**:局部内部类定义在方法、构造器或块的内部,它们的作用域仅限于该方法、构造器或块。由于其局限性,它们常用于实现匿名类,尤其是当需要实现一个接口但只需要用一次时。 3. **匿名内部类**:匿名...

    JAVA语言程序设计-第七章 类的封装、多态和继承

    4. **构造器**:特殊的方法,用于初始化新创建的对象。 5. **getter和setter方法**:提供对类中数据的访问和修改的控制,防止直接暴露内部状态。 ### 二、继承 继承允许一个类(子类)继承另一个类(父类)的属性...

    尚硅谷JAVA基础笔记吐血整理

    面向对象是Java的核心特性,主要包括类、对象、属性、方法、构造器、代码块和内部类。类是对象的模板,它包含属性(成员变量)和方法。属性是对象的状态,方法是对象的行为。构造器用于初始化新创建的对象,代码块...

    面向对象编程(Java).pdf

    构造器是一种特殊的方法,用于初始化对象,可以带有参数(有参构造)也可以不带参数(无参构造)。在Java中,静态方法属于类,非静态方法属于对象,静态方法可以直接通过类名调用,而非静态方法需要先创建类的实例后...

    Java面试宝典 Java面试宝典

    Java面试宝典是Java开发者面试的必备知识点总结,涵盖了Java基础知识、Java面向对象编程、Java多态、Java继承、Java接口、Java抽象类、Java内部类、Java静态变量、Java构造器、Java重载和覆盖等方面。 Java基础知识...

    Java开发技术大全(500个源代码).

    listConstructors.java 利用反射机制获取构造器列表 listFields.java 利用反射机制获取成员属性列表 listMethods.java 利用反射机制获取成员方法列表 loadClass.java 动态装载一个类 Shape.java 一个用于测试的...

    java内部类学习资料

    3. **局部内部类**:局部内部类定义在方法、构造器或代码块内部,它的作用域仅限于该方法、构造器或代码块。这种类型的内部类只能访问包含它的方法或代码块中的局部变量,但必须是final的。 4. **嵌套接口**:虽然...

    有关于JAVA的一些PPT

    Java构造器(Constructor) 构造器是一种特殊的方法,在创建对象时自动执行。它与类名相同,并且不能有返回类型。 - 如果开发者没有显式创建一个构造器,编译器会提供一个默认构造器。 - 可以通过构造器重载...

    java-数组与方法及面向对象基础

    为了实现面向对象编程,我们还需要了解构造器、抽象方法、接口、访问控制、重载和重写等概念。 构造器用于初始化新创建的对象,比如`public MyClass(int value) {...}`。抽象方法没有实现,仅在抽象类中声明,由...

Global site tag (gtag.js) - Google Analytics