今天看Thinking In Java,多态这一章,发现了一个以前纠结我很长时劲啊的错误,就是一个类编程对象,他到底是怎么一步步初始化的,今天这个谜底得意解开,下面开始正题。
这个主要解决,当一个构造器的内部调用正在够着的对象的某个动态绑定方法,那会发生什么情况?
如果要调用构造器内部的一个动态绑定方法,就要用到那个方法的被覆盖后的定义。然而,这个顶用的效果很难预料,因为被覆盖的方法在对象被完全构造之前就会调用。这一定会造成一些难以发现的错误。
请看示例代码
package com.bird.thinking;
class Glyph{//基类,注意它的构造函数,调用了draw()方法
void draw(){
System.out.println("Glyph.draw()");
}
Glyph(){
System.out.println("Glyph() before draw()");
draw();//Pay Attention To
System.out.println("Glyph() after draw()");
}
}
class RoundGlyph extends Glyph{//继承Glyph
private int radius = 1;
RoundGlyph(int r){
radius = r;
System.out.println("RoundGlyph.RoundGlyph(), radius = " + radius);//注意radius,输出数字
}
void draw(){
System.out.println("RoundGlyph.draw() radius = " + radius);
}
}
public class PolyConstructors {
public static void main(String [] args){
new RoundGlyph(5);//先初始化Glyph()的够着函数,再调用RoundGlyph的draw()方法
}
}
下面的为运行结果
Glyph() before draw()
RoundGlyph.draw() radius = 0
Glyph() after draw()
RoundGlyph.RoundGlyph(), radius = 5
仔细分析这段代码,可以发现
1.在其他任何事物发生之前,将分配给对象的存储空间初始化成二进制的零。
2.如前所述那样调用基类构造器,此时,调用被覆盖后的draw()方法(注意,要在调用RoundGlyph构造器之前调用),由于步骤1 的缘故,我们此时会发现radius的值为0
3.按照声明的顺序调用成员的初始化方法。
4调用导出类的构造器主体
这样有一个有点,至少保证所有的东西初始化为零,所以,这种编译器不抱错的错误,你不容易发现,以后为了避免,尽量的在构造器里面调用private方法!!!!
分享到:
相关推荐
Java中构造器内部的多态方法的行为实例分析是Java编程语言中一个非常重要的知识点,本文将详细介绍Java中构造器内部的多态方法的行为,结合实例形式分析了java构造器内部多态方法相关原理、功能及操作技巧。...
在Java中,多态主要通过继承和方法重写实现。 **3.2 方法重写** 方法重写允许子类重新定义父类的方法。这样,当一个对象被当作父类处理时,实际调用的是子类的方法实现。方法重写的规则包括: - 子类方法的签名...
在Java中,多态可以通过继承和方法覆盖来实现。 **特点:** - **方法覆盖实现多态:** 子类可以覆盖父类的方法,根据运行时的对象类型动态决定调用哪个方法。 - **接口实现多态:** 实现接口的多个类可以拥有相同的...
此外,Java还支持构造器,用于初始化对象的状态,以及getter和setter方法,实现数据的读取和修改。 **继承**是面向对象编程的另一个关键特性,它允许一个类(子类)从另一个类(父类)继承属性和行为。这有助于代码...
Java中的构造器与类名相同,没有返回类型,通常在创建对象时调用。 6. 抽象:抽象是指对一类事物的通用描述,不关注具体细节。在Java中,可以使用abstract关键字声明抽象类或抽象方法,它们不能被实例化,而是作为...
4. **构造器**:特殊的方法,用于初始化新创建的对象。 5. **getter和setter方法**:提供对类中数据的访问和修改的控制,防止直接暴露内部状态。 ### 二、继承 继承允许一个类(子类)继承另一个类(父类)的属性...
【接口与多态】在Java编程中,接口和多态是面向对象编程的重要概念,用于提升代码的灵活性和可扩展性。 **5.1 接口** 接口在Java中是一种完全抽象的类型,它定义了类的行为规范,不包含任何实现细节。接口允许类...
继承是Java中一个核心特性,它允许一个类(子类)继承另一个类(父类)的属性和方法。这样,子类不仅可以拥有自己的特定属性和行为,还可以共享父类的通用属性和行为。在Java中,使用`extends`关键字来声明继承关系...
Java中的多态主要体现在方法重写(Override)和方法重载(Overload)上,使得程序更具灵活性和扩展性。 5. **抽象类与接口**:抽象类不能被实例化,用于定义共同的属性和行为,供子类继承。接口则是一种完全抽象的...
在"第一章 类和对象.pdf"中,会详细介绍如何声明和创建类,包括类的构造器、成员变量和方法。 - **对象**:对象是类的实例,它们是程序运行时的实际参与者。对象通过调用类的方法来执行操作。 2. **对象和封装**:...
在Java中,类是封装的基本单位,通过私有(private)、受保护(protected)、公有(public)等访问修饰符来控制对类成员(字段和方法)的访问权限。封装的好处是可以保证对象的内部状态不被外界随意修改,从而保持...
- **局部内部类**:定义在方法、构造器或块中的类,其作用域仅限于该方法、构造器或块。 - **匿名内部类**:没有名称的内部类,通常用于快速实现接口或抽象类的一个简短的、一次性版本。 - **嵌套接口**:虽然...
“尚硅谷JAVA基础笔记”涵盖了Java语言的基础知识,包括语言概述、基本语法、面向对象概念、封装、继承和多态,以及一些关键概念如形参与实参、属性与局部变量、构造器、this关键字、包和MVC设计模式的使用。...
Java构造器(Constructor) 构造器是一种特殊的方法,在创建对象时自动执行。它与类名相同,并且不能有返回类型。 - 如果开发者没有显式创建一个构造器,编译器会提供一个默认构造器。 - 可以通过构造器重载...
10. 泛型:泛型是Java SE 5.0引入的新特性,它允许在类、接口和方法中使用类型参数,以增强代码的类型安全性和可读性。 11. 集合框架:Java集合框架包括接口(如List、Set、Map)和实现这些接口的类(如ArrayList、...
Java中的构造器名称必须与类名相同,且无返回类型。 6. 接口:接口是Java中的另一种抽象类型,它只包含常量和抽象方法。接口用于实现多继承和提供类型之间的契约。 7. 异常处理:Java提供了强大的异常处理机制,...
2. **继承**:子类继承父类的属性和方法,允许创建更复杂的类层次结构。使用`extends`关键字实现继承,如`class Son extends Father`。 3. **多态**:同一方法在不同对象上有不同的行为,这在Java中通过接口和抽象...
Java提供了默认的无参构造器,但当定义了带参数的构造器时,需要显式声明无参构造器。构造方法可以被重载,以满足不同初始化需求。 对象是类的实例,通过`new`运算符结合类的构造方法来创建。一旦创建,对象就可以...
10. 泛型:泛型是Java 5引入的新特性,允许在类、接口和方法中使用类型参数,提高代码的类型安全性和重用性。 以上只是Java面向对象编程的一部分核心知识点,实际的"Java核心卷轴1--pdf版"可能还包括更多内容,如...
Java提供了默认构造器和自定义构造器。 6. 接口: - 接口是完全抽象的类,只能包含常量和抽象方法。它用于定义一类对象的行为规范,实现了接口的类必须实现接口中的所有抽象方法。 7. 抽象类与抽象方法: - 抽象...