第一章 corejava的入门一:什么是语言
语言=os+数据结构+算法+思想
os:操作系统
数据结构:队,栈,二叉树,链表
算法:做游戏开发时非常重要
面试题:int a>0,b>0只使用一条输出语句输出a,b的最大值
System.out.println((|a+b|+|a-b|)/2);
二:安装jdk
1)根据不同的操作系统下载不同的jdk
2)安装jdk
如果是windows,直接双击
如果是unix,在shell中运行
a)拷贝到家目录
b)sudo chmod 777 /opt
c)cp jdk_6u32_liunx_i586.bin /opt
d)cd /opt
e)sudo ./jdk_6u32_liunx_i586.bin
3)配置环境变量
在bashrc中配置环境变量,打开该文件,追加内容
vi ~/.bashrc
//添加以下内容
CLASSPATH=.
JAVA_HOME=/opt/jdk1.6.0_32
PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH JAVA_HOME PATH
CLASSPATH指定自己编写的class文件的路径
JAVA_HOME指定JDK的安装目录
三:JDK:java Development kit
Sun公司在推出Java语言的同时,也推出了Java的一系列开发工具,如JDK——Java Development Kit(Java开发工具包)。
可以从网上免费下载。通常以JDK的版本来定义Java的版本。
时间版本在Java标准函数库中的类(class)的数量
----------------------------------------------------------------------
1996 JDK1.0(Java1.0) 250 重点applet
1997 JDK1.1(Java1.1) 500 比较适于开发图形界面
1998 JDK1.2(Java2) 2300 可达到平台原始速度,
可用于书写正规企业级应用程序或移动应用程序
2000 JDK1.3(Java2)
2002 JDK1.4(Java2) 计算能力大幅度提升
2004 JDK1.5(Java5.0) 3500 对语言本身作重大改变,
更稳定、更安全、更高效
补充:JDK主要包括内容:
a)Java虚拟机:负责解析和执行Java程序。Java虚拟机可运行在各种平台上;
b)JDK类库:提供最基础的Java类及各种实用类。
https://www.doczj.com/doc/e47793101.html,ng, java.io, java.util, javax.swing,java.sql包中的类都位于JDK类库中。
c)开发工具:这些开发工具都是可执行程序,主要包括:
javac.exe 编译工具;
java.exe 运行工具;
javadoc.exe 生成JavaDoc文档的工具
jar.exe 打包工具等。
四:理解Java语言特征;
Java语言包括语法规则和语法规则的实现。Sun公司对Java语言有自己的一份参考实现:JDK。
a. 编程语言:语言本质即规则: 字符集、词法规则、句法规则(条件语句、循环语句等);桌面应用程序:拥有图形化用户接口的软件;服务器应用程序:通过浏览器访问运行;
b. 开发环境:开发程序,不管是桌面应用还是服务器应用,均需要JDK的支持。
c. 应用环境:面向应用程序,而不是开发系统程序或者硬件编程,比如说驱动就是系
统程序,系统程序一般用c语言
d. 部署环境:服务器应用程序需部署运行在服务器应用程序上,服务器本身也是一个Java程序,用Java语言编写的服务器应用程序部署运行时也需要Java语言的支持,将java代码打成一个包,部署到服务器这个过程叫做部署环境
五. 为什么发明Java?
为什么发明了java,换而言之,java有哪些优点呢?
a. 提供一个解释环境-----》JVM
1) 加速开发: Java当初目的是开发适用于智能化电子消费设备上的软件,它是基于
C++语言,但做了简化,能加速软件的开发过程
2) 一次编译到处运行: 跨平台
3) 多线程:多线程编程的简单性是Java成为流行的服务器端开发语言的主要原因之一
4) 支持动态更新: 软件代码文件的替换即更新
b. 提供一个比较容易的方式编程
1) 更健壮:没有指针、没有内存管理;
2) 纯粹的面向对象的编程:在Java中认为一切均是对象,对象有属性以及改变属性值的方法。通过Java编程围绕着构建对象的模板、实例化对象、调用对象的方法和属性等来进行。
c. 那么如何实现上面这些呢?
虚拟机JVM提供一个解释环境,让java代码可以运行。
垃圾回收机制让程序员无需在代码中进行内存管理。
代码安全校验保证java代码的安全性。
六. 理解Java虚拟机的特征;
Jvm是什么?简称java 虚拟机(java virtual machine),是用软件来模拟一个虚拟的环境。我们用java编写的源程序经过编译以后生成字节码文件,Jvm 提供了一个解释运行 java字节码文件的环境,只要在不同操作系统上安装了jvm后,就能对同一个java程序进行解释运行,这就java的跨平台,一次编译,到处运行。
七. 描述垃圾收集的概念;
什么叫垃圾回收:
1) 垃圾:无用对象所占据的内存空间;
垃圾回收:将无用对象所占据内存空间进行回收的过程;
为什么要垃圾回收?
1) 对象创建,需要占用内存空间,在一个程序运行过程中要创建无数个对象,如果对象永久占用内存,那么内存很快会消费光,倒致后续对象无法创建或者出现内存不足的错误。因此必须采取一定措施及时回收那些无用对象的内存,这样保证内存可以被重复利用。
C++等程序由程序员显示进行内存释放,这样有可能:
c:malloc() free()
c++:new delete
1) 忘记内存释放,倒致无端的内存占用;
2) 释放核心类库占用内存,倒致系统崩溃;
Java中垃圾回收处理:
1) 由虚拟机通过一个系统级的垃圾回收器线程自动完成,不会忘记也不会释放错,系统更加稳定;
Java中垃圾回收处理特点:
1) 由虚拟机通过垃圾回收器线程自动完成;
2) 只有当对象不再被使用,它的内存才有可能被回收;如果虚拟机认为系统不需要额外的内存,即便对象不再使用,内存
3) 程序无法显示迫使垃圾回收器立即执行垃圾回收,可以通过
https://www.doczj.com/doc/e47793101.html,ng.System.gc()/https://www.doczj.com/doc/e47793101.html,ng.Runtime.gc()建议虚拟机回收对象;
4) 垃圾回收器线程在释放无用对象占用内存之前会先行调用该对象的finalize()方法。该方法是否被调用以及被调用的时间极其不可靠。不建议重写。
5)https://www.doczj.com/doc/e47793101.html,ng.System.gc()或者https://www.doczj.com/doc/e47793101.html,ng.Runtime.gc()
都只是来通知系统应该处理垃圾
java中垃圾回收处理的算法:
1)标记清扫法
2)内存搬移法
八. 阐述Java平台代码安全实现策略;
Java虚拟机为Java程序提供运行时环境,其中一项重要的任务就是管理类,管理类的加载、连接和初始化;
1) 加载:查找并加载类的二进制文件(class文件),将其置于内存中。
2) 连接:
a. 验证:确保被加载类的正确性(有正确的内部结构,并且与其他类协调一致);
为什么要验证:Java虚拟机不知道某个特定的.class文件到底是由正常的Java编译器生成的,还是黑客特制的。
类的验证能提高程序的健壮性,确保程序被安全地执行。
类验证内容:
. 代码和jvm规范一致:语法和版本是否兼容
. 代码不能破坏系统的完整性
. 没有堆栈的上溢和下溢
. 参数类型是正确的
. 类型转换的正确的
b. 准备:为类的静态变量分配内存,并将其初始化为默认值;
c. 解析:把类中的符号引用转换为直接引用(一个指向所调用方法在方法区内的内存位置的指针);
3) 初始化:给类的静态变量赋予正确的初始值;
即时编译器(JIT compiler,just-in-time compiler)是一个把Java的字节码(包括需要被解释的指令的程序)转换成可以直接发送给处理器的指令的程序。
8020规则:有80%的常用功能只用有20%的常用代码是经常使用的,Inter公司。
这个是个专业的人区完成的,完成之后会安装在JVM中,我们使用就可以了。
九. 定义类、包和应用程序;
1) Java的工作方式:
源代码: 编写Java源代码文件
|
编译器: 用编译器编译源代码。编译器会检查错误,如果有错就要改正才能产生正确的输出。
|
输出: 编译器会产生字节码。任何支持Java的装置都能够把它转译成可执行的内容。编译后的字节码与平台无关。
|
Java虚拟机: 可以读取与执行字节码。加载指定类,开始执行它的main方法,然后一直运行到main的所有程序代码结束为止。
2) Java的程序结构:
a. 源文件:包含Java代码(按java语法规则编写的内容)的文件;
特征:
i. 以java作为后缀;
ii. 可以包含多个类/接口;
iii.名称与类名(只包含一个类/接口)或public修饰的类/接口(包含多个类/接口)同名;
结构:
i. 包的声明语句(可有可无,如有只能有一行,且位于最前面);
package的作用:
1.使用文件来进行层次管理的class
2.在同一个包中不能出现相同的类名,避免命名冲突。
3.一旦起了包名,类名就发生改变.
包名.类名====>权限类名
ii. import语句(可有可无, 可有多行,紧跟着包的声明语句);
iii.类的声明语句();
b. 类:
Java代码组织的单位, Java代码都是以一个个类形式组织的。用Java语言编写程序其实就是编写一个个类;一个类里的语句内容用大括号括起来,一个类里带有零至多个方法。
结构:
i. 类的声明语句,例:
public class HelloWorld
ii. 类的内容语句,用大括号括起来:
(1) 属性;
(2) 方法:
c. 方法:类似于其它语言里的函数或过程。方法里带有零至多行语句。
结构:
i. 方法的声明语句,例:
public static void main(String[] args)
ii. 方法体,用大括号括起来:1) 属性;(2) Java语句;
d. Main方法:
Java虚拟机执行Java程序时,首先执行调用的方法。main方法又叫程序的入口方法或起点方法。不管你的程序有多大,
不管你的程序有多少个类,一定都会有一个main()方法来作为程序的起点。
3) 剖析类:
public class FirstJavaProgram{
public static void main(String[] args) {
System.out.println("Hello Java, I am your fans!");
}
}
public: 公开给其它类存取;
class: 类声明的关键字;
FirstJavaProgram: 类的名称;
void: 方法的返回值;
main: 方法的名称;
String[]: 数组类型;
rgs: 参数名称;
System.out.println: 打印到标准输出上(默认为命令行)
"Hello Java, I am your fans!": 要输出的字符串内容;
; 每一行语句必须用分号结尾;
十. 编码、编译以及运用Java应用程序;
1)编写:vi 类名.java
用记事本打开类名.java
2)编译:
javac -d bin src/类名.java
3)运行:
java -cp bin 包名.类名
-d:指定编译后的class文件存放的路径。编译时连同packge一起编译
-cp:-classpath的缩写,指定执行
class文件的搜索路径的。
补充:
类装载机制:双亲委托机制
1)启动类装载器:$JAVA_HOME/jre/lib/rt.jar
2)扩展类装载器:$JAVA_HOME/jre/lib/ext
3)系统类装载器:$CLASSPATH
双亲委托机制:向上委托,向下加载
本机运行.class都是从系统类装载器
一个完整的Java程序运行过程会涉及以下内存区域
方法区/代码区:存放类的信息
堆区:用来存放动态产生的数据,比如new出来的对象。注意创建出来的对象只包含属于各自的成员变量,并不包括成员方法。因为同一个类的对象拥有各自的成员变量,存储在各自的堆中,但是他们共享该类的方法,并不是每创建一个对象就把成员方法
复制一次。
栈区:保存局部变量的值,包括:1.用来保存基本数据类型的值;2.保存类的实例,即堆区对象的引用(指针)。也可以用来保存加载方法时的帧
PC寄存器:指向下一条需要执行的指令,将该数据传递给CPU
常量池:JVM为每个已加载的类型维护一个常量池,常量池就是这个类型用到的常量
的一个有序集合。常量池存在于堆中。
数据段/静态存储区:用来存放static定义的静态成员。
第二天:
目标: 1. 标识符、关键字和类型介绍;
2. 如何构建类?
------------------------------------------------------------
第二章: Identifiers, Keywords and Types
目标:1. 注释作用:使部分内容只为程序员可见,不为编译器所编译、虚拟机所执行;增加程序的可读性
位置:类声明前后、方法声明前后、属性声明前后、方法体中。几乎可以在一个源文件任意位置,但不能在一个关键字字符中插入注释。
类型:1) 单行注释://text——从"//"到本行结束的所有字符均作为注释而被编译
器忽略
2) 多行注释:/*text*/——从"/*"到"*/"间的所有字符会被编译器忽略
3) 文档注释:/** text */——从"/**"到"*/"间的所有字符会被编译器忽略。当
这类注释出现在任何声明(如
类的声明、类的成员变量的声明或者类的成员方法的声明)之前时,会作为JavaDoc文档的内容;
示例:1) //package declaration
package ch01; //允许;
2) package /*package declaration*/ch01; //允许;
3) class /*class declaration*/ FirstJavaProgram { //允许;
...}
4) System.out./*out content to console*/println("Hello Java"); //
允许;
5) System.out.print/*out content to console*/ln("Hello Java"); //
不允许;
javadoc -d doc -author -version *.java
2. 分号、块和空格
1) 每个语句短语以;结束 ;
2) 代码段以{}结束;
3) 空白处(空格、tab键、新行和回车(几个语句短语连接在一起))是无关紧要的。
3. 标识符:类、方法和变量的名字
1) java标识符以字母、_和$开头,不能以数字开头,后跟字母、数字、“_”和“$”的组合;
2) 大小写敏感
3) 没有长度限制。
4) 不能使用java的关键字
举例:合法标识符非法标识符
try try#
GROUP_7 7GROUP
openDoor open-door
boolean1 boolean
4. 关键字
Java语言的关键字是程序代码中的特殊字符。包括:
. 类和接口的声明——class, extends, implements, interface
. 包引入和包声明——import, package
. 数据类型——boolean, byte, char, double, float, int, long, short
. 某些数据类型的可选值——false, true, null
. 流程控制——break, case, continue, default, do, else, for, if, return, switch, while
. 异常处理——catch, finally, throw, throws, try
. 修饰符——abstract, final, native, private, protected, public, static, synchronized, transient, volatile
. 操作符——instanceof
. 创建对象——new
. 引用——this, super
. 方法返回类型——void
Java语言的保留字是指预留的关键字,它们虽然现在没有作为关键字,但在以后的升级版本中有可能作为关键字。
. 所有关键字都是小写;
. friendly, sizeof不是Java语言的关键字,这有别于C++;
. 程序中标识符不能以关键字命名;
5. 基本类型:程序的基本功能是处理数据,程序用变量来表示数据;
程序中必须先定义变量才能使用;定义变量是指设定变量的数据类型和变量的名字,定义变量的基本语法为:
数据类型变量名;
Java语言把数据类型分为基本类型和引用类型。
------------------------------------------------------------
基本类型数值类型浮点数类型 float
double
整数类型 byte
short
int
long
字符类型 char
boolean
------------------------------------------------------------
引用类型引用类类型
接口类型
数组类型
------------------------------------------------------------
接下来,我们主要关注基本数据类型,关注各种基本数据类型有什么样的取值范围?占用多少内存空间?
6. boolean类型
位置boolean类型变量取值
------------------------------------------------------------
Java源程序只能是true或false
class文件用int或byte表示boolean
虚拟机中用整数0来表示false, 有任意一个非零整数表示true
强调,在Java源程序中不允许把整数或null赋给boolean类型的变量,这是有别于其它语言(如c语言)的地方. 例:
boolean isMarried = 0; //编译出错,提示类型不匹配
boolean isMarried = null; //编译出错,提示类型不匹配
7. 文本数据类型——char和String
1) 字符编码:Java语言对文本字符采用Unicode字符编码。由于计算机内存只能存取二进制数据,因此必须为各个字符
进行编码。所谓字符编码,是指用一串二进制数据来表示特定的字符。常见的字符编码包括:
a. ASCII字符编码
ASCII--Amecian Standard Code for Information Interchange(美国信息交换标准代码). 主用于表达现代英语
和其他西欧语言中的字符。它是现今最通用的单字节编码系统,它只用一个字节的7位,一共表示128个字符。
b. ISO-8859-1字符编码,又称为Latin-1, 是国际标准化组织(ISO)为西欧语言中的字符制定的编码,
用一个字节(8位)来为字符编码,与ASCII字符编码兼容。所谓兼容,是指对于相同的字符,它的ASCII字符编码
和ISO-8859-1字符编码相同。
c. GB2312字符编码
它包括对简体中文字符的编码,一共收录了7445个字符(6763个汉字+682个其他字符. 它与ASCII字符编码兼容。
d. GBK字符编码
对GB2312字符编码的扩展,收录了21886个字符(21003个字符+其它字符), 它与GB2312字符编码兼容。
e. Unicode字符编码:
由国际Unicode协会编制,收录了全世界所有语言文字中的字符,是一种跨平台的字符编码。
UCS(Universal Character Set)是指采用Unicode字符编码的通用字符集。
Unicode具有两种编码方案:
. 用2个字节(16位)编码,被称为UCS-2, Java语言采用;
. 用4个字节(32位)编码,被称为UCS-4;
f. UTF字符编码
有些操作系统不完全支持16位或32位的Unicode字符编码,UTF(UCS Transformation Format)字符编码能够把
Unicode字符编码转换为操作系统支持的编码,常见的UTF字符编码包括UTF-8, UTF-7和UTF-16.
2) char的几种可能取值
Java语言采用UCS-2字符编码,字符占2个字节。
字符a的二进制数据形式为 0000 0000 0110 0001
十六进制数据形式为 0x0061
十进制数据形式为 97
以下4种赋值方式是等价的:
char c = 'a';
char c = '\u0061'; //设定"a"的十六进制数据的Unicode字符编码
char c = 0x0061; //设定"a"的十六进制数据的Unicode字符编码 char c = 97; //设定"a"的十进制数据的Unicode字符编码
3) 转义字符
Java编程人员在给字符变量赋值时,通常直接从键盘输入特定的字符,而不会使用Unicode字符编码,因为很难记住各
种字符的Unicode字符编码值。对于有些特殊字符,比如单引号,如不知道它的Unicode字符编码,直接从键盘输入编
译错误:
char c = '''; //编码出错
为了解决这个问题,可采用转义字符来表示单引号和其他特殊字符:
char c = '\'';
char c = '\\';
转义字符以反斜杠开头,常用转义字符:
\n 换行符,将光标定位到下一行的开头;
\t 垂直制表符,将光标移到下一个制表符的位置;
\r 回车,将光标定位到当前行的开头,不会移到下一行;
\\ 反斜杠字符
\' 单引号字符
8. 整数类型
byte, short, int和long都是整数类型,并且都是有符号整数。与有符号整数对应的是无符号整数,两者的区别在于
把二进制数转换为十进制整数的方式不一样。
. 有符号整数把二进制数的首位作为符号数,当首位是0时,对应十进制的正整数,当首位是1时,对应十进制的负整
数。对于一个字节的二进制数, 它对应的十进制数的取值范围是-128 - 127。
. 无符号整数把二进制数的所有位转换为正整数。对于一个字节的二进制数, 它对应的十进制数的取值范围是0 - 255。
在Java语言中,为了区分不同进制的数据,八进制数以“0”开头,十六制以“0x”开头。举例:
一个字节的二进制数八进制数十六进制数有符号十进制数无符号十进制数
-------------------------------------------------------------------------------------------------
0000 0000 0000 0x00 0 0 1111 1111 0377 0xFF -1 255 0111 1111 0177 0x7F 127 127
1000 0000 0200 0x80 -128 128
如果一个整数值在某种整数类型的取值范围内,就可以把它直接赋给这种类型的变量,否则必须进行强制类型的转换。
byte = 13;
如129不在byte类型的取值范围(-128-127)范围内,则必须进行强制类型的转换。
byte b = (byte)129; //变量b的取值为-127.
如果一个整数后面加上后缀——大写"L"或小写"l", 就表示它是一个long 类型整数。以下两种赋值是等价的:
long var = 100L; //整数100后面加上大写的后缀"L",表示long 型整数;
long var = 100l; //整数100后面加上大写的后缀"l",表示long型整数;
Java语言允许把八进制数(以"0"开头), 十六进制数(以"0x"开头)和十进制数赋给整数类型变量,例如:
int a1 = 012; //012为八进制数,变量a1的十进制取值为10
int a2 = 0x12; //0x12为十六进制数,变量a2的十进制取值为18
int a3 = 12; //12为十进制数,变量a3的十进制取值为12 int a4 = 0xF1; //0xF1为十六制数,变量a4的十进制取值为241
?? byte b = (byte)0xF1 //0xF1为十六制数,变量b的十进制取值为-15
9. 浮点类型
浮点类型表示有小数部分的数字。Java中有两种浮点类型:
. float: 占4个字节,共32位,称为单精度浮点数;
. double: 占8个字节,共64位,称为双精度浮点数;
float和double类型都遵循IEEE754标准,该标准分别为32位和64位浮点数规定了二进制数据表示形式。
float=1(数字符号)+8(指数,底数为2)+23(尾数)
double=1(数字符号)+11(指数,底数为2)+52(尾数)
在默认情况下,小数及采用十进制科学计数法表示的数字都是double类型,可以把它直接赋值给double类型变量。
double d1 = 1000.1;
double d2 = 1.0001E+3; //采用十进制科学计数法表示的数字,d2实际取值为1000.1
double d3 = 0.0011;
double d4 = 0.11E-2; //采用十进制科学计数法表示的数字,d4实际取值为0.0011
如果把double类型的数据直接赋给float类型变量,有可能会造成精度的丢失,因此必须进行强制类型的转换,否
则会导致编译错误,例如:
float f1 = 1.0 //编译错误,必须进行强制类型转换;
float f2 = 1; //合法,把整数1赋值给f2,f2的取值1.0; float f3 = (float)1.0; //合法,f3的取值为1.0;
float f4 = (float)1.5E+55; //合法, 1.5E+55超出了float类型的取值范围,
f4的取值为正无穷大
System.out.println(f3); //打印1.0;
System.out.println(f4); //打印Infinity
----------------------------------------------------------------------------------------------------
Float.NaN 非数字
Float.POSITIVE_INFINITY 无穷大
Float.NEGATIVE_INFINITY 负无穷大
float f1 = (float)(0.0/0.0); //f1的取值为Float.NaN