1. 计算机语言的发展历史
机器语言 - 汇编语言 - 高级语言
高级语言包含哪些
面向过程:C, Fortran,PASCAL
面向对象:C++, JAVA, C#
2. Java的核心优势
跨平台,通过虚拟机做到
3. Java各版本
J2EE:Java2 Enterprise Edition 定位在服务器端的应用
J2SE:Java2 Standard Edition 定位在个人计算机的应用
J2ME:Java2 Micro Edition 定位在消费性电子产品的应用上
4. JDK
JDK java development kit Java开发工具包
JRE java runtime environment java运行时环境
JVM Java 虚拟机,JVM是一种规范,
是一个虚拟的用于执行bytecodes字节码的计算机
从上到下是包含关系
5. 环境变量
JAVA_HOME: Java的安装目录
PATH: %JAVA_HOME%/bin
CLASSPATH: java5.0 之后可以不进行配置
6. 程序
一个源文件可以有多个class
一个源文件中至多只能有一个public的类声明,其它类的个数不限
每个源代码文件只能有一个public类,如果源文件中包含一个public类,源文件名必须和它中定义的public的类名相同,且以java为扩展名,所以,一个java文件,编译之后,可以生成多个class文件
7. 标识符
【1】标识符必须以字母、下划线、美元符号开头,不能以数字开头
【2】其他部分可以是字母,下划线,美元符号,和数字的任意组合
【3】不能是关键字
【4】大小写敏感,且无长度限制
【5】不可以包含特殊字符如#
【6】对于类,其名称通常为名词
【7】对于接口名称通常为形容词如 Runable,Serializable
【8】方法首字母小写,通常为动词-名词对getBalance
【9】变量 名词-名词 如buttonWidth
【10】常量 大写字母,并以下划线分割
Java内部采用了Unicode字符集,两个字节表示一个字符,共16位,2^16个状态 25536
ISO8859-1--------BIG5
|
--Unicode(UTF-8,UTF-16)
|
--GB2312--GBK--GB18030
ISO8859-1: 西欧字符集
BIG5: 台湾的大五码,表示繁体汉字
Unicode: 国际通用字符集, 西欧1个字节,阿拉伯等2个字节,中文3个字节
GB2312: 大陆使用最早,最广的繁体中文字符集
GBK:GB2312的扩展,可以表示繁体中文
GB18030: 最新GBK的扩展,中国所有非手持/嵌入式计算机系统的 , 强制实施标准,可以表示汉字,维吾尔文,藏文等中华民族字符
8. Java的数据类型
8.1 基本数据类型
整数类型-byte、short、int、long
浮点类型-float、double
字符型 char
布尔型 boolean
8.2 引用数据类型
类 class
接口 interface
数组
8.3 整型的表示范围
byte: 1字节 -128-127
shor: 2字节 -2^15 - 2^15-1 -32768 32767
int: 4字节 -2^31 - 2^31-1 约21亿
long: 8字节 -2^63 - 2^63-1
8.4 不同进制数的表示
十进制:10
八进制:010
十六进制:0x10 ,A B C D E F
自动转型,数值默认为int
int a = 10;
long a1 = 200;
byte a2 = 100;
如果整数和浮点数相比较,且二者的值相等的话,==比较将返回true
8.5 浮点型
float 4字节
double 8字节
十进制形式 3.14 314.0 0.314
科学记数:314e2,314E2,314E-2(10^-2)
浮点数数值默认为double类型,改为float类型,需要在后面增加F/f
注意:浮点数存在舍入误差,很多数字不能精确表示,如果需要进行不产生
舍入误差的精确数字计算,需要使用BigDecimal类,可以进行精确的计算
最好避免比较中使用浮点数
float f = 0.1
fdouble d = 0.1/10;
f!=d
8.6 char 字符型
char类型用来表示在Unicode编码表中的字符
每一个字符都对应一个数字,a对应97
char a = 'a';
int i = a+2;
char a1 = (char)i;
循环打印a到z:
char a = 'a';
char c; int i;
for(i=0;i<26 ;i++) {
c = (char)(a + i);
System.out.println(c);
}
char占16位,而且没有负值。所以最小值是0。最大值是1111111111111111 = 2^16 - 1
8.7 包装类
需要将一个基本类型作为一个数来处理
Integer 继承自Number 抽象类
Integer.parseInt("xxx") 字符串转整型
对象.intValue(); 基本类型
自动装箱 :jdk5.0之后
Integer i = 100;
编译器为我们自动添加Integer i = new Integer(10);
自动拆箱
int c = new Integer(1500);
编译器自动调用intValue()方法
Integer 重写了equals方法
Integer a = 1234;
Integer b = 1234;
a.equals(b) true;
a==b false
Integer i = 127;
Integer i1 = 127;
System.out.println(i==i1); //true
i = new Integer(127);
i1 = new Integer(127);
System.out.println(i==i1); //false
注意:Integer 对 【-128 - 127】之间的数,做了缓存,仍然当做基本数据类型处理
8.8 包装器构造函数
除Character之外,所有包装器类都提供两个构造函数
以要构建的基本类型作为变元
以要构建类型的String表示作为变元
Integer i = new Integer(42);
Integer i1 = new Integer(“42”);
Character c = new Character('c');
valueOf
多数包装器类都提供两个静态valueOf 方法,从而使我们能用另一种方法来创建包装器对象
Integer i = Integer.valueOf("1010",2) //以二进制为基数
Float f = Float.valueOf("3.24")
使用包装器转换工具
Integer i = new Integer(42)
byte b = i.byteValue();
short s = i.shortValue();
double d = i.doubleValue();
parseXX
parseXX()方法返回所指定的基本类型
valueOf() 返回新创建的包装对象,对象的类型与调用该方法的类型相同
不能从一种包装类型加宽到另一种包装类型
不能先加宽,后装箱(int不能变成Long)
可以先装箱,后加宽(int可以通过Integer变成Object)
8.9 时间Date
java.util.Date
java.sql.Date
java.sql.Timejava.sql.Timestamp 标准纪元 1970.1.1 0点开始到某个时刻的毫秒数,类型是long
java.text包 DateFormat和SimpleDateFormat
完成字符串和时间的转化DateFormat是抽象类,只有一个子类SimpleDateFormatDateFormat
需要注意几个字母大小写的差异:
大写的H为24小时制表示一天中的小时数(0-23)
小写的h为12小时制表示一天中的小时数(1-12)
大写的M表示年中的月份
小写的m表示小时中的分钟数
大写的S表示毫秒数
小写的s表示秒数
常用的24小时制的具体日期的pattern为:yyyy-MM-dd HH:mm:ss
DateFormat df = new SimpleDateFormat(“yyyy-MM-dd hh:mm:ss”)
Date d = new Date(21213232L);
String format = df.format(d);
String string = "1978-23-21 10:10:10";
DateFormat dFormat1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date2 = (Date) dFormat1.parse(string);
System.out.println(date2);
Calendar long类型数和日期的转化实现类:GregorianCalendar日历,
月份从0开始:一月是0,二月是1,.. ,12月是11
周日是1...周六是7
Calendar c = new GregorianCalendar();
//(year, month, date, hourOfDay, minute,second)
c.set(2001,1,10,12,23,34);
Date d = c.getTime();
long l = c.getTimeInMillis();
//date:Sat Feb 10 12:23:34 CST 2001 981779014425
System.out.print("date:"+d+" "+l);
//c.set(2001,1,10,12,23,34) 0代表1月,1代表2月
c.setTime(new Date());
//设置时间日期计算c.add(Calendar.YEAR,-30); 减三十年
8.A boolean类型
不是一个字节,而是一位
8.B 自动类型转换
容量小的数据类型可以自动转换为容量大的数据类型
容量的大小指的是所表示的数的范围,而不是字节数如long可以转换为float
9. 变量
Java是一种强类型语言,每个变量必须声明类型
Java变量是程序中最基本的存储单元 ,其要素包含变量名,变量类型和作用域
9.1 变量分类
成员变量(类成员)
局部变量(方法成员)
局部变量必须先声明及初始化,常量只能被初始化一次,通常名称全部用大写字母,以连字符分隔
9.2 变量声明
基本变量
一旦声明一个基本变量,就永远不能更改其基本类型
boolean、byte、int、short、long、char、double、float
引用变量
实例变量
只有实例化类时才会被初始化
实例变量是属于每一个对象的字段
9.3 局部变量
方法内声明的变量,可以用final修饰
局部变量没有默认值,在使用局部变量之前,需要进行初始化
非局部变量:final、public、private、protected、static、transient、volatile
方法:final、public、private、protected、static、abstract、synchronized、strictfp、native
transient 序列化时跳过该变量
10. 运算符
instanceof 是否是一个类的实例
条件运算符: ? :
~ : 取反,如~9
二进制数在内存中的存放形式,二进制数在内存中是以补码的形式存放的
正数:正数的补吗,反码都是其自身,
如 9:
01001:
反码 01001
补码 01001
负数:-1,
表示10001:
反码 11110
补码 11111
如何计算 ~9
9的二进制位1001,补码为01001,通过 ~ 对其取反10110,现在需要
表示01001:
~ :10110
换成二进制原码来输出:
逐位取反:11001,末位加1,11010,即-10
& : 按位与,如:
4:0100
8:1000
按位与为:0000->0
| : 按位或
^ : 按位异或
<< : 左移运算符,相当于2; 如a<*4
>>: 右移运算符,相当于/2取商;如b>> 相当于12/2
11. 包
包和包之间没有包含关系,只是逻辑上看起来有关系
java主要的包
java.lang Java语言的核心类如String,Math,Integer,System,Thread提供常用功能
java.awt 包含了构成抽象窗口工具类
java.net 网络相关操作的类
java.io 包含提供多种输入输出功能的类
java.util 包含一些实用工具类,如日期先关函数
12. 类及方法API生成
常用的java注释标签
@author 作者
@param 参数
@return 返回值的含义
@throws 抛出异常
@Deprecated 废弃
13. 键盘输入
Scanner类 构造器 new Scanner(System.in) //in是InputStream的实例
调用next()方法,程序运行时会阻塞,等待键盘的输入
14. 面向对象
14.1 面向对象编程的三大基本特征
封装、继承、多态
14.2 面向过程与面向对象比较
面向过程 方法,变量多,很难上手,需要捋流程
面向对象 把握整体,面向过程把握细节
类 - 类是对对象的抽象,类似于C语言中结构体的概念,抽象成类,管理成本降低,扩展性更好
对象 具体的事物,先有具体的对象,然后抽象各个对象之间象的部分,归纳出类,通过类再认识其他对象
14.3 面向对象的本质
以类的形式组织代码,以对象的方式组织(封装)数据
14.4 对象的默认值
引用类型都是null
数字0,小数为0.0
boolean 默认为false
char 默认为\u0000
Java中方法参数传递:值传递
14.5 堆和栈
栈:放置局部变量
堆:放置new出的对象
方法区:也是堆的一部分,放置类的信息,static变量,常量池(字符串常量)等
14.6 static变量
如果有实例,则类的静态变量将被该类的所有实例共享,但只有一个副本
不能从静态方法中访问非静态(实例)变量
静态方法不能被重写,但是可以重新定义
虚拟机看到一个类,则看是否加载该类,没有去classpath下找,找到就加载,类加载器ClassLoader,
加载后就在方法区中有了该类的信息
14.7 构造函数和实例化
包括抽象类,每一个类都必须有一个构造函数
接口没有构造函数,因为接口不是对象继承树的一部分
如果实现了自己的构造函数,那么编译器不会创建默认的构造函数
永远不要继承构造函数,他们不是方法,不能重写他们,但是可以重载构造函数
构造函数的第一行必须调用super()或this()
14.8 重写方法与重载方法
重写方法
抽象方法是必须重写的方法
重写方法不能有比被重写方法更具限制性的访问修饰符,(如不能将一个标识为public的方法重写为protected)
重写方法一定不能抛出比被重写方法声明的检验异常更新或更广的检验异常
调用被重写方法的超类版本 super.func();
使用super调用被重写方法只适用于实例方法(静态方法不能被重写)
重载方法
必须改变变元列表
可以改变返回类型
可以改变访问修饰符
可以声明新的或者更广的检验异常
决定调用哪一个重载方法是在程序运行时动态决定的