Java编程思想(2nd)学习笔记(7)

第2章

           多态
一.再探向上转型(upcasting)

       将某个object reference视为一个“reference to base type“的动作,称为向上转型。

1.  Upcasting后调用某个函数时,如果derived class中覆写了该函数,则会调用derived class中的函数;否则,会调用base class中的函数。如

class First{

    public void prt(){

        System.out.println("First");

    }

}

class Second extends First{

       //(a)

     public void prt(){

        System.out.println("Second");

    }

}

public class ExplicitStatic{

    public static void main(String[] args){

        First n = new Second();

        n.prt();;

    }

}

结果为Second。如果当Second class中的prt()函数注释掉,将输出First。

2.  向上转型后只能调用base class中被derived class覆写的函数。

/*

abstract class First{

    int i = 122;

    public void prt(){

        System.out.println("First.i = " + i);

    }

    public abstract void prt(First f);

}

 <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

class Second extends First{

     public void prt(){

        System.out.println("Second.i = " + i);

    }

   

    public void prt(First i)

    {

       

    }

   

    public void prt(int i)

    {

       

    }

}

public class ExplicitStatic{

    public static void main(String[] args){

        First n = new Second();

        n.prt(2);;

    }

}

*/

class First{

    public void prt(){

        System.out.println("First");

    }

}

class Second extends First{

       //(a)

     public void prt(){

        System.out.println("Second");

    }

    public void prt(int i){//(a)

        System.out.println("Second.i = " + i);

    }

}

public class ExplicitStatic{

    public static void main(String[] args){

        First n = new Second();

        n.prt(3);

    }

}

(a)处的函数只是Second class中的函数,所以不能通过n.prt(3)进行调用。

二.Abstract class和Abstract methods

1.  如果一个class中存在abstract class,则class也必须被声明为abstract class。

2.  abstract class不能被实例化。

3.  如果base class是一个abstract class,那么derived class必须实现base class中所有的abstract methods;否则,derived class也必须被声明为abstract class。

三.其它要点

1.  纯粹继承与扩充

纯粹继承:只有base class所建议的函数,才被derived class加以覆写。

扩充:除了覆写base class的函数,还实现了自己的函数

         abstract class First{

    public abstract void f();

    public abstract void g();

}

//纯粹继承

class Second extends First{

     public void f(){}

     public void g(){}

}

//扩充

class Third extends First{

     public void f(){}

     public void g(){}

     public void u(){}//base class不存在的函数

}

2.  向下转型

1)  向下转型时只能调用base class中被覆写过的函数

2)  只有本来就为derived class对象时才能正确向下转弄。

class First{

     public void f(){}

     public void g(){}

}

class Second extends First{

     public void f(){}

     public void g(){}

     public void u(){}

     public void v(){}

}

public class ExplicitStatic{

    public static void main(String[] args){

        First[] x = {new First(), new Second()};

        x[0].f();

        x[1].g();

        //!x[1].u();class First中不存在函数u()

        //((Second)x[0]).f();(a)

        ((Second)x[1]).u();

}

              }

              (a)处会抛出ClassCastException异常。

时间: 2024-11-08 21:32:19

Java编程思想(2nd)学习笔记(7)的相关文章

学习JAVA编程思想4的好方法

问题描述 跪求大神总结学习JAVA编程思想4的好方法. 解决方案 解决方案二:Java编程思想是很好的学习Java的材料,但对初学者来说有的地方不是能够轻易明白的.因为Java涉及的概念和技术非常广泛,建议先把基础夯实,比如类,接口,继承,多态等,这些有了基础后可以再深入学习正则表达式.线程.io等,一定要动手编写代码,并确实明白代码的执行逻辑.解决方案三:1.背把那些死知识背下来,复习巩固2.敲可以按书本例子课后题敲,对没掌握的可以重复敲3.测找其他题测试掌握情况,最好找SCJP题库的题,因为

Java编程思想重点笔记(Java开发必看)

Java编程思想,Java学习必读经典,不管是初学者还是大牛都值得一读,这里总结书中的重点知识,这些知识不仅经常出现在各大知名公司的笔试面试过程中,而且在大型项目开发中也是常用的知识,既有简单的概念理解题(比如is-a关系和has-a关系的区别),也有深入的涉及RTTI和JVM底层反编译知识.   1. Java中的多态性理解(注意与C++区分) Java中除了static方法和final方法(private方法本质上属于final方法,因为不能被子类访问)之外,其它所有的方法都是动态绑定,这意

java-关于JAVA编程思想中synchronized和ReentrantLock

问题描述 关于JAVA编程思想中synchronized和ReentrantLock 在学习JAVA编程思想并发一章时,关于synchronized和ReentrantLock的例子运行 结果与书中不一致.代码如下: package thinking.in.java.chapter21; class Pair { private int x,y; public Pair(int x, int y) { this.x = x; this.y = y; } public Pair() { this(

关于java问题-java编程思想的23种设计模式有哪些

问题描述 java编程思想的23种设计模式有哪些 例如,单例设计模式其它就不知道了?可以的话在给个例子描述一下 解决方案 根据caozhy的提示,再整理一下 1. Memento(备忘录) 2. Chain of Responsibility(责任链) 3. Observer(观察者 4. Command(命令模式) 5. State(状态模式) 6. Interpreter(解释器 7. Strategy(策略模式) 8. Iterator(迭代子 9. Template Method(模板方

关于继承内部类——java编程思想示例程序分析

编程|程序|继承|示例 关于继承内部类--java编程思想示例程序分析:class Egg2 { protected class Yolk { public Yolk() { System.out.println("Egg2.Yolk()"); } public void f() { System.out.println("Egg2.Yolk.f()"); } } private Yolk y = new Yolk(); public Egg2() { System

java编程思想动态代理实现事务

问题描述 各位大侠好,最近在研读Java编程思想,在看到动态代理这块的时候遇到一点问题,是一个课后习题.大概是这样的:使用动态代理来编写一个系统以实现事务,其中,代理在被代理的调用执行成功时(不抛出任何异常)执行提交,而在其执行失败时执行回滚.你的提交和回滚都针对一个外部的文本文件,该文件不再Java异常的控制范围内.你必须注意操作的原子性.感觉这道题很有意义,但是由于是新手,自己在读题和解题的时候都比较困惑,所以希望各位达人能帮忙解答一下.最好有个完整的例子.小弟仅有的45分全部奉上! 解决方

java-求大神推荐几本关于Java编程思想的书

问题描述 求大神推荐几本关于Java编程思想的书 有时结果总是超乎自己的想象,可能是自己的思维模式跟不上计算机的算法 解决方案 建议你还是多做些联系,参与一些项目练练实际经验吧,看编程思想的书时需要一定基础的. 解决方案二: thinking in java 解决方案三: effective java

java多线程问题,java 编程思想书中的例子

问题描述 java多线程问题,java 编程思想书中的例子 在看java编程思想书中的多线程一节,书中对wait,notify,notifyall举了一个例子,模拟给汽车涂蜡和抛光的过程, 因为抛光任务在涂蜡之前是不能尽兴的,反之,涂蜡任务在涂另外一层蜡之前,必须要等抛光任务结束.代码如下: 显示一个汽车类: class Car{ private boolean wanOn=false; public synchronized void waxed(){ waxOn=true; notifyAl

寻找java编程思想

问题描述 谁有第一版到最新版的java编程思想,能给我传下不,小弟在此谢过...有的话请传到zhhj0104@qq.com 解决方案 解决方案二:如果有的話我也想要啊解决方案三:我也想要..先谢谢了解决方案四:去作者网站.早期版本都是直接提供下载的.解决方案五:这破书就算了吧

java编程思想-java编程四线第二十一章 线程SynchronizationComparisons.java有错误

问题描述 java编程四线第二十一章 线程SynchronizationComparisons.java有错误 //BaseLine 和AtomicTest 是线程不安全的 ,求解答 //: concurrency/SynchronizationComparisons.java// Comparing the performance of explicit Locks// and Atomics versus the synchronized keyword.import java.util.c