<java编程思想>第一章读书笔记二

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了<java编程思想>第一章读书笔记二相关的知识,希望对你有一定的参考价值。

7.伴随多态的可互换对象

       前面说了继承,我们知道继承中存在基类(父类)以及导出类(子类),不知道大家有没有遇到过这种情况?就是在向一个方法中传递一个对象作为参数时,我们往往会选择传递一个基类而不是一个子类,为什么要这么做呢?其实原因也很简单,说的高大上一点就是这样做有利于代码的健壮性和可扩展性,说的详细还是有利于代码的健壮性和可扩展性,更重要的也就是可扩展性。

       还拿喝可乐的例子来说,如果你传递的参数对象是可乐,那么不管你是给我百事可乐还是可口可乐我都可以接受啊,但是如果你传递的参数仅仅是百事可乐,但是我今天就是想喝可口可乐怎么办?这时候恐怕你就只能再去写一个一模一样的方法,然后传入可口可乐参数,但是可乐只有两种,加入我想喝的是饮料,那么多饮料你每一种都写一个方法吗?那是不现实的,好的解决方法是什么呢?就是书中所说的向上转型,传递参数的时候传递泛化的类型,也就是我们所说的基类,如果有新的类型添加进来的时候只需要继承基类,那么添加新类型时对于方法的调用时没有任何影响的。这就是书中所说的我们在处理类的层次结构时,往往不想把一个对象当做其所属的特定类型,而是将其当做其基类的对象来对待,这样的话方便扩展新的类型,并且扩展新的类型对于现有方法的调用没有任何影响。

       但是在将对象当成其基类的对象处理时也有个问题,什么问题呢?我们是人,可以喝出来哪个是百事可乐哪个是可口可乐,但是编译器是机器,它不知道你传入的对象到底是什么,它只知道你传入的是可乐,但是到底是百事可乐还是可口可乐呢,它不知道,所以它就无法去执行对应的代码产生相应的结果,这怎么办?这时候书中提出了后期绑定的概念,什么是后期绑定呢?编译器说不到运行的时候我也不知道要执行哪段代码啊,我就知道传给我的参数必须是这种类型的,我能给你返回的也是固定的,别的别问我,我也不知道。怎么理解这句话?就像喝可乐一样,我不管你给我的是哪种可乐,反正你必须给我一瓶可乐,喝了可乐我才会觉得爽,才能和你愉快的玩耍,就是这个意思。但是执行后期绑定还需要一小段代码,书中说要到第八章再详细展开,这个小段代码是什么我也不知道,到时候再回头解决这个问题吧,现在我也不是很清楚。

       这一节最后的部分是使用几何图形的例子说了下多态,话说啊后期绑定也可以叫做动态绑定,在java中这是默认的行为,不需要额外的操作去开启动态绑定,而动态绑定也是实现多态的必要条件。

 

8.单根继承结构

       在java中只存在单根继承也就是我们所说的单继承,也就是一个类只能有一个父类,不能有多个父类,就像你的亲生父亲只能有一个一样,不能多了。在java中所有的类最终都继承自单一的基类Object,这也是我们平时所说的所有的对象都可以看做是一个Object对象,那么单根继承有什么好处呢?

       好处主要有三点,其一,所有对象都具有一个共有接口,也就是具有相同的基本类型。什么意思呢?意思就是张三是一个人,李四也是一个人,王五还是一个人,编程里面就是Person是一个Object,Animal也是一个Object,所有的对象归根结底都是一个Object,也就是你可以使用Object来代替任何你想要的对象,也可以说是任何你想要的对象都可以使用Object来占位。这就是第一点好处,那么第二点好处是什么呢?第二点好处是所有的对象都具有某些功能,我们在看jdk的API的时候任意点开一个类,在类的方法一栏我们都会看到一个clone()方法,也就是说任意一个对象我们都可以调用clone()方法,当然还有一些其他的共有方法,这些方法保证你在任何一个对象上都可以执行一些操作。第三,单根继承让垃圾回收变得简单了很多,对于垃圾回收这块我的认识也比较少,所以就不献丑了,以后有机会再专门研究垃圾回收这块。

 

9.容器

       顾名思义,容器嘛,当然是用来装东西的,可乐瓶子就是容器,拿来装可乐的,但是java里面的容器可不是拿来装可乐的,关于这个我们要知道两点,其一,java里面的容器装的不是东西,而是对象,确切的说应该是对象的引用,第二,java里面的容器持有其他对象的引用,但是其本身仍然是一个对象。此外在java里面我们把容器称之为集合,相信大家也知道集合框架在java里面是很重要的一部分内容,比较常见的集合有List,Map,Set这三个,

他们分别应用在不同的场景之下,这个等后面学到集合框架的时候我们在详细说吧,但是有一点我们现在需要知道,那就是既然集合就是持有其他对象的引用的一个对象,说的直白点就是现在有一个人,你可以代表一群人,出事了你扛着,但是为什么要设计那么多的集合呢?为什么不单单设计一个List,反而还要设计什么Map啊Set啊这些呢?关于这点主要有两个原因,第一点,不同的集合提供不同类型的接口和外部行为,例如list用来存储序列,但是Map用来存储键值对,他们的作用不同;第二点,不同的集合对于某些操作具有不同的效率,比如ArrayList和LinkedList的比较。

       大家可能见过这样创建集合的List<String> list = new ArrayList<String>(),为什么要在尖括号中间加上一个String呢,其实这里的String可以换成任何类型,甚至可以换成Object,其实在java SE5之前是没有List<String>这种写法的,只能写成List,但是在java SE5之后出现了泛型的概念,List<String>就是带有泛型的集合,表示什么意思呢?它表示在这个list集合中你只能存入String类型的变量,存别的编译器是不认得,就像一个仓库只能拿来放钱,你要是把白纸放进去了看门的不让你进去一样。为什么要添加泛型呢?这是因为在java SE5以前单单写一个List你知道它里面存的是什么吗?如果这个List是由你创建的,你也知道你往里面存入了字符串对象,但是别人不知道,别人如果存入一个数字对象怎么办?而且存的时候不会出现错误,但是取得时候就出问题了,什么问题呢?你存了一个字符串,第二个人存了一个数字,第三个人存了一个Person对象,但是你取得时候都是按照字符串对象来取的,你说能不出错吗?不带泛型的集合就如同是List<Objetc>这样的集合,只要你是对象,那么我来者不拒,我们都知道所有的对象都继承自Object,那么即使你存入的是一个数字对象,它也会向上转型为Object,这是完全没有问题的啊,但是当你取出这个对象的时候就是向下转型,我们要知道一点,向上转型是不会出现问题的,但是向下转型时,即使在你明确知道类型是什么的情况下你也要强制转换这个对象的类型,如果你不知道对象的类型,那么是很不安全的做法,基于以上的原因,java  SE5以后就加入了泛型的概念,就相当于是规定了集合中能够存入的类型,这样这个集合中就只能存入这种类型的对象,就不会出现向上转型和向下转型的问题了。

  

       第一章的部分暂时就写到这里,对象的创建和生命周期这一节我憋了两天没写出来一个字,因为单纯看书中的解释感觉很晦涩,不知道该怎么去理解,更不用说用自己的语言表达出来了,主要是我个人的对于这一块的理解也不到位,我也去网上查了一下这部分的内容,对于对象的生命周期的文章都写的很好,大家可以去参考一下,等我有能力驾驭这一块的时候再来把这个文章完善一下,至于后面的异常和并发编程以及internate本来我也没打算详细写,因为书中对着三部分都是简单的介绍,等看到对应的章节的时候再详细理解。

    最后想说一下想写出来点东西真的很难,书看的比较快,但是写文章就慢好多,一星期也就是出来一篇文章。继续努力,下周争取把第二章写出来。

以上是关于<java编程思想>第一章读书笔记二的主要内容,如果未能解决你的问题,请参考以下文章

[读书笔记]Effective Java 第一章

读书笔记《大型网站系统与Java中间件实践》第一章1.2.2.3 同步陷阱

《Java虚拟机精讲》读书笔记-第一章Java体系结构

JAVA编程思想学习笔记——第一章 对象导论

JAVA编程思想学习笔记——第一章 对象导论

JAVA编程思想学习笔记——第一章 对象导论