`
yaoweinan
  • 浏览: 137522 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

构造中的多态

    博客分类:
  • j2se
 
阅读更多

各位仁兄,前几日我在项目中写了类似这么一段代码

 

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++构造和析构中的多态实现 在C++编程语言中,多态是一种重要的特性,它允许程序员编写能够处理不同数据类型的代码。多态的实现通常依赖于虚函数和虚函数表(vtable)。然而,在构造函数和析构函数中调用虚函数...

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

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

    java 多态 经典讲解

    多态在构造方法中的体现较少,但重要的是理解,尽管构造方法不能被重写,它们可以被子类覆盖以初始化特定状态,从而支持更复杂的构造逻辑。 #### 六、利用继承设计:纯粹继承与扩展 继承不仅是代码重用的一种手段...

    Java 语言程序设计:第5章接口多态.ppt

    本章主要讲解 Java 语言程序设计中接口和多态的概念、语法和应用。接口是 Java 语言中的一种抽象机制,它提供了一种定义类之间的“协议”的方式,允许类之间实现多继承,同时免除 C++ 中的多继承那样的复杂性。同时...

    Java语言中多态的概述.pdf

    Java语言中多态的概述 Java语言中的多态性是面向对象编程的三个重要特征之一。方法的重载和方法的重写都是Java多态性的表现形式。多态性使得Java语言在实际应用中变得更加灵活和强大。本文将从多态的概念和多态的...

    PHP中多态的实现.pdf

    在面向对象程序设计语言中,接口的多种不同的实现方式即为多态。 PHP 是一种弱类型的编程语言,其变量的使用无需先声明,即不必指明变量的数据类型。故在子类指向父类的引用时亦无需声明对象的数据类型。这使得 ...

    Java语言中的 覆盖重载和多态

    Java语言中的覆盖(Override)和重载(Overload)以及多态(Polymorphism)是面向对象编程的重要概念,它们是实现代码复用和灵活性的关键。 **多态性(Polymorphism)** 多态性是Java中一种允许一个接口有多种实现的方式。...

    深入Java核心Java中多态的实现机制.pdf

    在深入理解和运用Java中的多态机制时,我们需要仔细研究类的继承结构,理解如何通过接口实现多态,掌握方法重写在实现多态中的作用,以及了解类型擦除和泛型编程在Java中的应用。通过实践和对文档内容的深入挖掘,...

    用一个示例来说明C#中的继承、封装和多态

    在C#编程语言中,继承、封装和多态是面向对象编程(OOP)的三大核心概念。这些特性使得代码更加灵活、可复用且易于维护。下面将通过一个具体的示例来阐述这三个概念。 首先,让我们理解一下这三个概念的基本含义: ...

    第5章(接口与多态).ppt

    在 Java 中,构造方法与多态有关。构造方法是类的特殊方法,用于初始化对象的状态。构造方法可以是多态的,通过方法覆盖实现。 内部类是 Java 中的一种机制,它允许在一个类中定义另一个类。内部类可以访问外部类的...

    Java语言继承中多态的机理分析.pdf

    "Java语言继承中多态的机理分析" Java语言继承中多态的机理分析是面向对象程序设计的主要特征之一。在Java语言中,继承是指一个类继承另一个类的所有非私有成员变量和方法,并添加自己特有的成员变量和方法,从而...

    C++和Java多态的区别

    多态是面向对象编程语言中的一个核心特性,它允许程序员能够使用基类的指针或引用指向派生类的对象,并在运行时根据对象的实际类型来选择合适的方法进行调用。这一特性增强了程序的灵活性和可扩展性。本文将对比分析...

    多态机制 面向对象 实验报告

    多态机制是面向对象编程中的一个核心概念,它允许不同类型的对象对同一消息做出不同的响应。在本实验报告中,我们将深入探讨如何在C++中实现多态,并通过设计有理数类(rational_number)及其操作来演示这一机制。 ...

    多态简单工厂

    本文将深入探讨“多态简单工厂”这一主题,结合北大青鸟的C#.NET讲堂内容,详细解析多态的概念、简单工厂模式的原理以及如何在C#中实现它们。 首先,多态(Polymorphism)是指同一种行为或操作可以有不同的表现形式...

    多态密码机制的改进及其严格雪崩特性分析

    通过对多态密码机制进行改进,特别是提出了一种新的构造盒方法,结合网络数据包字节数构造强单向函数,不仅提升了机制的安全性,还使其更加适用于网络通信环境中的会话密钥生成。这一改进为多态密码机制在网络安全...

    java继承和多态PPT教案学习.pptx

    本PPT教案主要讲解了Java中的继承和多态机制,包括继承、里式代换原则、多态和动态绑定、方法重载、重载构造函数和方法覆盖等概念。 继承是面向对象编程的基本机制之一,允许一个类继承另一个类的成员变量和方法。...

    北大青鸟javaOOP多态Ch03作业全集.rar

    5. 构造器的多态:虽然构造器不能被继承,但是子类可以通过super关键字调用父类的构造器,实现不同子类在初始化阶段的不同行为。 6. 接口与多态:接口是实现多态的一种重要手段,它定义了一组方法,任何实现该接口...

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

    通过以上对封装、继承、覆盖、构造过程、多态以及 `static`、`this`、`super` 和 `final` 关键字的详细介绍,我们可以更好地理解和运用Java的核心概念和技术点,从而编写出更加高效、灵活和易于维护的代码。

    java中的继承与多态

    在Java编程语言中,继承和多态是面向对象编程的核心概念。它们允许代码复用、扩展功能以及实现灵活的设计。 1. **继承**: 继承是Java中类之间的一种关系,其中一个类(子类)可以从另一个类(父类)继承属性和...

    c++ 的封装继承多态例子

    在C++编程语言中,封装、继承和多态是面向对象编程(OOP)的三大核心概念。下面将深入解析这三个关键概念,并结合"cppgood"这个可能包含示例代码的压缩包,来阐述它们在实际编程中的应用。 **封装** 是面向对象编程...

Global site tag (gtag.js) - Google Analytics