Java语言程序设计-第10版notes

半城伤御伤魂 提交于 2020-03-07 16:59:59

第1章 计算机、程序和Java概述

部分章节小结

1、编程错误可以分为三类:语法错误、运行时错误和逻辑错误。编译器报告的错误称为语法错误或者编译错误;运行时错误指引起程序非正常结束的错误;而当一个程序没有按照预期的方式执行时,产生逻辑错误 。

第2章 基本程序设计

部分章节小结

1、拓宽类型不需要显式转换,缩窄类型必须显式完成。

123456
int i=9;double d=i;//缩窄类型转换double d=9.0;int i=(int)d;

2、计算机科学中,1970年1月1日午夜零点为UNIX时间戳。

第3章 选择

部分章节小结

1、除开赋值操作符的所有二元操作符都是左结合的,赋值操作符是右结合的。(此处的结合指的是结合律)

123456
//以下两个表达等价a-b+c-d((a-b)+c)-d//以下两个表达等价a=b+=c=5a=(b+=(c=5))

第4章 数学函数、字符和字符串

部分章节小结

1、字符 ‘ ‘ 、t、 f、 r 和 n 都称为空白字符。
2、字符可以基于它们的Unicode码使用关系操作符进行比较。

第6章 方法

部分章节小结

1、程序模块化和可重用性是软件工程的中心目标之一。
2、方法可以重载,这意味着两个方法可以拥有相同的方法名,只要它们的参数列表不同即可。
3、方法抽象是把方法的应用和实现分离,用户可以在不知道方法是如何实现的情况下使用方法。方法的实现细节封装在方法内,对调用该方法的用户隐藏。这称为信息隐藏或封装。
4、方法抽象将程序模块化为整齐、层次分明的形式。将程序写成简洁的方法构成的集合会比其他方式更容易编写、调试、维护和修改。这种编写风格也会提高方法的可重用性。
5、当实现一个大型程序时,可以使用自顶向下或者自底向上的编码方法。不要一次性编写完整个程序。这种方式似乎浪费了更多的编码时间(因为要反复编译和运行这个程序),但实际上,它会节省时间并使得调试更为容易。

第7章 一维数组

部分章节小结

1、创建数组时推荐使用 elementType[] arrayRefVar风格
2、不同于基本数据类型变量的声明,声明数组变量并不会给数组分配任何空间。数组变量不是基本数据类型变量。数组变量包含的是对数组的引用。
3、将数组参数传递给方法时,实际上传递的是数组的引用;更准确地说,被调用的方法可以修改调用者的原始数组的元素。
4、数组初始化语法:
elementType[] arrayRefVar={value0,value1,…,valuek};

第9章 对象和类

部分章节小结

1、类是一种数据类型。可以用它声明对象引用变量。对象引用变量中似乎存放了一个对象,但是事实上,它包含的只是对该对象的引用。严格来说,对象引用变量和对象是不同的,但是大多数情况下,它们的区别是可以忽略的。
2、所有传递给方法的参数都是值传递的,对于基本类型的参数,传递的是实际值;而如果参数是引用数据类型,则传递的是对象的引用。

第10章 面向对象思考

部分章节小结

1、面向过程范式重在设计方法。面向对象范式将数据和方法耦合在对象中。使用面向对象范式的软件设计重在对象和对象的操作。面向对象方法结合了面向过程范式的功能以及将数据和操作集成在对象中的特点。
2、许多Java方法要求使用对象作为参数。Java提供了一个便捷的方法,将基本数据类型合并或包装到一个对象中。
3、Java可以根据上下文自动地将基本类型值转换到对应的包装对象,反之亦然。

第11章 继承和多态

部分章节小结

1、构造方法可以调用重载的构造方法或者它的父类的构造方法。这种调用必须是构造方法的第一条语句。如果没有显示地调用它们中的任何一个,编译器就会把super()作为构造方法的第一条语句,它调用的是父类的无参构造方法。
2、实例方法只有在可访问时才能重写。这样,私有方法是不能重写的,因为它是不能在类本身之外访问的。如果子类中定义的方法在父类中是私有的,那么这两个方法是完全没有关系的。
3、Java中的每个类都继承自java.lang.Object类。
4、如果一个方法的参数类型是父类,可以向该方法的参数传递任何子类的对象。这称为多态。
5、因为子类的实例总是它的父类的实例。所以,总是可以将一个子类的实例转化成一个父类的变量。当把父类实例转换成它的子类变量时,必须使用转换记号(子类名)进行显式转换,向编译器表明你的意图。
6、当从引用变量调用实例方法时,该变量的实际类型在运行时决定使用该方法的哪个实现。这称为动态绑定。

大专栏  Java语言程序设计-第10版notes-异常处理和文本IO">第12章 异常处理和文本IO

部分章节小结

1、Java异常是扩展自java.lang.Throwable的类的实例。Java本身提供大量预定义的异常类,当然也可以通过扩展Exception类来定义自己的异常类。
2、异常发生在一个方法的执行过程中。RuntimeException和Error都是免检异常,所有其他的异常都是必检的。
3、声明异常的关键字是throws,而抛出异常的关键字是throw。
4、如果调用声明了必检异常的方法,必须将该方法调用放在try语句中。在方法执行过程中出现异常时,catch块会捕获并处理异常。
5、如果一个异常没有被当前方法捕获,则该异常被传给调用者。这个过程不断重复直到异常被捕获或者传递给main方法。
6、在catch块中,异常的指定顺序是非常重要的。如果在指定一个类的异常对象之前,指定了这个异常类的父类的异常对象,就会导致一个编译错误。
7、当方法中发生异常时,如果异常没有被捕获,方法将会立刻退出。如果想在方法退出前执行一些任务,可以在方法中捕获这个异常,然后再重新抛给它的调用者。
8、任何情况下都会执行finally块中的代码,不管try块中是否出现了异常,或者出现后是否捕获了该异常。

第13章 抽象类和接口

部分章节小结

1、抽象类和常规类一样,都有数据和方法,但是不能用new操作符创建抽象类的实例。
2、非抽象类中不能包含抽象方法。如果抽象类的子类中没有实现所有被继承的父类抽象方法,就必须将该子类也定义为抽象类。
3、包含抽象方法的类必须是抽象类。但是抽象类可以不包含抽象的方法。
4、即使父类是具体的,子类也可以是抽象的。
5、接口是一种与类相似的结构,只包含常量和抽象方法。接口在许多方面与抽象类很相近,但抽象类除了包含常量和抽象方法外,还可以包含变量和具体方法。
6、在 Java 中,接口被认为是一种特殊的类。就像常规类一样,每个接口都被编译为独立的字节码文件。
7、接口java.lang.Comparable定义了compareTo方法。Java类库中的许多类都实现了 Comparable。
8、接口 java.lang.Cloneable 是一个标记接口。实现Cloneable接口的类的对象是可克隆的。
9、个类仅能继承一个父类,但一个类却可以实现一个或多个接口。
10、一个接口可以继承一个或多个接口。

第19章 泛型

部分章节小结

1、泛型具有参数化类型的能力。可以定义使用泛型类型的类或方法,编译器会用具体类型来替代泛型类型。
2、泛型的主要优势是能够在编译时而不是运行时检测错误。
3、泛型类或者方法允许指定这个类或者方法可以带有的对象类型。如果试图使用带有不兼容对象的类或者方法,编译器会检测出这个错误。
4、定义在类、接口或者静态方法中的泛型称为形式泛型类型,随后可以用一个实际具体类型来替换它。替换泛型类型的过程称为泛型实例化。
5、不使用类型参数的泛型类称为原始类型,例如ArrayList。使用原始类型是为了向后兼容Java较早的版本。
6、通配泛型类型有三种形式:?、? extends T 和 ? super T,这里的T代表一个泛型类型。第一种形式?称为非受限通配,它和 ? extends Object是一样的。第二种形式 ? extends T 称为受限通配,代表T 或者T的一个子类型。第三种类型 ? super T 称为下限通配,表示T或者T的一个父类型。
7、使用称为类型消除的方法来实现泛型。编译器使用泛型类型信息来编译代码,但是随后消除它。因此,泛型信息在运行时是不可用的。这个方法能够使泛型代码向后兼容使用原始类型的遗留代码。
8、不能使用泛型类型参数来创建实例。
9、不能使用泛型类型参数来创建数组。
10、不能再静态环境中使用类的泛型类型参数。
11、在异常类中不能使用泛型类型参数。

第30章 多线程和并行程序设计

部分章节小结

1、每个任务都是Runnable接口的实例。线程就是一个便于任务执行的对象。可以通过实现Runnable接口来定义任务类,通过使用Thread构造方法包住一个任务来创建线程。
2、一个线程对象被创建后,可以使用start()方法启动线程,可以使用sleep(long)方法将线程转入休眠状态,以便其它线程获得运行的机会。
3、线程对象从来不会直接调用run方法。到了执行某个线程的时候,Java虚拟机调用run方法。类必须覆盖run方法,告诉系统线程运行时将会做什么。
4、为了避免线程破坏共享资源,可以使用同步的方法或块。同步方法在执行前需要获得一个锁。当同步方法是实例方法时,锁是 在调用方法的对象上;当同步方法是静态(类)方法时,锁是在方法所在的类上。
5、在执行方法中某个代码块时,可以使用同步语句获得任何对象上的锁,而不仅是this对象上的锁。这个代码称为同步块。
6、可以使用显式锁和条件,以及对象的内置监视器来便于进程之间的通信。
7、Java集合框架提供的阻塞队列(ArrayBlockingQueue,LinkedBlockingQueue,PriorityBlockingQueue)自动地同步对队列的访问。
8、可以使用信号量来限制访问共享资源的并行任务数量。
9、如果两个或更多的线程获取多个对象上的锁时,每个线程都有一个对象上的锁并等待另一个对象上的锁,这时就有可能发生死锁现象。使用资源排序技术可以避免死锁。
10、JDK7的Fork/Join框架被设计用于开发并行程序。可以定义一个继承自RecursiveAction或者RecursiveTask的任务类,在ForkJoinPool中并行执行任务类,并在所有任务执行完后得到整体的解答。

第31章 网络

部分章节小结

1、Java支持流套接字和数据报套接字。流套接字用TCP(传输控制协议)来进行数据传输,而数据报套接字用UDP(用户数据报协议)。由于TCP协议检测丢失的传输并且重新提交它们,所以,传输是无损和可靠的。相反地,UDP不能保证传输是无损的。
2、要创建一个服务器,必须先使用语句new ServerSocket(port)获取一个服务器套接字。在创建服务器套接字后,可以启动服务器,使用服务器套接字上的accept()方法监听连接请求。客户端使用new Socket(serverName,port)来创建一个客户端套接字,用于向服务器发送连接请求。
3、当服务器与客户端的连接建立后,流套接字通信与输入输出流通信非常相似。可以通过套接字上的getInputStream() 方法获得一个输入流,通过getOutputStream()方法获得一个输出流。
4、一个服务器经常同时与多个客户端协同工作。通过为每个连接创建一个线程,可以利用线程同时处理服务器的多个客户端。

参考

Java语言程序设计(基础篇 原书第10版)
Java语言程序设计(进阶篇 原书第10版)

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!