Java 笔记 # 一
*本系列文章为《Java语言程序设计》必修课笔记。
教材
- 教材
- 王素琴,《Java语言程序设计实用教程》,中国电力出版社
- 参考书
- 肖波,《Java语言程序设计》,清华大学出版社
- 陈国君,《Java程序设计基础》 ,清华大学出版社
Note
历史
- 1996年初,Sun公司发布了Java 1.0
- Java 5.0是对Java语言做出重大修改的版本(原来命名为1.5在04年JavaOne会议后版本变为5.0)
运行原理
- Java既是
编译型语言
又是解释型语言
。- Java的源程序代码必须通过编译器将其编译为Java字节码后才能运行,所以称之为编译型语言
- Java字节码不能直接运行,只能在Java虚拟机环境中被解释执行,因此称之为解释型语言。
- Java程序是由虚拟机负责解释执行,并非是操作系统,这样做的优点是可以实现
跨平台
,也就是说针对不同的操作系统只需要编写一次程序,然后通过不同版本的虚拟机执行即可。.
语言特点
- 简单性
- 基本语法与C++语言极为相似,如常用的条件语言、循环语句和控制语句等。但Java语言摒弃了C++语言中不易理解的部分。
- 面向对象
- 是一种纯粹的面向对象程序设计语言,除了基本数据类型以外,都是对象。
- 平台无关性
- Java语言经编译后生成与计算机硬件结构无关的字节码,这些字节码不依赖于任何硬件平台和操作系统。
- 安全性
- 引入了实时内存分配及布局来防止程序员直接修改物理内存布局。通过字节码验证器对字节码进行检验,防止网络病毒及其它非法代码侵入。
- 分布式
- 包括数据分布和操作分布。数据分布是指数据可以分散在不同主机之上,而操作分布是指把一个计算任务分散到不同主机上进行处理。
- 多线程
- 能够并行处理多项任务,可以大大提高程序的执行效率。
- 内存管理机制
- 采用自动垃圾回收机制进行内存的管理,可以自动、安全地回收不再使用的内存块。’
与C/C++的区别
不再有全局变量。
不再有#include 和#define 等预处理功能。
不再有structure、union及typedef等。
不再有全局函数、指针、多重继承。
不再有goto语句。
不再有操作符重载(Operatior Overloading)。
取消自动类型转换,要求强制转换。
自动进行内存管理。
Java=“C++”-“复杂性和奇异性”+“安全性和可移植性”
语言平台
- Java SE(Java Platform Standard Edition),为开发普通桌面和商务应用程序提供解决方案。
- Java EE(Java Platform Enterprise Edition),为开发企业级应用程序提供解决方案。
- Java ME(Java Platform Micro Edition),为在移动设备和嵌入式设备的应用程序提供解决方案。
虚拟机
Java虚拟机是运行Java程序的虚拟计算机,它解释Java字节码并执行代码要完成的操作。Java虚拟机与计算机硬件和操作系统相关,根据不同的操作系统开发相应的版本。
Java虚拟机由五部分组成,包括一组指令集
、一组寄存器
、一个栈
、一个无用单元收集堆
和一个方法区域
。
API
Java API是Java语言提供的类和接口的集合,目的是为应用程序与开发人员提供一套访问主机系统资源的标准方法。
Java开发工具包(Java Development Kit,JDK)是整个Java语言的核心,其中包括Java编译器、Java运行工具、Java文档生成工具和Java打包工具等。
Java程序运行时的环境工具JRE(Java Runtime Environment),Java虚拟机就包含在其中。
为了简化操作流程,在JDK中自带了JRE
,这样开发人员只需要在计算机上安装JDK即可,不需要专门安装JRE工具。
*安装配置过程略,网上任意搜索一文档即可。
编程规范
- 类名:首字母大写,多个单词合成一个类名时,每个单词的首字母要大写,如HelloWorld。
- 接口名:命名规则与类名相同。
- 方法名:常由多个单词合成,第一个单词首字母小写,其后每个单词的首字母都要大写,如showMessageDialog()。
- 变量名:全小写,一般为名词,如name。
- 常量名:基本数据类型的常量名为全大写,如果是由多个单词构成,可以用下划线隔开,如PERSON_COUNT。
编译运行
*详细步骤略。
*IDE安装略
习题
习题答案
(1) C .class
(2) A Java不支持多继承
(3) B java.lang
(4) D
(5) C
(问答题答案见博客正文,仅供参考
Java语言特点:1.简单 2.面向对象 3.平台无关性 4.安全性 5.支持分布式 6.支持多线程 等(仅供参考)
Java程序开发步骤:编辑源程序
、编译生成字节码
和 解释运行字节码
标识符
Java程序中使用的各种对象,如变量、方法、类、数组等都要有名字,这些名字称为标识符
。Java语言的标识符是大小写敏感。
Java语言中的标识符必须满足以下条件:
- 标识符只能包含字母、数字、下划线(_)和美元符号($);
- 标识符必须以字母、下划线和美元符号开头。
在所有合法的标识符中,有一些标识符被Java语言赋予特定含义,不允许用户对其重新定义,这些标识符称为保留字
(Reserved Word)。
在所有保留字中又有一些标识符对Java的编译器有特殊的意义,它们用来表示一种数据类型,或者表示程序的结构等,称之为关键字
(Keyword)。
数据类型
Java语言中的数据类型分为基本数据类型
和引用数据类型
两种。
- 基本数据类型:
- 声明变量后会立刻分配数据的内存空间
- 在其中存储的是数据值,数据占用的内存空间大小是固定的,与软硬件环境无关。
- 引用数据类型
- 在声明变量时不会分配数据的内存空间,只会分配一个空间用来存储数据的内存地址
Java语言的字符采用Unicode字符集编码方案
,每个字符占两个字节,以一个16位无符号整数来表示,取值范围是“\u0000”到“\uFFFF”,共65536个字符。
逻辑型数据只能
取true和false两个值,并且不能
与整型数据进行转换。
程序中出现的整型常量被看作int型,在内存中分配4个字节,如123。整型常量后面添加字母L或者l,被看作长整型常量,在内存中分配8个字节,如123L。
程序中出现的浮点型常量被看作为double型,在内存中分配8个字节,如1.23。
如果要将浮点型常量指定为float型,需要在它后面加上字母f或F,在内存中分配4个字节,如1.23f。
Java语言中数据类型转换分为自动类型转换
和强制类型转换
,自动类型转换是由系统自动完成,不需要程序做特殊说明,而强制类型转换要求程序显式说明。
不同类型的数据转换规则:
- 如果两个操作数中有一个是double型,则另一个操作数转换为double型;
- 否则,如果两个操作数中有一个是float型,则另一个操作数转换为float型;
- 否则,如果两个操作数有一个是long型,则另一个操作数转换为long型;
- 否则,两个操作数都被转换为int型。
Notice
- 即使是两个同为byte型的数据进行运算,也要先将两个数据转换为int型后再进行运算,运算结果也为int型。
- 由于boolean型只有true和false两个数值,且与整型及字符型不兼容,所以不能对boolean型数据进行转换。
自动类型转换都是将低精度数据转换为高精度数据,但在实际情况中有时需要将高精度数据转换为低精度数据,如将double型转化为int型,此时需要通过强制类型转换完成。
Notice
- 如果试图将一种类型的数据转换为另一种类型的数据,而又超出目标类型的表示范围,则会得到完全不同的数值。
运算符优先级
- 整数被0除会产生异常,而浮点数被0除会得到无穷大,因为浮点数中的0是一个无限接近0的数值,并不是真正的0值,所以相除后会得到无穷大的数值。
- Java语言中,取模运算%并不只限于整数之间的操作,也可以是浮点数,a%b与a-((int)(a/b)*b)的含义相同。取模支持对负数进行运算,
运算结果的符号总是与被除数的符号保持一致
。
x,y均为浮点型,进行相等比较时,要避免使用x==y,可以写为Math.abs(x-y)<1e-6,表示x与y的差值绝对值小于10-6。
Java语言中,位运算符只能用于整型和字符型数据
。
对于int型整数移位运算a>>b,由于int型长度为32个bit,系统先将b对32取模
,得到的结果才是真正移位的位数,例如a>>33和a>>1的结果相同。对于long型整数,则是先将b对64取模。
Java语言还提供了带标签的break语句,可以完成多重循环的跳转。
continue 同理。
一般情况下,不推荐使用带标签的break和continue语句。
Java语言内存分配的基本原理
- 栈内存中存储基本数据类型、对象引用变量和数组引用变量,当超出变量的作用域之后,Java会自动释放这些变量占用的内存空间,该内存空间可以立刻被另作他用。
- 堆内存用于存储数组和对象的数据。在堆内存中分配的内存,由Java虚拟机负责回收管理。
在堆内存中创建一个数组或者对象时,一般会将其在堆内存中的首地址赋值给栈内存中声明的变量,这个变量就是数组或者对象的引用变量。
为了使栈内存空间中的引用变量有初始值,Java提供了一个特殊的引用类型常量null,表示该引用变量不指向堆内存中的地址。
数组
Java语言将数组的定义分为数组声明
和数组创建
两步。
数组声明是声明数组名和数组元素的类型,数组创建是为数组元素分配内存空间。
声明方式:
数据类型[] 数组名;
数据类型 数组名[];
方括号[]是数组的标志。在数组声明时并不为数组元素分配空间,只是在栈内存中为数组名(引用变量)分配了空间,但值未定。
数组创建格式为:
数组名 = new 数据类型[元素个数];
其中数据类型必须与数组声明中的数据类型一致,元素个数必须是整型常量。
数组一旦定义之后,就不能改变数组元素的个数,但是可以使数组名指向一个全新的数组空间,但原来的数组空间将丢失。
数组被看作是对象,它有一个属性length表示数组的长度。
foreach循环中只允许访问数组元素,而不允许修改数组元素。
如果是赋值元素而不是共用空间:
二维数组:
//声明
数据类型[][] 数组名;
数据类型[] 数组名[];
数据类型 数组名[][];
//创建
数组名 = new 数据类型[n][m];
Java语言中的二维数组中每一行的元素个数可以相同,也可以不同
。如果元素个数相同,称为规则二维数组。如果每行元素个数不同,称为不规则二维数组,这时每行的一维数组都需要单独创建。
不规则二维数组创建方式:
数据类型[][] 数组名 = new 数据类型[n][];
数组名[0] = new 数据类型[m1];
数组名[1] = new 数据类型[m2];
︙
数组名[n-1] = new 数据类型[mn];
二维数组初始化:
字符串
在Java语言中,字符串是用类的对象来表示的。
程序中用到的字符串分为两类,一类是创建之后不能再被修改的字符串,用String类对象来表示;另一类是创建之后允许被修改的字符串,用StringBuffer类对象表示。
采用new种形式创建的字符串对象,会在堆内存中为其分配空间,并且即使字符串对象与之前创建的字符串对象内容相同仍然会再次分配空间。