各位仁兄,前几日我在项目中写了类似这么一段代码
AbstractClass
package com.my.study;
public abstract class AbstractClass {
private final Object comm;
protected AbstractClass(Object comm) {
super();
this.comm = comm;
this.buidSelf();
this.buildChildren();
}
public Object comm(){
return this.comm;
}
protected abstract void buidSelf();
protected abstract void buildChildren();
}
TestClass
package com.my.study;
public class TestClass extends AbstractClass {
public TestClass(Object o) {
super(o);
}
@Override
protected void buidSelf() {
System.out.println("buildSelf");
}
@Override
protected void buildChildren() {
System.out.println("buildChildren");
}
public static void main(String g[]) {
new TestClass(new Object());
}
}
看看这代码 有什么问题呢?不管三七二十一,先跑跑看,结果如图
一切ok,没问题
但究竟有什么问题呢?请看以下代码
package com.my.study;
public class TestClass extends AbstractClass {
private Object a=null;
public TestClass(Object o) {
super(o);
}
public void run(){
System.out.println(a.toString());
}
@Override
protected void buidSelf() {
System.out.println("buildSelf");
}
@Override
protected void buildChildren() {
System.out.println("buildChildren");
a=new Object();
}
public static void main(String g[]) {
new TestClass(new Object()).run();
}
}
再运行一下,结果如下图
怎么回事,为啥会有exception?不是给它赋值了吗?Why?
可以明确的告诉你,如果在定义a的时候没有给赋值null,这个异常是不会出现滴。
这...java 究竟是如何加载对象的?
就拿此例说明吧,在java new 一个对象的时候,首先声明了自己的所有成员变量,所有成员变量都是null,然后去构造父类,在构造父类的时候我们这里调用了子类的钩子方法,给a赋值为 new object(),父类构造完成之后回到子类构造函数,执行子类构造的内容,此时会检查你在声明成员变量时候有没有给它初始值,有的话就会去执行赋值语句,有异常的代码相当于在声明与赋值之间执行了父类的构造函数。最终a变成了null。
经此解释你是否明白为啥了么?呵呵,不明白就自己去debug一下 就海阔天空了:)
由此忠告自己以及各位看客:务必不要在构造函数中调用多态。如果你非要这么写那就请不要在调用的方法中使用子类的成员变量
- 大小: 4.3 KB
- 大小: 11.1 KB
分享到:
相关推荐
### C++构造和析构中的多态实现 在C++编程语言中,多态是一种重要的特性,它允许程序员编写能够处理不同数据类型的代码。多态的实现通常依赖于虚函数和虚函数表(vtable)。然而,在构造函数和析构函数中调用虚函数...
Java中构造器内部的多态方法的行为实例分析是Java编程语言中一个非常重要的知识点,本文将详细介绍Java中构造器内部的多态方法的行为,结合实例形式分析了java构造器内部多态方法相关原理、功能及操作技巧。...
多态在构造方法中的体现较少,但重要的是理解,尽管构造方法不能被重写,它们可以被子类覆盖以初始化特定状态,从而支持更复杂的构造逻辑。 #### 六、利用继承设计:纯粹继承与扩展 继承不仅是代码重用的一种手段...
本章主要讲解 Java 语言程序设计中接口和多态的概念、语法和应用。接口是 Java 语言中的一种抽象机制,它提供了一种定义类之间的“协议”的方式,允许类之间实现多继承,同时免除 C++ 中的多继承那样的复杂性。同时...
Java语言中多态的概述 Java语言中的多态性是面向对象编程的三个重要特征之一。方法的重载和方法的重写都是Java多态性的表现形式。多态性使得Java语言在实际应用中变得更加灵活和强大。本文将从多态的概念和多态的...
在面向对象程序设计语言中,接口的多种不同的实现方式即为多态。 PHP 是一种弱类型的编程语言,其变量的使用无需先声明,即不必指明变量的数据类型。故在子类指向父类的引用时亦无需声明对象的数据类型。这使得 ...
Java语言中的覆盖(Override)和重载(Overload)以及多态(Polymorphism)是面向对象编程的重要概念,它们是实现代码复用和灵活性的关键。 **多态性(Polymorphism)** 多态性是Java中一种允许一个接口有多种实现的方式。...
在深入理解和运用Java中的多态机制时,我们需要仔细研究类的继承结构,理解如何通过接口实现多态,掌握方法重写在实现多态中的作用,以及了解类型擦除和泛型编程在Java中的应用。通过实践和对文档内容的深入挖掘,...
在C#编程语言中,继承、封装和多态是面向对象编程(OOP)的三大核心概念。这些特性使得代码更加灵活、可复用且易于维护。下面将通过一个具体的示例来阐述这三个概念。 首先,让我们理解一下这三个概念的基本含义: ...
在 Java 中,构造方法与多态有关。构造方法是类的特殊方法,用于初始化对象的状态。构造方法可以是多态的,通过方法覆盖实现。 内部类是 Java 中的一种机制,它允许在一个类中定义另一个类。内部类可以访问外部类的...
"Java语言继承中多态的机理分析" Java语言继承中多态的机理分析是面向对象程序设计的主要特征之一。在Java语言中,继承是指一个类继承另一个类的所有非私有成员变量和方法,并添加自己特有的成员变量和方法,从而...
多态是面向对象编程语言中的一个核心特性,它允许程序员能够使用基类的指针或引用指向派生类的对象,并在运行时根据对象的实际类型来选择合适的方法进行调用。这一特性增强了程序的灵活性和可扩展性。本文将对比分析...
多态机制是面向对象编程中的一个核心概念,它允许不同类型的对象对同一消息做出不同的响应。在本实验报告中,我们将深入探讨如何在C++中实现多态,并通过设计有理数类(rational_number)及其操作来演示这一机制。 ...
本文将深入探讨“多态简单工厂”这一主题,结合北大青鸟的C#.NET讲堂内容,详细解析多态的概念、简单工厂模式的原理以及如何在C#中实现它们。 首先,多态(Polymorphism)是指同一种行为或操作可以有不同的表现形式...
通过对多态密码机制进行改进,特别是提出了一种新的构造盒方法,结合网络数据包字节数构造强单向函数,不仅提升了机制的安全性,还使其更加适用于网络通信环境中的会话密钥生成。这一改进为多态密码机制在网络安全...
本PPT教案主要讲解了Java中的继承和多态机制,包括继承、里式代换原则、多态和动态绑定、方法重载、重载构造函数和方法覆盖等概念。 继承是面向对象编程的基本机制之一,允许一个类继承另一个类的成员变量和方法。...
5. 构造器的多态:虽然构造器不能被继承,但是子类可以通过super关键字调用父类的构造器,实现不同子类在初始化阶段的不同行为。 6. 接口与多态:接口是实现多态的一种重要手段,它定义了一组方法,任何实现该接口...
通过以上对封装、继承、覆盖、构造过程、多态以及 `static`、`this`、`super` 和 `final` 关键字的详细介绍,我们可以更好地理解和运用Java的核心概念和技术点,从而编写出更加高效、灵活和易于维护的代码。
在Java编程语言中,继承和多态是面向对象编程的核心概念。它们允许代码复用、扩展功能以及实现灵活的设计。 1. **继承**: 继承是Java中类之间的一种关系,其中一个类(子类)可以从另一个类(父类)继承属性和...
在C++编程语言中,封装、继承和多态是面向对象编程(OOP)的三大核心概念。下面将深入解析这三个关键概念,并结合"cppgood"这个可能包含示例代码的压缩包,来阐述它们在实际编程中的应用。 **封装** 是面向对象编程...