《java语言程序设计-基础篇》笔记一

时间:2023-02-08 22:16:39

第一章、计算机、程序和java概述
*处理器
CPU由两部分组成:控制单元和算术/逻辑单元
控制单元用于控制和协调除CPU之外其他组件的动作
算术/逻辑单元用于完成数值运算和逻辑运算
每台计算机都有一个内部时钟,该时钟以固定速度发射电子脉冲。这些脉冲用于控制和同步各种操作的步调。时钟速度越快,它在给定时间段内执行的指令就越多。时钟速度的计量单位是赫兹,计算机的时钟速度通常以兆赫来表示(1兆赫兹=100万赫兹)

内存
为了存储和处理信息,计算机利用电的两种状态:关和开,习惯上任务分别表示0和1
0和1被解释为二进制数字系统中的数。内存单元是由字节(byte)构成的有序序列

字节是最小的存储单元

任何两个数据都不能共享或分割同一个字节

内存中字节的内容永远非空

因为可以按任意顺序存取字节,所以内存也被称为随机访问存储器(random-access memory ,RAM)

同CPUC一样,内存也是内置在一个表面上嵌有成千晶体管的硅半导体芯片上。与CPU芯片相比,内存芯片更便宜、低速、简单

驱动器(drive)是对存储介质进行操作的设备,例如,磁盘、光盘和磁带等都是存储介质

光盘驱动器的类型有两种:只读光盘(CD-R)和可擦写光盘(CD-RW)

磁带(tape)是顺序存储信息的

分辨率越高,图像越锐化,越清晰
点距(dot pitch)是指像素之间以毫米为单位的距离。点距越小,显示效果越好

计算机本身的语言就是它的机器语言(machine language)–最初植入计算机的一套原始指令集。这些指令都以二进制代码的形式存在

汇编语言(assembly language)用助记符表示每一条机器语言指令

用汇编器(assembler)将汇编语言转为机器语言

汇编语言具有机器依赖性

使用编译器(compiler)将源程序编译成机器语言程序,然后机器语言程序再与其他辅助的库代码进行链接,构成可执行文件,然后就可以在机器上运行

许多操作系统都支持像多道程序设计(multiprogramming)、多线程(multithreading)、多处理(multiprocessing)

能在web浏览器中运行的java程序称为java小程序(applet)

java有三个版本:
java标准版 java standard edition,java se
java企业版 java enterprise edition,java ee
java微型版 java micro edition,java me
java se可用来开发客户端独立的应用程序或applet,java ee用来开发服务端的应用程序,java me用来开发移动设备的应用程序

jdk是一套独立程序构成的集合,每个程序都是从命令行调用的,用于开发和测试java程序

控制台(console)是指计算机的文本输入和显示设备

方法是包含语句的结构体

行注释、块注释

文件名必须与公用类名完全相同

java字节码是低级语言,类似于机器指令,但它是体系结构中立的
虚拟机是一个解释Java字节码的程序

执行java程序就是运行程序的字节码。解释的过程就是一次将字节码中的单独的一步翻译为目标机器语言代码,而不是将整个程序翻译成单独的一块。翻译完一步后就立即执行这一步

在执行一个java程序时,JVM首先会用类加载器(class loader)将类的字节码加载到内存中,如果有其他类,类加载程序会在需要他们之前动态地加载他们。加载后,JVM使用字节码验证器(bytecode verifier)检验字节码的合法性,确保字节码不会违反Java的安全规范

import语句有两种类型:明确导入specific import和通配符导入wildcard import
明确导入是指将某个单独类放在import语句中,通配符导入是指导入一个包中所有的类

system.out.println(“welcome to java);中用到的system类并没有被导入,是因为它在java.lang包内。java.lang包内的所有类在每个java程序中都被隐式导入

使用javac命令可以从命令行编译Java源代码
使用java命令可以从命令行运行java类

第二章、基本程序设计
在源代码中,字符串常量不能跨行

java并不支持控制台输入,但是可以使用scanner类创建它的对象,以读取来自system.in的输入

print和println方法类似,不同之处在于:当显示完字符串之后,println会将光标移动下一行,而print不会

只有当被除数是负的时候,余数才是负的

涉及浮点数的计算都是近似的,因为这些数没有以准确的精度来存储

直接量literal是指在程序中直接出现的常量值
默认情况下,整数直接量是一个十进制整数,要表示一个八进制整数直接量,就用0(零)开头,而要表示一个十六进制整数直接量,就用0x或0X(零x)开头

在数字后面直接加f,d,F,d表示浮点型

因为1970年是UNIX操作系统正式发布的时间,所以这一时间也称为UNIX时间戳(UNIX epoch)

类型转换不改变被转换的量
如果要将一个值赋值给一个范围较小的变量,如double赋给int,则必须进行类型转换,若没转换,就会出现编译错误

字符串直接量必须括在双引号中,而字符直接量括在单引号中

计算机内部使用二进制数,一个字符在计算机中是以0和1构成的序列的形式来存储的。将字符映射为它的二进制形式的过程称为编码(encoding)。字符有多种不同的编码方式,编码表(encoding scheme)定义该如何编码每个字符

java支持统一码(unicode)

大多数计算机采用ASCII码(美国标准信息交换码)

将一个整数转换成一个hcar型数据时,只用到该数据的低十六位,其余部分被忽略

在0到FFFF之间的任何一个十六进制正整数都可以隐式地转换成字符型数据。而任何不在此范围内的其他数值都必须显示地转换为char型

String实际上与System类、JOptionPane类和Scanner类一样,都是一个java库中预定义的类。string类型不是基本类型,而是引用类型(reference type)

next()方法读取以空白字符结束的字符串(即”,’\t’,’\f’,’\r’,’\n’)

第三章、选择

一个char型值可以转换为int型,反之亦然。但是,一个布尔型值不能转换为其他类型的值,其他类型的值也不能转换为布尔类型值

向下贯通行为(fall-through behavior):一旦匹配一个case,就从匹配的case处开始执行,直到遇到break或者达到switch的末端

第四章、循环

另一种控制循环的常用技术是在读取和处理一个集合的值时指派一个特速的值。这个特殊的值称为标志值(sentinel value),用以表明循环的结束。如果一个循环使用标志值来控制它的执行,它就称为标志位控制的循环(sentinel-controlled loop)

在循环控制中,不要使用浮点值来比较值是否相等

输入重定向(inout redirection):程序从文件中读取输入,而不是让用户在运行时从键盘输入数据

for循环中的初始动作,每次迭代后的动作可以是0个或者多个以逗号隔开的变量声明语句或赋值表达式

为了得到更精确的结果,仔细选择计算的顺序。在大数之前先增加小数是减小误差的一种方法。

第五章、方法

main方法与其他方法唯一区别在于它是由java虚拟机调用的
main中的语句可以调用main方法所在类中定义的其他方法,也可以调用别的类中定义的方法

调用一个方法时,系统都会将参数、局部变量存储在一个称为堆栈stack的内存区域中,它用后进先出的方式存储数据。

类型兼容是指不需要经过显式的类型转换,实参的值就可以传给形参

当一个字符和一个整数相加时,使用的是字符的统一码

被重载的方法必须具有不同的参数列表,不能基于不同修饰符或返回值来重载方法

可以在一个方法中的不同块里声明同名的局部变量,但是,不能在嵌套块中或同一块中两次声明同一部局部变量

math类的方法分为三类,三角函数方法(trigonametric method),指数函数方法(exponent method),和服务方法(service method)

每个字符都有唯一的在十六进制数0到FFFF(即十进制数的65535)之间的统一码

第六章、一维数组

一个数组变量实际上存储的是指向数组的引用

数组初始化语法中不使用new

处理数组元素时,经常会用到for循环

对于char类型的数组,可以使用一条打印语句打印

java支持一个简便的for循环,称之为for-each循环或增强型循环,不使用下标变量就可以顺序地遍历整个数组

将一个数组变量赋值给另一个数组变量,实际上是将一个数组的引用复制给另一个变量,使两个变量多指向相同的内存地址

可以使用arraycopy复制数组,但是此方法没有给目标数组分配内存空间。复制前必须创建目标数组以及分配给它的内存空间。

对于基本数据类型参数,传递的是实参的值
对于数据类型参数,参数值是数组的引用。如果改变方法中的数组,将会看到方法外的数组也变化了

JVM将数组存储在一个称作堆(heap)的内存区域中,堆用于动态内存分配,在堆中内存块可以按随意的顺序分配和释放

只能给方法指定一个可变长参数,同时该参数必须是最后一个参数,任何常规参数必须在它职之前。java将可变长参数当成数组对待

第七章、多维数组
第八章、对象和类

引用类型数据域的默认值是null,数值类型数据域的默认值是0,boolean类型数据域的默认值是flase,而char类型数据域的默认值是’\u0000’.但是,java没有给方法中的局部变量赋默认值

基本类型变量在内存中存储的是一个基本类型值,而引用类型变量存储的是一个引用,它指向对象在内存中的位置

在package packageName;语句之前不能有注释或空白

修饰符private只能应用在类的成员上。修饰符public可以应用在类或类的成员上。在局部变量上使用修饰符public和private都会导致编译错误

使用private修饰符将数据域声明为私有的,称为数据域封装

java只有一种传递方式:值传递(pass by value)

第九章、字符串和文本I/O

String变量存储的是对String对象的引用,String对象里存储的才是字符串的值

String对象是不可变的,它的内容是不能改变的

方法nextByte(),nextShort(),nextInt(),nextLong(),nextFloat(),nextDouble()和next()等都被称为令牌读取方法(token-reading method),因为它们会读取用分隔符分隔开的令牌,默认情况下,分隔符是空格

next()方法读取一个由分隔符分隔的字符串,但是nextLine()读取一个以行分隔符结束的行

第十章、关于对象的思考

要使一个量成为不可变的,它必须满足:
所有数据域都是私有的
没有修改器方法
没有一个访问器方法,它会返回一个指向可变数据域的引用

类的设计原则:
内聚性、一致性、封装性、清晰性、完整性

第十一章、继承和多态

java中不允许多重继承

如果一个类要设计为扩展的,最好提供一个无参构造方法以避免程序设计错误

面向对象程序设计的三个特点是:封装、继承、多态

总是可以将一个子类的实例转换为一个父类的变量(称之为向上转换upcasting),因为子类的实例永远是它父类的实例。当把一个父类的实例转换为它的子类变量(称之为向下转换downcasting)时,必须使用转换几号“(子类名)”进行显式转换

java关键字中的每个字母都是小写的