Java多态-继承与清理

通过组合和继承方法来创建新类时,永远不必担心对象的清理问题,子对象通常会留给垃圾回收器进行处理。如果确是遇到清理问题,那必须用心为新的类创建dispose()方法(在这里我们选用此名)。并且由于继承的缘故,如果我们有其他作为垃圾回收一部分的特殊清理动作,就必须在导出类中覆盖被继承的dispose()方法。当覆盖被继承的diopose()方法时,务必记住调用基类版本dispose()方法;否则,基类的清理动作就不会发生。下例便是一个证明:


package polymorphism;

class Characteristic{
private String s;
Characteristic(String s){
this.s = s;
System.out.println("Creating Characteristic "+ s);
}
protected void dispose(){
System.out.println("disposing Characteristic "+ s);
}
}

class Description{
private String s;
Description(String s){
this.s = s;
System.out.println("Creating Description"+ s);
}
protected void dispose(){
System.out.println("disposing Description"+ s);
}
}

class LivingCreature{
private Characteristic p =
new Characteristic("is alive");
private Description t =
new Description("Basic Living Creature");
LivingCreature(){
System.out.println("LivingCreature Creature");
}

protected void dispose(){
System.out.println("LivingCreature dispsoe");
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.print("Animal()");}
protected void dispsoe(){
System.out.print("Animal dispose");
t.dispose();
p.dispose();
super.dispose();
}
}

class Amphibian extends Animal{
private Characteristic p = new
Characteristic("can i live in water");
private Description t =
new Description("Both water and land");
Amphibian(){
System.out.print("Amphibian()");
}
protected void dispsoe(){
System.out.print("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");
public Frog(){System.out.println("Frog()");}

protected void dispose(){
System.out.print("Frog dispose");
t.dispose();
p.dispose();
super.dispose();
}
public static void main(String[] args){
Frog frog = new Frog();
System.out.println("bye");
frog.dispose();
}

}


下面是运行结果:
 
Creating Characteristic is alive
Creating DescriptionBasic Living Creature
LivingCreature Creature
Creating Characteristic has heart
Creating DescriptionAnimal not Vegetable
Animal()Creating Characteristic can i live in water
Creating DescriptionBoth water and land
Amphibian()Creating Characteristic Croaks
Creating DescriptionEats Bugs
Frog()
bye
Frog disposedisposing DescriptionEats Bugs
disposing Characteristic Croaks
LivingCreature dispsoe
disposing DescriptionBasic Living Creature
disposing Characteristic is alive

层次结构中的每个类都包含Charactersitic和Description这两种类型的成员对象,并且它们也必须被销毁。所以万一某个子对象要依赖其他对象,销毁顺序应该和初始化顺序相反。对于字段,则意味着与声明的顺序相反。对于基类(遵循C++中的析构函数),应该首先使用基类对其导出类进行清理,然后是基类。这是因为导出类的清理可能会调用基类的某些方法,所以需要使其基类中的构件仍起作用而不应过早的销毁。

Java多态-继承与清理,布布扣,bubuko.com

时间: 2024-12-26 12:17:04

Java多态-继承与清理的相关文章

Java的继承与多态

Java的继承与多态对于提高开发效率,减少开发量,是非常有帮助的,也便于代码维护.下面是根据书上讲的,我又做了改进的例子. 假设需求: 公司需要对所有人员进行管理,所有人员分为普通员工和经理人,他们的头衔.工资.生日等信息都是不一样的,但是不能开发两套系统分别进行管理,而是要一套系统完成对所有人的管理. 设计一个员工类,这是父类,定义如下: package com.myHelloWorld; import java.text.ParseException; import java.text.Si

Java面向对象㈡ -- 继承与多态

Java的继承是通过extends和implement来实现的,Java不支持多继承,但是Java支持多层继承以及多实现(接口).Java继承有一个关键字super是用来指向父类.Java继承衍生出覆盖的概念.覆盖被用来支持多态.实际开发中Java通常继承于抽象类,实现于接口.如果不希望一个类被继承,或者一个方法被覆盖,或者一个成员变量被改变,就可以用final修饰.这里只说明两个问题:1,重载和覆盖的区别重载和覆盖的区别:重载发生在同一个类之中,重载要求函数名相同,参数不同(参数个数||参数类

Java多态机制和继承中重写重载

关于Java中多态机制 http://www.cnblogs.com/chenssy/p/3372798.html 这篇博文讲的很透彻 大体意思是 多态定义: 多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定.因为在程序运行时才确定具体的类,这样,不用修改源程序代码,就可以让引用变量绑定到各种不同的类实现上

黑马程序员----java基础----继承与多态,附相关面试题

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 一:继承(掌握) (1)把多个类中相同的成员给提取出来定义到一个独立的类中.然后让这多个类和该独立的类产生一个关系, 这多个类就具备了这些内容.这个关系叫继承. (2)Java中如何表示继承呢?格式是什么呢? A:用关键字extends表示 B:格式: class 子类名 extends 父类名 {} (3)继承的好处: A:提高了代码的复用性 B:提高了代码的维护性 C:让类与类产生了一个关

Java基础继承与多态

Java基础第九天 继承概述 引入 首先我来写两个代码: //定义学生类 class Student {     public void study(){ System.out.println("在教室学习"); } } //定义老师类 class Teacher { public void teach(){ System.out.println("在教室教书"); } } 我们观察上面两个代码: 发现name,age成员变量,以及getXxx()/setXxx()

C++基础学习教程(七)----类编写及类的两个特性解析--->多态&继承

类引入 到目前为止我们所写的自定义类型都是关键字struct,从现在起我们将采用class方式定义类,这种方式对于学习过其他高级语言包括脚本(Such as Python)的人来说再熟悉不过了. 但是在写之前我们还是需要比较一下用struct和class之间有什么区别. 首先对于struct,在C兼容性方面很重要,尽管C++是有别于C的另一门语言,但许多程序还是必须与C交互,C++有两个重要功能,可以方便的与C交互.其中之一的就是POD,即是Plain Old Data(简单旧式数据)的缩写.

java基础-继承

一个由其他类继承的类叫子类(也叫继承类,扩展类等),该类继承的类叫父类或超类.除了Object类意外,所有的类都有切仅有一个父类,如果一个类没有用extends关键词声明父类,则该类隐含继承Object类,因此如果一个类继承另外一个父类,而该父类可能又是继承的另外一个类,最终的起点在Object类. java中继承的概念简单而强大,当你需要定义的一个类中的许多代码已经在另外一个类中存在时,我们就可以选择定义时继承该类,这样免去许多书写和调试的麻烦,子类能够继承父类的字段,方法和嵌套类,即类成员,

java类继承总结一 父类类型与子类类型之间的转化问题(转)

java类继承总结一 父类类型与子类类型之间的转化问题 本文将通过一个实例描述父类类型与子类类型之间的转化问题,这个很特殊的问题常常会导致一些潜在的危险,让你整整一个晚上都在调试程序以解决一个让人抓狂的java.lang.ArrayStoreException异常. 1. 子类数组的引用可以装换为超类数组的引用 2. 子类的引用child可以转换为父类的引用parent(这里假设parent是父类对象,child是子类对象),但却不可以通过 parent调用child的特有方法 class Em

Java多态特性:重载和覆写的比较

Java重载: 在同一个类中 方法具有相同的名字,相同或不同的返回值,但参数不同的多个方法(参数个数或参数类型) public class MethoDemo{ public static void main(String args[]){ int one = add(10,20) ; // 调用整型的加法操作 float two = add(10.3f,13.3f) ; // 调用浮点数的加法操作 int three = add(10,20,30) ; // 调用有三个参数的加法操作 Syst