package com.payton.polymorphism;
class Characteristic {
private String s;
Characteristic(String s){
this.s = s;
System.out.println("Create Characteristic " + s);
}
protected void dispose() {
System.out.println("finalizing Characteristic.");
}
}
class Description {
private String s;
Description(String s){
this.s = s;
System.out.println("Create Description " + s);
}
protected void dispose() {
System.out.println("finalizing Description.");
}
}
class LivingCreature {
private Characteristic p = new Characteristic("is alive");
private Description t = new Description("Basic Living Creature");
LivingCreature(){
System.out.println("LivingCreature()");
}
protected void dispose() {
System.out.println("LivingCreature dispose.");
t.dispose();
p.dispose();
}
}
class Animal extends LivingCreature {
private Characteristic p = new Characteristic("has heart");
private Description t = new Description("Animal not vegetable");
Animal(){
System.out.println("Animal()");
}
protected void dispose() {
System.out.println("Animal dispose.");
t.dispose();
p.dispose();
super.dispose();
}
}
class Amphibian extends Animal {
private Characteristic p = new Characteristic("can live in the water");
private Description t = new Description("Both water and land");
Amphibian(){
System.out.println("Amphibian()");
}
protected void dispose() {
System.out.println("Amphibian dispose.");
t.dispose();
p.dispose();
super.dispose();
}
}
public class Frog extends Amphibian{
private Characteristic p = new Characteristic("Croaks");
private Description t = new Description("Eats Bugs");
Frog(){
System.out.println("Frog()");
}
protected void dispose() {
System.out.println("Frog dispose.");
t.dispose();
p.dispose();
super.dispose();
}
public static void main(String[] args) {
Frog frog = new Frog();
System.out.println("Bye!");
frog.dispose();
}
}
结果:
Create Characteristic is alive
Create Description Basic Living Creature
LivingCreature()
Create Characteristic has heart
Create Description Animal not vegetable
Animal()
Create Characteristic can live in the water
Create Description Both water and land
Amphibian()
Create Characteristic Croaks
Create Description Eats Bugs
Frog()
Bye!
Frog dispose.
finalizing Description.
finalizing Characteristic.
Amphibian dispose.
finalizing Description.
finalizing Characteristic.
Animal dispose.
finalizing Description.
finalizing Characteristic.
LivingCreature dispose.
finalizing Description.
finalizing Characteristic.
方法的执行顺序和类的调用顺序相反。
先执行继承类的方法,再执行派生类的方法,最后执行基类的方法。
分享到:
相关推荐
它提供了一个丰富的注解系统,用于控制测试的执行顺序,以及对测试方法和测试类进行组织和管理。下面我们将详细介绍TestNG注解方法的执行顺序,以及相关的关键知识点。 首先,了解TestNG的测试执行顺序是非常重要的...
在面向对象编程中,构造函数和析构函数是非常重要的概念,特别是在派生类中,它们的执行顺序直接影响了类的正确初始化和清理。在本文中,我们将讨论构造函数和析构函数在派生类中的执行顺序须知。 一、构造函数的...
总结起来,理解pytest fixtures的执行顺序至关重要,因为它直接影响到测试环境的设置和清理。要精确控制fixture的执行顺序,应重点关注fixture的作用范围、依赖关系以及是否启用`autouse`特性。通过合理设计fixture...
在Vue.js框架中,尤其是最新的3.x版本与Vite构建工具的结合,理解子组件和父组件的执行顺序是至关重要的。Vue的生命周期是每个组件从创建到销毁的过程,其中包括了初始化、挂载、更新和卸载等阶段。在父子组件的关系...
通过了解顺序阀的工作原理,熟悉其常见故障及排除方法,可以更有效地在液压系统设计和维护中使用顺序阀,提高系统的稳定性和可靠性。对于任何液压系统,正确选择和使用液压元件都是至关重要的,顺序阀也不例外。因此...
try、catch、finally、return 执行顺序的规则是:try 语句用于包装可能抛出异常的代码,catch 语句用于捕捉 try 语句中的异常,finally 语句用于执行一些清理工作,return 语句用于从方法中返回值。finally 语句是在...
生命周期是指一个应用程序组件(如Activity)从创建到销毁的整个过程,它涉及到各种方法的调用,这些方法的执行顺序构成了Android应用运行时的行为模式。本文将深入探讨Android的生命周期调用顺序,并通过实际的Demo...
了解它们的执行顺序对于编写高效、安全的代码至关重要。本章节主要探讨了构造和析构的顺序,以及它们如何影响对象成员的初始化和清理。 首先,我们来理解构造函数的顺序。当创建一个对象时,它的成员变量会按照声明...
首先,按照类的继承层次,从父类到子类的顺序执行父类的静态初始化块和构造方法。接着,执行子类的静态初始化块和构造方法。非静态初始化块(也称为实例初始化块)在类的构造方法之前执行,用于初始化实例变量或执行...
通过在每个生命周期方法内插入Log语句,我们可以跟踪并记录这些方法的执行顺序。例如: ```java @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.d(...
在C++编程中,框架程序的执行顺序是一个关键的概念,特别是在开发Windows应用程序时。本节将深入探讨"5.5 框架程序的执行顺序",特别是"5.5.2 程序的初始化过程"。我们将通过分析APPINIT.CPP、APPCORE.CPP、WINMAIN....
下面将详细阐述各个Phase的执行顺序及其作用。 1. **Create Phase**: - 在这个阶段,UVM组件实例化完成。`new`函数被调用,用于创建组件对象。在这个阶段,用户可以设置组件的参数和属性。 2. **Build Phase**:...
但如果是类实例的成员变量,其析构顺序会是子类的清理逻辑、类成员变量的清理,最后是父类的清理逻辑,因为这些清理动作是伴随着对象被垃圾回收而发生的。 标签"构造函数"强调了这个话题的核心,即构造过程中类实例...
- 对于单例Bean,Spring容器在关闭时会调用`destroy-method`属性指定的方法或带有`@PreDestroy`注解的方法进行清理工作。对于非单例Bean,通常不进行销毁操作。 7. **生命周期回调** - Spring提供了一些回调接口...
本文将深入探讨Servlet的方法执行次序以及相关的API,帮助你更好地理解和运用这些关键功能。 首先,让我们了解Servlet生命周期中的主要方法: 1. **init()**:Servlet初始化时调用此方法。在Servlet实例化后,容器...
postHandle方法的执行顺序与声明顺序相反,即最后声明的拦截器的postHandle方法最先执行,最先声明的拦截器的postHandle方法最后执行。 afterCompletion方法是请求完全处理完毕,响应已经返回给客户端之后执行的...
7. **结束拖动**:最后,在mouseup事件中,清除拖动状态,移除视觉效果,并可能进行一些清理工作,如更新表格的样式或触发刷新事件,让其他依赖于表格结构的组件能够感知变化。 8. **兼容性和优化**:确保这个功能...
批处理文件是Windows操作系统中的一种简单程序,它能够按顺序执行一系列DOS命令。用户双击运行这个`.bat`文件,系统就会按照预先设定的指令,帮助用户快速清理Flash Player的缓存,无需手动进入Flash设置或使用其他...
批处理文件(.bat)是Windows操作系统中的一种文本文件,其中包含了若干条DOS命令,可以按顺序执行。在这种情况下,该批处理文件可能包含了清理系统垃圾的命令,如删除临时文件夹、清理Internet Explorer缓存、清除...