/**
运行结果:
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 继承 多态方面的实例源码,内容方面涉及对象类Object和它的toString()方法、多态性、动态绑定和一般程序设计、数组线性表ArrayList类、final类、方法和变量、数据域和静态方法的隐藏等。。。
java 继承和多态PPT教程
理解继承如何增强软件的可重用性 超类(父类)和子类
封装继承多态总结
封装、继承、多态 一、 封装 封装是面向对象编程的三大特性之一,它是指将同一类事物的特性与功能包装在一起,对外暴露调用的接口...Java 面向对象的三大特性是:封装、继承与多态。这三大特性是面向对象编程的核心。
//练习: //1.做一个教师类Teacher,有属性:1.教师号,2教师姓名, //3教师工资(基本工资,课时费,课时数)。 //有方法:1.输出教师所有信息,2.... //2....//(1)该类有以下属性:学校编号:schId, ...
Educoder题目:Java面向对象 - 封装、继承和多态的综合练习答案解析
1继承的概念 2继承的实现 3变量隐藏与方法覆盖 4super关键字 5 子类的构造顺序 6Object类 7 final关键字
Java 中继承与多态的题目 本资源摘要信息是关于 Java 中继承和多态的题目,涵盖了面向对象编程的基本概念和继承机制的应用。 继承的概念 继承是面向对象编程的一种机制,允许一个类(子类)继承另一个类(父类)...
Java继承和多态PPT教案学习 本PPT教案主要讲解了Java中的继承和多态机制,包括继承、里式代换原则、多态和动态绑定、方法重载、重载构造函数和方法覆盖等概念。 继承是面向对象编程的基本机制之一,允许一个类继承...
Educoder题目:Java面向对象 - 封装、继承和多态答案解析
java封装 继承与多态 程序设计 类与对象
Java编程语言以其面向对象特性,包括接口、继承、多态性等核心概念,为开发者提供了强大的设计和实现能力。在本实例中,我们将探讨这些关键概念,并通过具体代码示例来展示它们的实际应用。 首先,**接口...
本资源摘要信息将对 Java 基础知识点进行总结,涵盖继承、封装、多态等概念,并对面向对象的设计、数据库设计模式等进行讲解。 继承 继承是 Java 中的一种机制,允许一个类继承另一个类的属性和方法。继承的语法是...
### Java继承与多态知识点详解 #### 一、引言 在面向对象编程语言中,继承和多态是非常重要的概念。它们提供了强大的机制来管理代码的复杂性,并且能够有效地复用现有代码。本文将详细介绍Java中的继承和多态概念...
Java 封装继承多态详解 Java 中的封装、继承和多态是面向对象编程(Object Oriented Programming)三大特性。下面,我们将详细介绍这三者之间的关系和应用。 封装是指将数据和方法放入类中,并控制对数据的访问...
在Java中,多态主要通过接口和继承来实现。 1. 继承:子类继承父类,可以获得父类的所有非私有属性和方法。在Java中,一个类只能单继承一个父类,但可以实现多个接口,这就是多态的基础。继承的多态性体现在父类...
在Java编程中,继承和多态是面向对象编程的核心概念,它们在软件设计中起着至关重要的作用。在这个实验中,我们看到一个具体的应用场景,即实现一个小型公司的工资管理系统,来阐述这两个概念。 首先,让我们理解...
这个压缩包"java继承、多态的简单程序.zip"显然包含了一些示例代码,旨在帮助初学者理解这两个概念。接下来,我们将深入探讨Java中的继承和多态性。 ### 继承(Inheritance) 在Java中,继承允许一个类(子类)...
### 详解Java接口、继承和多态 #### 一、Java接口 在Java中,接口是一种定义行为的方式,它提供了一种实现抽象方法的手段。通过接口,开发人员可以为类定义一组方法签名,但不提供这些方法的具体实现。这有助于...