读 《think in java》 有感 -- 第(七)章
2014-03-08 19:40
288 查看
第七章:
1.finalize的调用:当类A继承类B后,如果不在finalize()中使用super.finalize()则B的finalize方法将不会调用。
输出:
Class3 finalize
Class2 finalize
7.7.3 构建器内部的多形性方法的行为
在父类中调用动态绑定的方法,当调用方法操作了本类的成员变量时,可能会造成子类成员变量初始化的调用问题。
(1)在采取其他任何操作之前,为对象分配的存储空间初始化成二进制零。
(2)如果在父类中调用abstrace 方法的时候,事实上这个时候调用的是子类中覆盖的方法。
(3)这个时候子类的方法由于没有进行初始化,那么将出现变量初始化异常eg:i = 0(见(1)).
输出结果:
Glyph() before draw()
RoundGlyph.draw(), radius = 0
Glyph() after draw()
RoundGlyph.RoundGlyph(), radius = 5
1.finalize的调用:当类A继承类B后,如果不在finalize()中使用super.finalize()则B的finalize方法将不会调用。
//FinalizeTest.java public class FinalizeTest { static class MainTestor { public static void main(String[] args) { new Class3(); System.runFinalizersOnExit(true); } } } class Class1 { @Override protected void finalize() throws Throwable { // TODO Auto-generated method stub System.out.println("Class1 finalize"); //super.finalize(); } } class Class2 extends Class1 { @Override protected void finalize() throws Throwable { // TODO Auto-generated method stub System.out.println("Class2 finalize"); //!删除调用 super.finalize(); } } class Class3 extends Class2 { @Override protected void finalize() throws Throwable { // TODO Auto-generated method stub System.out.println("Class3 finalize"); super.finalize(); } }
输出:
Class3 finalize
Class2 finalize
7.7.3 构建器内部的多形性方法的行为
在父类中调用动态绑定的方法,当调用方法操作了本类的成员变量时,可能会造成子类成员变量初始化的调用问题。
(1)在采取其他任何操作之前,为对象分配的存储空间初始化成二进制零。
(2)如果在父类中调用abstrace 方法的时候,事实上这个时候调用的是子类中覆盖的方法。
(3)这个时候子类的方法由于没有进行初始化,那么将出现变量初始化异常eg:i = 0(见(1)).
//: PolyConstructors.java // Constructors and polymorphism // don't produce what you might expect. abstract class Glyph { abstract void draw(); Glyph() { System.out.println("Glyph() before draw()"); draw(); System.out.println("Glyph() after draw()"); } } class RoundGlyph extends Glyph { int radius = 1; RoundGlyph(int r) { radius = r; System.out.println( "RoundGlyph.RoundGlyph(), radius = " + radius); } void draw() { System.out.println( "RoundGlyph.draw(), radius = " + radius); } } public class PolyConstructors { public static void main(String[] args) { new RoundGlyph(5); } } ///:~
输出结果:
Glyph() before draw()
RoundGlyph.draw(), radius = 0
Glyph() after draw()
RoundGlyph.RoundGlyph(), radius = 5
相关文章推荐
- think in java第十二章笔记
- JAVA 复习(Think In Java, 4th) -- Error Handling with Exceptions
- think in java
- 现在看的《c#技术内幕》与过去看的《Think In Java》两者的比较
- [think in java2]java并发问题总结
- think in java - annotation
- think in java第18章Java i/o系统课后习题
- think in java-对象导论
- Think in java(一)域的初始化问题与static声明
- think in java interview-高级开发人员面试宝典(四)
- Think In Java 10 内部类
- think in java 1
- think in java笔记:java.util.concurrent.Semaphore
- think in java interview-高级开发人员面试宝典(九)
- [think in java]第10章 内部类
- 《Think in Java》(三)——一切都是对象
- Java 编程规则(think in java 第四版)
- Think in java 答案_Chapter 2_Exercise 12
- ThinkInJava(Java编程思想总结)2017.8.9-------操作符
- Think in java 答案_Chapter 4_Exercise 18