Java
2021-02-28 16:49:24 4 举报
AI智能生成
J2SE结构框架图
作者其他创作
大纲/内容
java历史简介
计算机语言的历史
第一代计算机语言
机器语言:0100000111
第二代计算机语言
汇编语言
第三代计算机语言
高级语言
面向过程 C
面向对象 Python/Java/php/C++/C#
核心优势
跨平台
体系架构
J2EE
Java to Enterprise Edition
(Java开发)定位在服务器端的应用
J2SE
Java to Standard Edition
(Java基础)定位在个人计算机上的应用
J2ME
Java to Micro Eidtion
定位在消费产品上的应用
JDK/JRE/JVM
JDK
Java Development Kit
Java开发工具包
JRE
Java Runtime Environment
Java运行时环境
JVM
Java Virtual Machine
Java虚拟机
数据类型&运算符
数据类型
基本数据类型(primitive)
数值类型(0)
整型
byte
-128~127(-2^7~2^7-1)
short
-2^15~2^15-1
int(default)
-2^31~2^31-1
long
-2^63~2^63-1
浮点型
float
double(default)
布尔类型(false)
boolean
true
false
字符类型('\u0000')
char
0~65535
引用类型
数组
class
interface
enum
annotation
数据类型的转化
自动转化(隐式转化)
小转大 long num = 10;
强制数据转化(显式转化)
大转小 bety b = (byte)-129//会溢出,损失精度
Java整型和布尔类型不能直接转化,需要用三目表达式
运算符
算数运算符
+ - * / % ++ --
10 % -3 结果是-1,结果符号取决于%左边数字的符号
比较运算符
> == < !
逻辑运算符
&& || !
&, |, ^(异或) 左右两边是布尔类型的时候做逻辑运算(&&和||具有短路效果)
位运算符
&, |, ~(取反), ^(异或) 左右两边是数值的时候做位运算
三目运算符(java根据操作数的数量分为一目,二目和三目表达式)
布尔表达式?表达式1:表达式2
移位运算符
>>,<<,>>>(无符号右移)
砖石运算符
<>(范型)
赋值运算符
=
instanceof
可以确定对象是否属于一个特定的类
new
the "new" operator instantiates a class by allocating memory for a new object and returning
a reference to that memory.The "new" operator also invokes the object constructor.
a reference to that memory.The "new" operator also invokes the object constructor.
运算符的优先级
算数>比较>逻辑>赋值
int i = 0; if(++i ==0) 先执行++i在比较,i++ ==0 先比较在执行
类
Java类(不包括内部类)只能用public/abstract/final来修饰,无修饰符的类只能被同包的访问(及不需要用import导包)
单独一个方法/变量不能独自存在与文件中,所以公用方法的封装也是做成类方法。原因是java是类加载机制;
同级类
在和文件名同名的类的大括号作用域的外部,只有和文件夹名相同的类可以被public修饰
因为jvm虚拟机为了提高查找类的速度,使用import语句导入的时候,只会导入对应空间的文件名所对应的class文件,而public文件是大家都要使用的,因此直接导入这个类名对应的class文件即可。
内部类
成员(常规)内部类
与外部类的属性、方法并列
静态内部类
被static修饰的成员内部类
局部内部类
在方法体里声明的类
匿名内部类
一个没有名字的类,是内部类的简化写法。
本质:其实是继承该类或者实现接口的子类匿名对象。
本质:其实是继承该类或者实现接口的子类匿名对象。
内部类各访问修饰符的用法作用(private,protect等),各个不同种类内部类的用法和作用
方法&流程控制
方法
方法的声明
1.访问权限修饰符
2.static静态调用
3.double返回数据类型
4.方法名
5.参数
形参(Parameters)
是在定义方法名和方法体的时候使用的参数,目的是用来接收调用该方法时传递的参数
实参(Arguments)
在进行方法调用时,它们都必须具有确定的值, 以便把这些值传送给形参
6.return返回值
方法的重载规则
1.同一个类中
2.方法名相同
3.参数列表不同
1.参数个数
2.参数数据类型
3.参数的顺序
4.只有返回值不同,不能构成方法的重载
方法重写的规则
1.发生继承关系
2.参数列表必须与被重写方法相同
3.返回类型必须与被重写方法的相同或是其子类
4.重写方法不能缩小访问权限
5.重写方法不能抛出新的异常(或者超过了父类范围的异常),
但是可以抛出更少、更有限的异常,或者不抛出异常。
但是可以抛出更少、更有限的异常,或者不抛出异常。
流程控制
顺序流程
控制流程
if()
if(){
}else{
}
}else{
}
if(){
}else if{
}else{
}
}else if{
}else{
}
switch......case
switch(char, byte, short, int, Character, Byte, Short, Integer, String, or an enum)
相当于if(==)全等的情况,但效率要高
break打破循环,防穿透
循环流程
while
for
break; 跳出并结束语句快
continue; 跳出本次循环,继续执行后面的代码
增强for循环
for(声明语句 : 表达式)
{
//代码句子
}
for(声明语句 : 表达式)
{
//代码句子
}
do......while
死循环
数组
数组的初始化
静态初始化
int[] array = {}
元素较少,没有规律
动态初始化
int[] array = new int[5]
数组元素的个数,一经定义,不允许改变
元素有规律
动静结合
int[] array = new int[]{
1,2,3,4
};
1,2,3,4
};
获取数组中的元素
array[array.length-1]
数组的长度
array.length
数组的遍历
For-Each 循环(增强for循环)
for(type element: array){
System.out.println(element);
}
System.out.println(element);
}
数组的复制
动态扩展算法
多维数组
二维数组
arr[x][y]
第一维数组有x个元素,每个元素为有y个元素的第二维数组
{
{}
{}
...
{}
}x行,y列
{}
{}
...
{}
}x行,y列
可用于建立表格,多点坐标
排序算法
选择排序
每一个元素与第一个元素比较,如果小,则交换
i:第一个元素的位置
0~arr.length-1
j:后面那个元素的位置
i+1-arr.length-1
冒泡排序
两两比较,如果后面的小,交换
i:比较的轮数
0~arr.length-1
j:比较的位置
0~arr.length-i-1
a[j] a[j+1]
快速排序*
其他排序
JDK提供的排序方法
Arrays.sort(arr[])
底层实现使用的排序算法中的快速排序
面向对象
三大基本特征
继承
子类继承父类语句的执行顺序
重写的规则
父子类中,必须有继承
相同的方法签名
方法名+参数序列
方法的访问权限不能比父类的方法更严格
垃圾回收机制GC*
封装
访问权限修饰符
在编程规约中,所有非特殊成员变量,不允许外部直接访
问其成员变量,必须将其私有,且提供对外公开的方法
问其成员变量,必须将其私有,且提供对外公开的方法
多态
多态是同一个行为具有多个不同表现形式或形态的能力。
赋值多态
小转大,大不能转小(只能向上转型),大转小会出现ClassCastException
传参多态
构成java多态的规则
1.要有继承
2.要有方法的重写
3.父类的引用指向子类的对象
虚函数*
static关键字
从属于类
静态属性使用 类名.静态变量名
静态方法使用 类名.静态方法
在JVM中仅初始化一次
static关键字修饰的方法不能被重写,及相当于被finale修饰
Object类
所有类的父类
equals()
==和equals()的区别
1.==比较的是地址
如果"=="两边是基本数据类型或字符串常量,
比较的是常量池中的数值
比较的是常量池中的数值
2.equals()方法在没有重写父类的方法时,比较的也是地址
3.在重写equals()后,比较的是引用类型属性的值是否相等
在实际应用中,必须重写equals()方法
hashcode()
调用本地操作系统的c++库的哈希地址
toString()
由完全限定名+"@"+十六进制的哈希地址组成
子类按需求重写父类的toString()方法
引用类型直接输出对象名,默认调用toString()方法
java实体类的编程规约
类必须实现可序列号接口
成员变量私有化
对外公开的getter和setter方法
必须重写toString()、equals()、hashcode()方法
遵守编程规约的实体类称为JavaBean,万物都可封装成JavaBean,如动物,人,车......
final关键字
修饰变量,常量,不能被二次赋值
修饰方法,不能被子类重写,但可以重载
修饰类,不能被子类继承
抽象类
由abstract关键字修饰的类
1.有抽象方法的类必需定义为抽象类
抽象类不一定有抽象方法
抽象方法不可以有方法体
2.抽象类不能创建对象
抽象类中定义了子类共有属性
定义子类必需要重写的方法
3.让子类继承
接口
比抽象类还抽象的抽象类 interface
在接口中定义的属性全为常量
public static final
接口中定义的方法全为抽象方法
类与接口的关系
implements
类与类的关系
extends
接口与接口的关系
extends
如果你是。。。就必须得会。。。
定义类某些规范
集合
概念&历史
早在 Java 2 中之前,Java 就提供了特设类。比如:Dictionary, Vector, Stack, 和 Properties 这些类用来存储和操作对象组。
虽然这些类都非常有用,但是它们缺少一个核心的,统一的主题。由于这个原因,使用 Vector 类的方式和使用 Properties 类的方式有着很大不同。
集合框架被设计成要满足以下几个目标。
该框架必须是高性能的。基本集合(动态数组,链表,树,哈希表)的实现也必须是高效的。
该框架允许不同类型的集合,以类似的方式工作,具有高度的互操作性。
对一个集合的扩展和适应必须是简单的。
为此,整个集合框架就围绕一组标准接口而设计。你可以直接使用这些接口的标准实现,诸如: LinkedList, HashSet, 和 TreeSet 等,除此之外你也可以通过这些接口实现自己的集合。
虽然这些类都非常有用,但是它们缺少一个核心的,统一的主题。由于这个原因,使用 Vector 类的方式和使用 Properties 类的方式有着很大不同。
集合框架被设计成要满足以下几个目标。
该框架必须是高性能的。基本集合(动态数组,链表,树,哈希表)的实现也必须是高效的。
该框架允许不同类型的集合,以类似的方式工作,具有高度的互操作性。
对一个集合的扩展和适应必须是简单的。
为此,整个集合框架就围绕一组标准接口而设计。你可以直接使用这些接口的标准实现,诸如: LinkedList, HashSet, 和 TreeSet 等,除此之外你也可以通过这些接口实现自己的集合。
List
ArrayList
底层数据结构为线性表,添加,修改,删除比较慢,查询快,线程非安全
add(Object)
size()
get(index)
remove(index) remove(Object)
contains(Object)
LinkedList
底层数据结构为双向链表,添加,修改,删除比较快,查询慢,线程非安全
Verctor
线程安全,效率低,不经常用
Set
HashSet<Object>
add()
向HashSet中添加元素,输出结果是无序的
List,Set,Map接口的区别
List,Set同属于Collection接口
List添加有序,Set添加无序
Map使用put(K,V)方法添加元素,K唯一
List,Set可以使用iterator接口遍历,而Map不行
Map
Map的迭代方式
1.使用For-Each迭代entries
如果你遍历的map是null的话,For-Each循环会抛出NullPointerException异常
,所以在遍历之前应该判断是否为空引用。
,所以在遍历之前应该判断是否为空引用。
2.使用For-Each迭代keys和values
如果只需要用到map的keys或values时,可以遍历KeySet或者values代替entrySet
多线程
继承Thread类,重写run()
实现Runnable,重写run()
使用start(),开始线程
常用的引用类型
java.lang
String
Length()
format("%s",object)
次写法自动调用object的toString方法
charAt(int index)
根据下标返回对应字符
indexOf(int char)
根据字符返回下标(第一次出现)
lastIndexOF(int char)
返回最后一次出现的下标
substring(int index)
截取指定下标(包括)后的字符串
substring(int beginindex,int endIndex)
截取字符串,前包括后不包括
replace(char oldChar,char newChar)
字符串替换
toLowerCase()
trim()
去首尾空格
System
out.print()
out.println()
in
arraycopy(src,srcPos,dest,destPos,length)
java.util
Scanner
nextInt()
netDouble()
nextLine()
Arrays
toString(arrayname)
copyOf(src,newLength)
sort(T[])
equals(T[],T[])
判断两个数组是否相等
Random
nextInt(bound)
Date
new Date() 当前系统时间
format(str)
一些区别
AbstractStringBulider的子类
String,StringBulider和StringBuffer的区别
1.String的不可变长
2.StringBuilder和StringBuffer的可变长
3.用StringBuilder(效率高)代替StringBuffered(线性安全),用效率高的StringBuilder
4.大量字符串操作时,用StringBuilder代替String
StringBulider和StringBuffer具有16的缓冲区*
Differents between collection and array
list 可以直接输出元素,而array需要用Arrays.toString().
数组的长度是固定的,集合可变化
接口与抽象类的区别
抽象类是个类具有类的特性:可以有main方法,构造器,而接口是接口和类不是一个种类
Java类只能单继承类,但可以实现多个接口,接口可以继承多个接口
接口中的变量全是常量,方法全是抽象方法,Java8以后可以用default修饰来实现方法,而且可以声明(并且可以提供实现)静态方法
抽象类中可以有普通变量,方法可以有非抽象方法
抽象类中可以有普通变量,方法可以有非抽象方法
抽象类取向与声明一类抽象的对象(如动物),接口强调功能(如,跑,吃),抽象类动物实现接口跑,吃
final finally finalized
finally 一般与try一起使用,在程序进入try块之后,无论程序是因为异常而中止或其它方式返回终止的,finally块的内容一定会被执行 。
Object中的方法 finalized 用于实例被垃圾回收器回收时触发的操作
0 条评论
下一页