1、java 发展历程
1998年,Sun 公司发布 jdk1.2 ,该版本将 java 分为 J2SE、J2EE、J2ME 三类。
2014年,Sun公司发布 jdk1.8
2、一次编译,各处运行
先编译成 .class文件,再解释执行。
3、基本数据类型与表达式
文字量:文字量直接出现在程序中并被编译器直接使用,如 30.
标识符:标识符是一个名称,以字母或下划线或美元符号开头。
变量:一个由标识符表示的项,变量的值可以被改变。
内置数据类型:
-
byte
-
short
-
int
-
long
-
float
-
double
-
boolean : 表示一个逻辑量,仅有两个取值:true或false
字符型
字符串:java的基本数据类型没有字符串类型,在java 中使用 String 类来定义字符串。如 String s = "hello"
.
运算符:算术运算符、赋值运算符、关系运算符、逻辑运算符、条件运算符(三目运算符)。
类型转换:
-
扩展转换:从低位向高位转换
-
窄化转换:从高位向低位转换
-
隐含转换:有赋值转换、方法调用转换、字符串转换三种
-
显式转换:强制类型转换
4、数组
数组的概念:由同一类型的对象或数据构成,并封装在同一标识符下。
在 Java 中数组是对象,需要动态初始化。,可以赋值给 Object 类型的变量,数组中的变量称为数组元素
数组的创建与使用:
数组引用的声明:如int[] name 或 int name[] ,两者是等效的。
数组的创建:
用关键字 new 构成数组的创建方式。
创建实例:
int[] ai;
ai = new int[10];
数组初始化:
int[] a = {1,2,3,4,5};
使用数组:使用 arrayName[index]
,可以通过 arrayName.length() 获得数组长度。
数组名只是一个引用
复制数组元素使用 System.arrayCopy()
方法
多维数组:
定义二维数组的方式如下:
1、int[][] myArray;
2、int[][] myArray = new int[3][5]
3、int[][] myArray = {(1,2,3),(2,3,1,)}
java 里面二维数组的长度指的是它的行数
java 里面的二维数组就是由一维数组构成的数组。
5、算法的流程控制
if 语句:1、只有 if 语句;2、单个 if-else 结构;3、多个 if-else 结构
简单的 if-else 语句可以使用条件语句来替换。
switch 语句:
for 语句:是 Java 三个循环语句中功能最强大的一个,使用最广泛的一个。
增强 for 循环:用来针对数组或集合对象进行遍历。
语法格式:
for(Type name: 数组或集合类型对象){
//循环体;
}
while: 先判断再循环
do-while:先循环再判断
break 语句:跳出循环,不再执行剩余部分。
continue 语句:停止本次循环,开始下一次循环。
6、类的声明与对象的创建
类是对一类对象的描述,对象是类的具体实例。
class:表示这是一个类
extends: 继承的关键字
implements: 实现接口的关键字
public:公有类
对象引用声明:
7、在类里面声明数据成员
数据成员:表示对象的状态。
如:
public static int a; // 这是一个类变量
public String s;
-
static 指明这是一个类变量(静态成员变量),在类初始化时就被同时赋值。
-
final 指明这是一个不可被修改的量
实例变量:没有static修饰的变量,存储所有实例都需要的属性。
8、在类中定义方法成员
类中的方法分为:1、类方法;2、实例方法
返回类型
参数类型
方法体
实例方法:用来表示每个对象的功能或行为
实例方法的调用格式:
<对象名>.<方法名>(实参列表)
参数传递:
-
值传递: 参数类型为基本数据类型时
-
引用传递:参数类型为对象或数组时
类方法(静态方法):
-
声明时需要使用 static 关键字修饰
-
不能被声明为抽象的
-
可以类名直接调用,也可以使用实例调用
可变长参数
使用三个省略号表示,其实质就是数组
如 String... s
,相当于 String[] s
9、包
包的作用:
-
将相关的源代码文件组织在一起
-
类名的空间管理,用来避免命名冲突的问题。
-
java 中包名使用小写字母表示
-
建议使用公司域名的反序作为包名,如
com.google
包的声明: 如,package 包名
包的引入:
使用 import 语句引入所需的包, java 编译器为所有程序自动引入包 java.lang
静态引入:
-
单一引入:引入某一个指定的静态成员。
-
全体引入:引入所有的静态成员。
10、类的访问控制权限
private:只能被同一类中访问
public: 可以被不同包,不同父类的访问
get方法:获取属性变量的值
set方法:修改属性变量的值
this关键字:
11、对象初始化
使用构造方法对对象进行初始化。
构造方法:
-
方法名与类名相同
-
不定义返回类型
-
通常被定义为 public (公有的)
-
可以有任意多个参数
-
主要作用是完成对象的初始化工作
-
在生成一个对象时,自动调用构造方法来对新对象进行初始化
默认构造方法:
-
没有参数(内部类除外)
-
对象的属性值默认为零或空
自定义构造方法与方法重载:
-
在生成一个对象时,给构造方法传送初始值,为对象进行初始化
-
构造方法可以被重载:通过参数列表来比对,调用不同的构造方法
-
只要显式的声明了一个构造方法,就不再使用默认的构造方法。
final变量的初始化:
-
实例变量和类变量都可以被声明为final
-
final实例变量可以在类中定义时给出初始值。
12、内存回收
对象的自动回收:
- 无用对象:离开了作用域的对象,无引用指向的对象
finalize()方法:
-
在类java.lang.Object中声明,因此,java的每个类都有这个方法。
-
用于释放资源
-
类可以重写finalize()方法
-
finalize()方法可能以任何的次序执行
13、应用实例
一个银行账户的实例。
DecimalFormat类:该类位于 java.text 包下,作用是将输出数据进行格式化。
14、类的继承的概念和语法
类继承的概念:
-
java 只支持单继承,每个子类只能有一个超类(父类)
-
超类是所有子类的共有属性及方法的集合,子类则是超类的特殊化
-
继承可以提高代码的可重用性
子类对象:包含着超类的所有属性和方法,以及子类特有的方法
继承的语法,如下:
pubilc class Son extends Father{
}
父类中的私有变量被继承到子类后,是不能被直接访问的,除非父类中有访问该私有变量的方法。
15、隐藏和覆盖
也就是重写 @override
属性的隐藏:子类中声明了与超类中相同的成员变量名
-
从超类中继承的变量将被隐藏
-
当子类执行继承自超类的操作时,处理的是继承自超类的变量,反之则是处理的是子类的变量。
访问被隐藏的超类属性
-
调用从超类继承的方法,则操作的是从超类继承的属性
-
使用关键字
super
,来访问超类中的属性。 -
静态成员不被继承,不属于任何一个对象,但可以被所有子类访问
必须被重写的方法:派生类必须重写基类中的抽象方法
****:被 final、static 修饰的方法不能被重写
16、Object 类
Object 类是其他所有类的直接或间接超类。
Object 类的主要方法
-
getclass() :获取当前对象所属的类信息
-
toString():
...
相等与同一:
-
两个对象具有相同的类型,及相同的属性值,则称两者相等。
-
如果两个引用变量指向同一个对象,则两个引用同一。
hashCode() 方法: 返回对象的散列码
如果依据 equals()方法两个对象相等,则两个对象的散列码应该是相同的。
clone()方法:使用 clone 方法复制对象。
finalize() 方法: 在对象被垃圾回收器回收之前,系统自动调用对象的 finalize 方法。
getClass( 方法):返回一个 class 对象,用来代表对象所属的类。
notify、notifyAll:与线程有关的方法
17.接口
接口不规定方法的主体;接口中可以有数据成员,但默认是 static 或 final 类型。
接口的作用:
-
继承多个设计
-
建立类与类之间的“协议”
-
在不同类之间实现常量的共享
接口的语法:
如
public interface 接口名 {
// 方法的原型或静态变量
}
接口中的方法,默认是 abstract 或者 final 。
接口不能被实例化,只能被实现。且接口可以被多重继承。
实现接口
如:
public class 类名称 implements 接口名1,接口名2{
// 重写接口中的方法。
}
接口的扩展:接口与接口之间,也可以继承,有超接口与子接口之分。
如:
interface 子接口 extends 父接口{
//
}
18、类型转换
类型转换规则:
-
基本类型转换: 将一个值转换成另一个值
-
引用类型转转:引用之间的转换必须有继承关系或者接口的实现关系,将引用转换为另一个类型的引用,并不改变对象本身的类型
-
当一个引用被转换为超类的引用后,通过它能够访问的服务接口只能是超类中有的方法。
隐式类型的转换:
-
基本类型转换:自动将低位转换为高位
-
引用变量:被转换成更一般的类,如将子类的引用转换成超类的引用。或转换成更一般的接口。
显式类型的转换:
-
基本数据类型:高位转换为低位
-
引用变量:将超类的引用转转为子类的引用。
类型转换的应用场合
-
赋值转换:两个不同类型进行赋值需要进行转换
-
方法调用转换:将实参的类型转换为形参的类型
-
算术表达式转换:将不同类型转换成相同类型再计算
-
字符串转换:将其他类型转换为字符串类型
19、多态的概念
不同类型的对象可以响应相同的消息,响应行为可以不同。
实现同一接口的不同类型的对象,可以被当做同一类型的对象来对待。
绑定:
-
早绑定:在程序运行之前就实现绑定
-
晚绑定:也称为动态绑定。
20、输入/输出流的概念
预定义的 I/O 流类:
-
面向字符的流:用于处理字符数据
-
面向字节的流:用于一般的目的
面向字符的流: 源和目标是文本文件,Reader 和 Writer 类是所有字符流的超类。
面向字节的流: InputStream 和 OutputStream 类是所有字节流的超类
标准输入输出流:
按类型输入输出数据:
-
printf 方法 :System.out.printf()
-
Scanner 方法:
21、写文本文件
-
使用 FileWriter 类写入数据到文本文件中。
-
使用 BufferWriter 类写入数据到文本文件。
22、读文本文件
-
使用 FileReader, 文件读取流
-
使用 BufferReader, 缓冲读取流
23、主要接口与常用的实现类
Set 接口 : SortedSet 类 和 TreeSet 类
List 接口: Vector 类和 ArrayList 类
Queue 接口:
Map 接口:HashMap 类和 TreeMap 类
24、常用算法
排序算法 sort: 使 List 元素按照某种次序排序。
洗牌算法 shuffle: 以随机方式重排 List 元素。
reverse: 反转算法
copy: 两个 List 之间的复制。
binarySearch: 二分法查找算法。
min、max:返回指定集合的最小值和最大值。
25、数组实用方法
Arrays 类:定义了一组有关数组的方法
-
fill : 给数组填充
-
equals: 判断数组相等
-
sort: 数组排序
-
binary:使用二分法查找数组元素
26、基于动态数组的集合类型
Voctor, ArrayList:
-
实现了 Collection 接口
-
能够存储相同类型的对象
-
不能存储基本数据类型的数据
-
其容量可自动扩充
-
添加元素效率较高
-
Voctor : 是集合框架中的遗留类,线程安全
-
ArrayList :非同步的,效率较高。
鼓励使用ArryList。
27、遍历 Collection
1、通过 Enumeration 及 Iterator 遍历: 优先选用 Iterator 遍历集合。
2、使用增强 for 循环遍历
3、通过聚集操作遍历
28、Map 接口及其实现
Map 接口意义: 用于存储键值对 (key-value)
主要有 HashMap 和 TreeMap 两个类。
**哈希表 HashMap **: 根据哈希函数计算出对象的位置。
哈希表的容量不是固定的,可以扩充。
每天学习一点点,每天进步一点点。