本章主要介绍的是Java的背景知识,通过了解历史知道Java与其他语言的区别,以便更好选择在什么场景下使用Java。

24.2    语言的尺寸
Java语言短小、紧凑,以C++为基础,放弃了一些特定的语言特征(指针和多继承)
注:需要关注的是为什么放弃这两个特征,有没有替代方案,各自的优缺点。

24.2.1    指针(pointer)
指针是一种变量,并且变量中包含了某个存储器地址。
Java不允许使用指针,因为指针指向的是具体的物理地址,直接操纵物理地址中的数据,容易使程序出现不可预料的问题。
Java通过创建引用()来实现对地址的访问。通过引用也可以把地址作为变量传送。

24.2.2    多继承(multiple inheritance)
多继承允许一个类继承于多个超类。
Java不允许多继承:因为多继承使用不多,且编程复杂,容易出错。
Java允许继承一个基类,实现多个接口的方式实现多继承。

24.3    语言的可靠性
24.3.1    别名(alias)
别名会导致不同的对象变量指向同样的对象。
因为对象变量中存储的对象地址相同,从而出现两个修改同一对象数据的入口,容易造成混淆。
为此Java提供了两种拷贝机制:深拷贝(对象的数据的拷贝)和浅拷贝(对象的引用的拷贝)。
深拷贝可以保护原始对象不受影响,但是需要消耗时间和空间,用于保护数据安全的领域使用。利用clone方法。
浅拷贝提供了原始对象的地址,不需要消耗过多的时间和空间,但是必须小心的使用,以免造成不可预料的问题。利用别名机制。

24.3.2    重写clone方法
protected的方法可以被重写为public的方法,但是public的方法不可以重写为protected方法。
注:因为已经在父类已经是public的方法,就算子类重写为protected方法,那么访问者依然可以通过父类实现访问,所以不容许public方法重写成protected方法。

24.3.3    不变对象
如果对象中不存在变更它们状态的方法,则对象称为不变对象。
如果对象是不可变的,则不必担心创建对象的别名会造成不可预料的问题。

24.3.4    使用Object类的clone方法
Object类的clone方法复制了分配给对象属性的存储器的内容,也称为按位拷贝(bitwise copy)。即完全复制了原始类型(primitive type)的属性的内容,并且复制了属性的引用。
*    如果类的属性都是基本类型的,则重载clone方法只需要调用Object类的clone方法;
*    如果类的属性有对象类型的,并且这些对象都是不可变的,则重载clone方法只需要调用Object类的clone方法。
*    如果类的属性包含非不可变对象,则无法利用Object类的clone方法进行复制,必须自己编写代码来实现clone方法。

如果需要使用Object类的clone方法,需要标识类实现了Cloneable接口,这个接口也是个标识接口,没有包含任何方法。

24.3.5    垃圾收集
Java使用异常处理技术来监视内存耗尽问题,并且可以编写代码来确保程序正常地终止。
Java语言具有一种内嵌的垃圾收集功能,该功能能够释放未被使用的内存。通过搜索程序所使用的内存空间,释放不再被使用的内存。

自测题:
1.    指针与引用的区别:
指针保存了地址,并且可以通过代码修改和操纵这个地址的数据。
引用保存了地址,但是这个地址不能通过代码修改,也不能随便改变访问的类型,例如:不能按字节访问地址中的信息。

2.    多继承:
多继承允许一个类继承于多个超类。
Java不允许多继承:因为多继承使用不多,且编程复杂,容易出错。
Java允许继承一个基类,实现多个接口的方式实现多继承。

3.    Critical.java

a)    因为Critical对象存在变更它们状态的方法,所以是可变对象。

b)    CriticalTest.java

c)    Critical.java

d)    CriticalTest.java

4.
a)    为什么方法返回的都是别名:方便调用的方法修改里面的数据,对于不可变对象也提高传送数据的效率。
b)    为什么别名可能有危险:因为调用方法的代码可能会修改原始数据,造成不可意料的数据错误。
c)    如何避免别名:创建clone方法,返回的对象都采用深拷贝。

5.    垃圾收集功能的优点和缺点:
优点:简化程序员的工作,避免出现内存泄漏或者内存耗尽的问题。
缺点:降低代码执行的速度,对于实时应用会突然出现响应不及时的问题。

编程练习:代码附件
    Critical.java    CriticalTest.java

《Java大学教程》—第24章 Java的背景的更多相关文章

  1. 正在学习的Java大学教程

    推荐本书<Java大学教程> 看的人比较少,我也是多年不看书了,基于教程一般选国外的方法,从图书馆选了本书. 看了一半,感觉书的内容比较认真,对于基本的Java知识都算介绍全了,而且全书是 ...

  2. 《Java大学教程》—第12章 案例研究--第2部分

    本章就是上一章的延续,主要是用GUI实现了控制界面. 编程练习:代码附件Hostel.java1.    正确运行2.    Runhostel.java3.    searchButton

  3. 《Java大学教程》—第6章 类和对象

    6.2 对象:结构化编程-->数据-->封装(聚合,信息隐藏)-->对象(方法及其操作的数据都聚合在一个单元中,作为更高层的组织单元)-->类(创建对象的模板)6.3 类:*  ...

  4. 《Java大学教程》--第1章 步入Java世界

    1.2 软件:用于计算机执行的指令的集合称之为程序(program).单个程序或者一组程序称之为软件(software)1.3 编译:计算机的语言称为机器码(machine code).用编译器(co ...

  5. (转)JAVA AJAX教程第四章—AJAX和MVC的简单结合

    这里我们再理解了AJAX后,开始来用实例感受AJAX的力量. 今天我最后要实现的效果,当鼠标放到图片上时会根据,会把数据库库里的数据读出,通过显示框显示出来.这个在很多网上商店都有用到这里效果,我们这 ...

  6. 《Java基础教程》第一章学习笔记

    Java 是什么呀! 计算机语言总的来说分成机器语言,汇编语言,高级语言.其中Java一种高级计算机语言,它是一种可以编写跨平台应用软件,完全面向对象的程序设计语言. Java划分为三个技术平台,Ja ...

  7. Java不走弯路教程(2.Hello,Java!)

    2.Hello,Java! 欢迎来到Java的世界,在上一章,我们已经完成了DOS的基本操作学习和Java的环境搭建,在本章中我们Java来完成一个简单的DOS程序. 2.1 Hello,Java! ...

  8. 《深入理解Java虚拟机》-----第2章 Java内存区域与内存溢出异常

    2.1 概述 对于从事C.C++程序开发的开发人员来说,在内存管理领域,他们即是拥有最高权力的皇帝又是执行最基础工作的劳动人民——拥有每一个对象的“所有权”,又担负着每一个对象生命开始到终结的维护责任 ...

  9. 《深入理解Java虚拟机》-----第12章 Java内存模型与线程

    概述 多任务处理在现代计算机操作系统中几乎已是一项必备的功能了.在许多情况下,让计算机同时去做几件事情,不仅是因为计算机的运算能力强大了,还有一个很重要的原因是计算机的运算速度与它的存储和通信子系统速 ...

  10. 深入Java虚拟机读书笔记第一章Java体系结构介绍

    第1章 Java体系结构介绍 Java技术核心:Java虚拟机 Java:安全(先天防bug的设计.内存).健壮.平台无关.网络无关(底层结构上,对象序列化和RMI为分布式系统中各个部分共享对象提供了 ...

随机推荐

  1. 【转载】C#使用正则表达式校验邮箱

    在C#中,可以使用Regex正则表达式类来校验前台提交过来的邮箱字段信息是否符合要求,Regex类是C#中有关正则表达式处理的相关类,功能强大,我们只需要在实例化Regex类的时候指定相应的规则为邮箱 ...

  2. C#线程安全类型

    1.IProducerConsumerCollection (线程安全接口) 此接口的所有实现必须都启用此接口的所有成员,若要从多个线程同时使用. using System; using System ...

  3. 【Java每日一题】20170216

    20170215问题解析请点击今日问题下方的“[Java每日一题]20170216”查看(问题解析在公众号首发,公众号ID:weknow619) package Feb2017; public cla ...

  4. STL中的Set用法(详+转)

    set是STL中一种标准关联容器(vector,list,string,deque都是序列容器,而set,multiset,map,multimap是标准关联容器),它底层使用平衡的搜索树——红黑树实 ...

  5. linux mail操作

    本操作系统邮件由来,crontab定时任务执行推送产生. 1.查看有多少封邮件 & file 2.我们直接键入23935来访问这封mail,看看是否是我们所需要的最新邮件. 3. 退出邮件查看 ...

  6. Grafan+Prometheus 监控 MySQL

    架构图 环境 IP 环境 需装软件 192.168.0.237 mysql-5.7.20 node_exporter-0.15.2.linux-amd64.tar.gz mysqld_exporter ...

  7. es6 语法 (map、set和array 的对比)

    //数据结构对比 增查改删 { //map和array对比 let map = new Map(); let array = []; //增 map.set('t',1); array.push({t ...

  8. 被低估的.net(中) - 广州.net俱乐部2019年纲领

    这是被低估的.net系列的中篇.上篇在这里:被低估的.net(上) - 微软MonkeyFest 2018广州分享会活动回顾 中篇本来不是这样的,中篇的草稿大纲其实在写上篇之前就写好了,嗯,当时给张队 ...

  9. Python入门基础之list和tuple

    Python之创建list Python内置的一种数据类型是列表:list.list是一种有序的集合,可以随时添加和删除其中的元素. 比如,列出班里所有同学的名字,就可以用一个list表示: > ...

  10. 系统调用fork()在powerpc上的源码分析

    总结一句话:系统调用的本质,通过sc指令触发异常,完成用户态到内核的转换. 展开一些:应用程序调用fork(),fork()是一个glibc函数,该函数的最底层调用sc指令,触发cpu异常,从而完成从 ...