JavaSE
2019-08-22 08:31:36 50 举报
AI智能生成
javaSE基础知识
作者其他创作
大纲/内容
容器
概念
存储对象的容器
长度可变
基本功能(Collection 接口)
添加
add()/addAll()
删除
remove()/removeAll()
获取
iterator().(hasNext().next(0.remov()/size() 长度
判断
contains()/isEmpty()
获取交集
retainAll()
集合变数组
toArray()
类型
Collection 接口
List(元素有序可重复)
子类
ArrayList
底层数组 ,查询快,增删慢
LinkList
链表 ,查询慢,增删快
特有的操作方法
取出并删除
removeFirst()/removeLast()/pollFirst()/pollLast()
取出不删除
peekFirst()/peekLas()/getFirst()/getLast()
添加
offerFirst()/offerLast()/addFirst()/addLast()
Vector
底层数组结构
取出方式
Enumeration en=v.elements();枚举
List中判断元素是否相同是用equals方法,contain和remove的底层也是
Set(元素无序不重复,最多一个Null)
HashSet
底层哈希表
判断两个元素不重复通过元素hashCode()&&equals()完成
TreeSet
底层是二叉树,可排序
add()
通过hashCode 和equals()来比较是否一样
重写hashCode 和equals 方法
list Set遍历
转数组 toArrary()
迭代器
hasnext()判断下一个有没有
next()取出
增强for
for( : )
Collections
一个工具类 方法都是用于操作Collection
Map接口
概念
将键映射到值得对象
一个映射不能包含重复的键,每个键最多只能映射到一个值
子类
HashMap
底层采用hash散列表
优缺点
精确查找很快
缺点 浪费空间
hashmap特点
存键值对
无序,不支持排序
允许放null为key
key不允许重复,一旦重复会被覆盖
HashTable
:实现原理和HashMap一样,多了线程安全,目前来说不允许使用了
linkedhashmap
linkedhashmap继承了hashmap,在自己内部维护一个链表 ,来记录他们出入数据的顺序
TreeMap
底层采用红黑树
根节点root
优缺点
优点
支持排序
缺点
查找慢
treemap特点
存储键值对
支持排序
不允许放null,因为treemap在使用可以进行排序
key不能重复 一旦重复会覆盖
取出方式
将map 集合转出set集合 ,在通过迭代器取出
获取value 值 在for循环出来 丢失key
通过 setKey()方法获取key Set<>去接收 通过 for 遍历 通过key get(key) 获取 相应values 获得值
通过 对来获取 entrySet方法 Set<Map.Entry<T,T>> 去接收
遍历 entry通过 getKey() getValue() 获取相应的键值对
面向对象
对象、类的定义
类:class
对象:object
对象是具体是事物 比如 橘猫 人
类是对对象的抽象定义 比如 猫类 人类
类可以看做对象的模板,对象可以看成该类的一个具体事实例 比如类是房子图纸 房子是对象
第一个类的定义
属性
格式
[修饰符] 属性类型 属性名 = [默认值] ;
方法
定义格式
调用
static 可以直接用
非静态的方法,其他非静态方法可以调用,静态的调用必须通过创建对象
传递
值传递
八种数据类型都是值传递
不会变值
址传递
引用类型传递
可能会改变值
形参
方法中声明的参数
实参
调用时传入的参数
递归
方法内部调用自己
方法重载
同一方法名不同参数列表
*两个重名方法,形参类型不同,根据实参类型和顺序来区分调用哪个方法
成员变量跟局部变量的区别
成员变量有默认值,局部变量没有默认值
作用域不一样 成员变量作用域整个类 局部只作用于那一块代码块里
成员变量可以被修饰符修饰
构造方法
格式
类名 对象名 = new 构造方法(...);
方法名和类名必须一样
没有返回值类型,没有void
没有具体返回值
构造方法重载
定义
给对象的数据进行初始化
构造方法重载 一个无参构造方法 和有参构造方法
注意事项
如果我们没有给出构造方法,系统会提供一个默认的无参构造方法供我们使用
当我们写了有参构造方法了,系统不再提供无参构造方法,需要我们自己写
推荐我们自己先写上,以免报错
成员变量赋值修改
setXxxx方法
带参构造方法
获得(不能修改)值的话一般用getXxx方法
三大特征
封装
四个权限
public
公共的 一个项目里都可以用
protected
包内有效,包外的子类
默认
包内有效
private
私有的,类内有效
访问权限只能修饰类,成员变量,方法
定义
隐藏对象的属性和实现细节,对外仅提供接口
提供操作方式,别管怎么做
方法 封装的一种 实现代码写到方法里,调用方法去实现功能
类也有封装
对象属性都要私有
set赋值
get读取值
继承
定义
A extendsB A继承B类
A类继承B类的所有代码,但是部分权限
子类的属性和方法或者特征要多
优点不用重写代码
***父类可以有多个子类,子类只能有一个父类 可以继承传递
a-->b-->c
*在java类没有显式的继承自哪一个类,那么这个类继承自Object
构造方法问题
一个类的构造方法必须调用父类的构造方法
super()代表调用父类构造方法
因为子类的很多属性和方法都是从父类继承来的,必须得初始化他
*任何一个类的第一行必须是super();super()指的是调用父类构造函数
super()不传参可以省略不写
执行顺序 父先子后
继承跟静态没有关系
创建对象才能继承、静态根本跟对象没有关系,不要把静态跟继承一块谈
方法重写
方法重载
在一个类中,同名不同参数列表
方法重写
在子类中与父类出现相同方法,调用子类方法时会覆盖父类的方法
方法签名
返回值 方法名(参数列表)
@Override
看到这个注解就知道这个方法时重写父类
@开头叫做注解
重写的限制
重写访问权限不能缩小
参数类型,顺序不能变
返回值类型可变,但是只能是原类型的子类型
不能重写私有方法
抽象类
abstract
被abstract修饰的方法签名叫做抽象方法 (没有具体方法)
抽象方法不能被调用,
抽象方法不能呗private修饰
抽象方法必须被重写才能使用
抽象类与普通类只有一个区别,就是抽象类不能实例化(创建对象)
抽象类中的抽象方法子类必须重写
引用数据类型的转型
向上转型
子类型可以自动转为父类型
人 a = new 男人();
隐藏子类中额外拓展的属性和方法
向下转型
父类型转子类型需要强转
男人 a = (男人)new 人();
释放子类中额外拓展的属性和方法
接口 (interface)
定义
接口就是规范,定义的是一组规则
接口可以被用来实现类间多继承结构,接口内部只能定义public的抽象方法和静态的、公有常量、因此所有的方法需要在子类中实现
格式 public(默认) interfaceB extends A{}
子类通过implement(实现)
常量
接口中的属性只能是常量,总是:public static final 修饰。不写也是。
方法
方法:接口中的方法只能是:public abstract。 省略的话,也是public abstract。
要点
1. 子类通过implements来实现接口中的规范。
class A extendsC implement B
2. 接口不能创建实例,但是可用于声明引用变量类型,接口没有构造方法。
3. 一个类实现了接口,必须实现接口中所有的方法,并且这些方法只能是public的。
4.一个类可以实现多个接口
*就把接口当做更严格的抽象类去使用
当A类实现了B接口,我们也可以说B是A的父类型,也符合向上向下转型的所有规范
接口和类的区别
没有声明变量,但是可以定义常量
只有方法声明,没有办法的实现
接口和抽象类的区别
抽象类可以定义属性和抽象方法,接口只能是常量和抽象方法
抽象类有构造方法,子类可以使用,不能new对象,但是接口没有
抽象类是类,在Java中只能单根继承,而类可以使用多个接口
抽象类可以继承抽象类,符合单根继承
抽象类可以实现接口
接口之间可以继承,而且可以多继承
extends 在implement之前 继承在实现前面
final修饰符
最终修饰符
修饰类
不能被继承
不能修饰抽象类和接口
修饰方法
不能被重写
不能修饰抽象方法
修饰属性
修饰的属性叫做常量,要求初始化时必须有值,并且后续不改变
final的应用点
一般搭配static去做静态常量去使用
尤其注意
声明常量的时候必须全部大写
public static final String INFO="hello"
多态
定义
不同类的对象对同一消息做出的响应
一个名字多个方法
多态存在的必要条件
必须有继承关系
必须有重写
父类的引用指向子类的对象
多态的优点
可替换性
可扩展性
接口性
灵活性
简化性
多态性的实现
覆盖实现多态:(子类重写父类中的方法)
子类方法的返回的类型、参数、方法名要和父类的返回类型、参数、方法名一样
被覆盖的方法不能为private
子类的方法不能缩小父类方法的访问权限
重载实现多态(同一类中的同名方法)
方法名相同
方法的参数、个数、顺序至少要一项不同
对象转型
向上转型
子类对象->父类
自动完成 格式:父类名称 父类对象=子类实例;
特点
自动隐藏子类中添加的属性,和方法
可以使用子类的重写方法,不是父类原有的方法
向下转型
强转换 格式 子类名称 子类对象 =(子类) 父类实例
特点
释放子类中的方法和属性
instanceof
通过instanceof关键字可以判断某一个对象是否是某个类的实例
格式 对象instanceof类 返回值Boolean类型
关键字
this
本类当前对象 谁调用指的谁
局部变量跟成员变量重名时,用this.来调用成员变量
this()调用本类的其他构造方法 具体哪个看参数列表
构造器重用
super
在子类重写父类方后,要访问父类被重写的方法,需要用Super关键字来引用当前类的父类。super的用法有两种情况
访问的父类中成员变量和成员方法 super.变量名
super.方法名([参数表])
调用父类的构造方法
super([])
static(静态)
修饰符
只能修饰属性方法
被static修饰的属性和方法属于类级别,不属于对象,一个类拥有一份,所有对象共享
static 属性方法不需要被创建对象直接可以使用类名调用 类名.XX直接使用
static 属性和方法存在时候不一定有对象,static的在类加载时初始化了
不能使用this
考虑使用时候
考虑需不需要对象,
static{ }
静态代码块,在加载类时执行,只执行一次
构造方法里面可以初始化静态属性,但是似乎不太合理,会产生一个多余的对象
常量 pi e
静态的一些其他使用场景
语法
设计模式
单例模式
一个类只能产生一个实例
例子
省内存、计数器
工厂模式
算法、数据结构
优化
effecti java
用静态方法代替构造方法
1.静态方法可以通过名字让人更容易懂
2.静态方法不必要每次都创建一个对象,省内存较快代码效率
3.可以返回子类类型
4.可以根据参数的不同来创建不同对象
5.在编写包含该方法的类时,返回的对象的类不需要存在
初始化顺序
方法和属性的顺序
非静态的初始化顺序是先属性后方法
静态的初始化顺序是先属性后方法
属性之间的顺序
静态的上下顺序 先上后下
非静态无顺序
==与equals
==:
从表面去说,==在判断基本数据类型时判断的是值,判断引用数据类型时判断是否是一个对象
引用数据类型 从原理说判断引用地址
instanceof:判断某一个引用是否是指定类型
obj instanceof A:判断obj是不是A以及A的子类型
判断对象的值是否相等
Object类提供了equals方法来判断,默认逻辑是== 需要 重写equals方法
在java中输出一个对象(引用数据类型),默认是输出这个对象的toString方法返回值
System.out.println(a1.toString()); == System.out.println(a1);
hashCode()
返回对象地址
retrun 返回值
API
String
创建字符串对象
s引用静态区的字符串 String s="hello";
s引用堆上的字符串对象 String s=new String("hello");
字符串的方法
长度 length()
取字符 charAt(int)
变大小写 toUpperCase()/toLowerCase()
连接 concat(String)
比较 equals(String)/compareTo(String);
判断开头结尾 starsWith(String)/endWith(String)
字符串匹配 indexOf(String string)/lastIndexOf(String string) 返回值位int
取字符串
substring(int int) 从那个位置取出字符串
删空格
trim()
替换
relace(String string)/relaceAll(String string)
拆分 split(String)
string 不变字符串
可变字符串
StringBuffder 单线程环境
StringBuffer 适用于多个线程操作同一字符串场景
方法
追加
append(String) 可以链式调用
删除指定字符串
delete(int int)
插入
insert(int int)
倒转
reverse()
转变
可变字符串.tostring ->String
可变字符串 =new 可变字符串(string)
包装类
自动装箱
自动装箱指的是可以把int类型的数据直接赋值给Integer而不报错
自动拆箱
把Integer自动赋值给int
包装类的缓冲区
Integer类在加载时就创建了一个数组,这个数组里放了-128~127之间的所有Integer对象
引用类型比较值都要使用equals方法
int
Integer
char
Character
boolean
Boolean
byte
Byte
short
Short
long
Long
float
Float
double
Double
定点数
BigDecimal 精度不丢失
IO体系
File类
File 新建、删除文件或者文件夹
构造方法
File file =new File("字符串路径");
File file=new File("父路径的字符串","子路径的字符串")
File file =new File(父路径的File对象,"子路径的字符串")
创建功能
createNewFile();//创建这个文件
mkdir()创建一级目录
mkdirs()创建多级目录
不要以扩展名去区分文件或者文件夹;
删除功能
delete() 删除功能
注意事项
如果文件夹里面还有内容不能删除
不走回收站
判断方法
isFile() 判断是否是文件
isDirectory() 判断是否是文件夹
exist()判断关联文件是否存在
普通获取方法
getAbsolutePath 获取绝对路径
getName() 获取关联文件或者文件的名字 最后一级的名字
length() 获取文件的长度 以字节为单位 文件夹没有长度
高级获取方法
list()
获取指定文件下,一级目录下所有的文件和文件夹的名字,将名字放置在String数组中
调用这个必须是文件夹
listFiles()
获取指定文件下,一级目录下所有的文件和文件夹的File对象;将这些对象放置在File数组中
调用这个必须是文件夹
两种路径
相对路径
有参照物 ,以当前目录开始
注意
../上一层
./本层
/下层
每多一个点. 代表多一层 比如 .../ 上上层
优缺点
优点节省代码、系统移植性比较高
缺点 容易 发生死链
绝对路径
绝对位置
从盘符开始 E:\workspace_IDEA\javase\iodemo\src\com\neuedu\demo1\demo.txt
优缺点
优点在任何一个项目中,使用这个路径找文件绝对没问题
缺点 没有系统系统移植性
公共语言基础、
java数据类型
基本数据类型
byte
short
int
long
float
double
char
boolean
基本数据之间的转换
1由小到大自动转换
特例
在Java中整型常量为int,浮点型常量为double,例如System.out.println(1);//此处1为常量,为int类型
可以将整型常量直接赋值给byte、short、char,而不需要进行强制类型转换,只要不超出其表示范围
强行转换
1.容量大的数据类型转换为容量小的数据类型时需要强制类型转换
2.当一种类型强制转换为另一种类型,而又超出了目标类型的表示范围时,将会截断为一个完全不同的值,此值无意义
引用数据类型
类(class)
接口(interface)
数组
运算符
1.赋值运算 =
2.算数运算
+ 加法运算
- 减法运算
* 乘法运算
/ 除法运算
% 取余运算
类型提升
在Java中两个不同类型的数值进行运算时会进行一个自动类型提升
3.比较运算符
><=大于小于等于
==等于
!=不等于
instanceof 判断对象是否为类实例
子主题 5
4.逻辑运算符
&& 与(且)
|| 或(或者)
!非
5.位运算
& 按位与 两个为真才为真否则为假
| 按位或 一个为真都是真
^按位异 两个不同位真 相同为假 比如男女异性
~ 按位非 按位取反
<<左移 向左移动 前面补0 <<2向左移动2位
>>右移 向右移动 前面补0 >>2向右移动2位
>>> 无符号右移 无论符号位统一移动
6.三目运算
表达式:?表达式2,表达式3
7.拓展运算 i++ i先用后运算 ++i 先运算后用
8字符串连接 +
流程控制语句
顺序结构
选择结构
if {}
if {}else{}
if {} elseif{} else{}
switch 分支语句
case具有穿透效果
循环结构
for 循环
while 循环
do while 循环
跳转语句
continue 结束本次循环 开始下次循环
break 结束本层循环
return:结束整个大的循环,回到调用方法处
数组
定义
:所谓数组,是有序的元素序列
动态初始化
int[] arr=new int[5];
静态初始化
int[] arr={1,5,3,1,45}
另外一种写法 int[]arr2=new int[]{1,5,3,6,41}
操作数组
数组名字[下标]
*java数组下标从0开始
数组有哪些限制
长度固定
赋值时下标不能越界
类型必须固定
获取数组长度
arr.length
遍历数组
for 循环
int[]arr={1,5,12,15}
for(i=0;i<arr.length;i++)
System.out.println(arr[i]);
while循环
int[]arr={1,5,12,15}
int index=0;
while(index<arr.length){
System.ouprintln(arr[index++];}
foreach循环
int[]arr={1,5,12,15}
for(int a:arr){
System.out.println(a);}
数组案例
1.排序
冒泡
选择
插入
2找值问题
最大值
最小值
平均值
3搜索
二分法搜索
多维数组
数组之间的嵌套
int[2] [2]arr
[ [ ] [ ] ] [ [ ] [ ] ]
数组拷贝
数组拷贝
数组扩容
数组裁剪
方法
定义
方法也叫做函数,一些代码的一个集合,让这个集合有一个名字,我们可以通过这个名字来使用这些代码
格式
[...修饰符] 返回值类型 方法名(参数列表) {
方法的逻辑
返回一个结果
}
返回值类型:具体的类型关键字,无返回值必须写void
参数列表:五参数不写,有几个参数就写几个
遵循 类型 名字,return 值;
调用
方法名();
方法定义时需要的参数我们调用时必须传入
类型必须符合要求
一个个功能拆分成方法,在main方法中调用各种方法来组织逻辑
特点:不调用不执行
枚举 、泛型
泛型
泛化的类型
泛型在java一种记录类型的手段
<T>
声明阶段
使用阶段
默认 Object
枚举
public enum SeasonEnum
把class改成enum
1.enum编译之后就是一个final class
2.默认继承一个java.lang.Enum的抽象类
switchcase支持枚举
枚举应用场景
季节等又穷集合
游戏方向等等
异常
异常分类
编译时异常
通常语法问题
运行时异常
语法没有问题,但是运行出现一些意外情况
错误 error
不可处理,不用管
异常exception
检查异常 CheckedException
大概率事件,受外部影响
运行时异常 RuntimeException
小概率发生
常见类型
除数为0
ArithmeticExecption
空指针
NullPointerException
数组下标越界
ArrayIndexOutOfBoundsException
数字格式化异常
NumberFormatException
类型转化异常
ClassCastException
异常处理方式
try/catch”捕获异常
try{
*写你认为有可能发生异常的代码
*当某一行发生异常时,他后面的代码都不执行了,直接跳到catch块里执行
}catch(要发生的异常类型){
当异常发生了才执行此处,否则不执行
} finally {}
finally是如何发不发生异常都会执行,用来做最后处理的
关闭io的连接
即使先遇到return,finally也会执行而且肯定在return前执行
throws向上抛出
自定义一个异常类
1.创建一个类
2.想办法让这个类继承自Exception
3.根据你的异常类型来决定自己是检查的还是非检查
如果是非检查的继承Exception,反之必须继承自RuntimeException
4.书写构造方法
throw后面是异常对像
throws后面必须是异常类型 一般写在方法后面
0 条评论
下一页