`
天使的左手
  • 浏览: 55663 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

java 继承 多态

    博客分类:
  • java
阅读更多
/**
运行结果:
A's constructor
com.polymorphism.C
com.polymorphism.C
Class A
null
----------------------
B's constructor
com.polymorphism.C
com.polymorphism.C
Class B
null
----------------------
C's constructor
com.polymorphism.C
com.polymorphism.C
Class C
Class C
----------------------

执行过程分析(省略Object):
1)在方法区中查找TestPoly类型信息,如果不存在,通过类加载器将TestPoly.class载入内存,
将类型信息存储到方法区中
2)将main方法入栈,开始执行main方法里面的内容
3)执行new C(),因为C从B继承,B从A继承,所以先加载A字节码,执行静态初始化和静态代码块,
将类型信息存储到方法区,接着加载B,加载A,之后根据C的类型信息计算出需要的内存大小,
为C分配堆内存空间,执行C中各成员变量默认初始化操作.调用C的构造方法,在C的构造方法中如果没有
手动指定super(参数),编译器会默认为我们加入super()来调用父类构造方法.因此会依次执行A中的
成员初始化,成员代码块,构造函数中的语句,B和C依此类推,最终完成C的初始化操作,并返回C对象的引用
此时堆中只存在C类型的对象,不会存在A,B类型的对象,不过C类型的对象中包含了A,B类型中的成员变量
C在初始化之前,已经调用了A,B的构造方法执行了父类属性的初始化操作.
 */
public class TestPoly
{
    public static void main(String[] args)
    {
	new C();
    }
}

class A
{
    private String data = "Class A";

    A()
    {
	System.out.println("A's constructor");
	//getClass方法来自Object,方法签名是final的,不能被子类覆写
	//所以不管通过super还是this调用,最终调用的都是Object中的方法
	//返回的都是代表当前对象的类型
	System.out.println(this.getClass().getName());
	System.out.println(super.getClass().getName());
	//属性不存在多态,都是静态绑定的
	//此处的类型为A 可以理解为((A)this).data
	System.out.println(this.data);
	//getData在子类B和C中都被覆写了,此处调用的是C中的getData
	//而此时C中的data只是执行了默认初始化,所以输出为null
	System.out.println(getData());
	System.out.println("----------------------");
    }

    public String getData()
    {
	return data;
    }
}

class B extends A
{
    private String data = "Class B";

    B()
    {
	System.out.println("B's constructor");
	System.out.println(this.getClass().getName());
	System.out.println(super.getClass().getName());
	System.out.println(this.data);
	System.out.println(getData());
	System.out.println("----------------------");
    }

    public String getData()
    {
	return data;
    }
}

class C extends B
{
    private String data = "Class C";

    C()
    {
	System.out.println("C's constructor");
	System.out.println(this.getClass().getName());
	System.out.println(super.getClass().getName());
	System.out.println(this.data);
	System.out.println(getData());
	System.out.println("----------------------");
    }

    public String getData()
    {
	return data;
    }
}

public class TestPoly2
{
    public static void main(String[] args)
    {
	Derived sub = new Derived();
	// 输出1
	// sub先在自己的堆空间中查找自己定义的方法签名,
	// 没找到再去父类型中查找,在Base中找到了show,方法的this类型为Base
	// 如果此时去掉Derived中show的注释,则打印出2
	sub.show();
	
	//true
	//this指向当前对象的当前对象类型引用
	//super指向当前对象的当前对象父类型引用
	System.out.println(sub == sub.getSuper());
    }
}

class Base
{
    public int i = 1;

    public void show()
    {
	System.out.println(i);
    }
    
    public Base getThis() {
	return this;
    }
}

class Derived extends Base
{
    public int i = 2;

//     public void show()
//    {
//	System.out.println(i);
//    }
    
    public Base getSuper() {
	return super.getThis();
    }
}
分享到:
评论

相关推荐

    Java 继承 多态方面的实例源码.rar

    Java 继承 多态方面的实例源码,内容方面涉及对象类Object和它的toString()方法、多态性、动态绑定和一般程序设计、数组线性表ArrayList类、final类、方法和变量、数据域和静态方法的隐藏等。。。

    java继承和多态ppt

    java 继承和多态PPT教程

    java继承多态

    理解继承如何增强软件的可重用性 超类(父类)和子类

    封装继承多态总结

    封装继承多态总结

    封装、继承、多态.docx

    封装、继承、多态 一、 封装 封装是面向对象编程的三大特性之一,它是指将同一类事物的特性与功能包装在一起,对外暴露调用的接口...Java 面向对象的三大特性是:封装、继承与多态。这三大特性是面向对象编程的核心。

    java基础 继承和多态实例

    //练习: //1.做一个教师类Teacher,有属性:1.教师号,2教师姓名, //3教师工资(基本工资,课时费,课时数)。 //有方法:1.输出教师所有信息,2.... //2....//(1)该类有以下属性:学校编号:schId, ...

    Educoder题目:Java面向对象 - 封装、继承和多态的综合练习答案解析.md

    Educoder题目:Java面向对象 - 封装、继承和多态的综合练习答案解析

    java继承与多态教学及练习

    1继承的概念 2继承的实现 3变量隐藏与方法覆盖 4super关键字 5 子类的构造顺序 6Object类 7 final关键字

    java中继承与多态的题目

    Java 中继承与多态的题目 本资源摘要信息是关于 Java 中继承和多态的题目,涵盖了面向对象编程的基本概念和继承机制的应用。 继承的概念 继承是面向对象编程的一种机制,允许一个类(子类)继承另一个类(父类)...

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

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

    Educoder题目:Java面向对象 - 封装、继承和多态答案解析.md

    Educoder题目:Java面向对象 - 封装、继承和多态答案解析

    java封装 继承与多态

    java封装 继承与多态 程序设计 类与对象

    java 接口 类 继承 多态的简单实例

    Java编程语言以其面向对象特性,包括接口、继承、多态性等核心概念,为开发者提供了强大的设计和实现能力。在本实例中,我们将探讨这些关键概念,并通过具体代码示例来展示它们的实际应用。 首先,**接口...

    java基础继承封装多态

    本资源摘要信息将对 Java 基础知识点进行总结,涵盖继承、封装、多态等概念,并对面向对象的设计、数据库设计模式等进行讲解。 继承 继承是 Java 中的一种机制,允许一个类继承另一个类的属性和方法。继承的语法是...

    java继承与多态

    ### Java继承与多态知识点详解 #### 一、引言 在面向对象编程语言中,继承和多态是非常重要的概念。它们提供了强大的机制来管理代码的复杂性,并且能够有效地复用现有代码。本文将详细介绍Java中的继承和多态概念...

    详解java封装继承多态

    Java 封装继承多态详解 Java 中的封装、继承和多态是面向对象编程(Object Oriented Programming)三大特性。下面,我们将详细介绍这三者之间的关系和应用。 封装是指将数据和方法放入类中,并控制对数据的访问...

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

    在Java中,多态主要通过接口和继承来实现。 1. 继承:子类继承父类,可以获得父类的所有非私有属性和方法。在Java中,一个类只能单继承一个父类,但可以实现多个接口,这就是多态的基础。继承的多态性体现在父类...

    源代码+报告-Java的继承和多态编程

    在Java编程中,继承和多态是面向对象编程的核心概念,它们在软件设计中起着至关重要的作用。在这个实验中,我们看到一个具体的应用场景,即实现一个小型公司的工资管理系统,来阐述这两个概念。 首先,让我们理解...

    java继承、多态的简单程序.zip

    这个压缩包"java继承、多态的简单程序.zip"显然包含了一些示例代码,旨在帮助初学者理解这两个概念。接下来,我们将深入探讨Java中的继承和多态性。 ### 继承(Inheritance) 在Java中,继承允许一个类(子类)...

    详解java接口、继承和多态

    ### 详解Java接口、继承和多态 #### 一、Java接口 在Java中,接口是一种定义行为的方式,它提供了一种实现抽象方法的手段。通过接口,开发人员可以为类定义一组方法签名,但不提供这些方法的具体实现。这有助于...

Global site tag (gtag.js) - Google Analytics