Java笔记
2022-08-01 09:05:59 0 举报
AI智能生成
更新Java笔记
作者其他创作
大纲/内容
面向对象
类, 对象(对象是类的具体表现)
构造函数(单独无参隐式, 重载必须写无参)
封装
属性封装: setter/getter (alt+shift+s)
修饰符
子主题
同类
同包
子类
all
private
可
不可
不可
不可
默认修饰符
可
可
不可(不同包)
不可
protected
可
可
可
不可
public
可
可
可
可
static
静态属性(成员变量): 类调用, 所有实例共享成员变量(内存中只有一个拷贝)
静态成员方法
使用类调用
可直接调用本类中的静态成员, 静态方法
静态方法必须被实现
静态代码块
类加载, 就执行(顺序执行), 且只执行一次
继承(extends)
符合is-a关系
方法重写: super.方法(调用父类方法)
方法重写和重载
子类中的方法与父类中的方法同名,称为方法重写(方法名相同,形参列表相同)
在一个类中定义多个同名的方法,但要求每个方法具有不同的参数的类型或参数的个数,此现象称为方法重载
同名变量子类优先级高, super可调用父类同名变量
继承关系下子类父类初始化的顺序
父类的属性---->父类的构造函数---->子类的属性---->子类的构造函数
父类的属性---->父类的构造函数---->子类的属性---->子类的构造函数
多态
多态的描述
同一个操作/功能/方法, 传入的参数不同, 执行不同代码, 产生不同的结果
实现多态的前提条件
1.必须有继承关系的类
2.子类必须重写父类的方法
3.向上转型(父=子) 自动类型转换
实现多态的方式
1. 使用父类作为形参
2. 使用父类作为方法的返回值
向上/向下转型
1.父给子 向下转型 强制类型转换 调用子类特有的成员的时候需要强制类型转换为子类类型
2.子给父 向上转型 自动类型转换 调用父类中有,子类重写了父类中的这类方法
abstract关键字修饰
抽象类
抽象类不能被实例化
抽象类中可以有多个抽象方法和多个实例方法
如果一个类中有抽象方法,那么该类一定是抽象类
子类必须重写父类中的所有抽象方法,除非子类也是抽象类
抽象方法
抽象方法没有方法体
接口
符合has-a关系, 一个类可实现多个接口
接口是由全局常量和公共的抽象方法所组成.
接口是解决Java无法使用多继承的一种手段,但是接口在实际中更多的作用是制定标准的
异常
try-catch-finally
try: 放可能发生异常的代码
catch: 一旦try中的代码发生了异常就走catch
finally: 除了退出程序,finally块中的代码无论是否发生异常一定会执行
catch: 一旦try中的代码发生了异常就走catch
finally: 除了退出程序,finally块中的代码无论是否发生异常一定会执行
多个catch块只能执行一个 (子类异常在前)
throw 和 throws
多线程
创建线程
继承java.lang.Thread类
实现java.lang.Runnable接口
run()和start()区别
调用run()只有一条main线程这个路径
调用start() 有多条路径 多个线程抢占CPU交替执行
线程五状态
创建状态 new的时候 创建线程对象的时候
就绪状态 调用start()方法之后就是就绪
运行状态 抢到CPU就是运行 没运行完被其他线程抢走了 那就是就绪状态
阻塞状态 执行过程中由于某些原因导致不能继续运行了就是阻塞状态, 阻塞状态解除变成就绪
死亡状态 线程的功能结束了
线程调度
sleep(long millis)--使当前正在执行的线程以指定的毫秒数暂停
setPriority(int类型的值)--设置优先级
join()--等待这个线程死亡。
yield()--概率礼让同优先级的进程
synchronized关键字
修饰实例方法,作用于当前实例加锁,进入同步代码前要获得当前实例的锁
修饰静态方法,作用于当前类对象加锁,进入同步代码前要获得当前类对象的锁
修饰代码块,指定加锁对象,对给定对象加锁,进入同步代码库前要获得给定对象的锁
(同一时刻只能有一个线程进入synchronized(this)同步代码块)
基础知识
1.James Gosling
2.Java上线1995
3.公司: Oracle
4.JavaSE, JavaME, JavaEE
变量和数据类型
基本数据类型: byte, short, int, long,
float, double, char, boolean,
float, double, char, boolean,
引用数据类型: String, 数组, 自定义数据, 接口, ...
选择结构
if-else
if(判断条件) {
代码块1;
}else {
代码块2;
}
代码块1;
}else {
代码块2;
}
多个if-else
if(判断条件1) {
代码块1;
}else if(判断条件2) {
代码块2;
}else if(判断条件3) {
代码块3;
}... ...else{
代码块4;
}
代码块1;
}else if(判断条件2) {
代码块2;
}else if(判断条件3) {
代码块3;
}... ...else{
代码块4;
}
多重if
if(判断条件1) {
if(判断条件2) {
代码块1;
}
}else {
代码块2;
}
if(判断条件2) {
代码块1;
}
}else {
代码块2;
}
循环结构
for
for(int i=0; i<arr.length; i++){}
while(先判断,再循环)
while(判断条件){}
do-while(先执行,再循环)
do{}while(判断条件);
数组
一维数组
同一数组所有数据类型相同(二维数组一样)
数据类型[] 数组名 = new 数据类型[数组长度];
for循环遍历, foreach增强for循环
排序(升序): Arrays.sort(数组名);
二维数组
数据类型[][] 数组名 = new 数据类型[外层数组长度][内层数组长度];
内层数组长度可不写, 则内层数组长度不一.
集合
Collection接口
List接口 (存储一组不唯一,有序(插入顺序)的对象)
ArrayList (实现了长度可变的数组, 在内存中分配连续的空间. 遍历元素和随机访问元素的效率比较高)
LinkedList (采用链表存储方式. 插入、删除元素时效率比较高)
Set接口 (存储一组唯一,无序的对象)
HashSet
TreeSet
Map接口 (存储一组键值对象,提供key到value的映射)
HashMap
Map 集合名 = new HashMap();
集合名.put(String, String);
集合名.put(String, String);
Map<String,String> 集合名=new HashMap<String,String>();
TreeMap
迭代器(遍历集合)
1.获取迭代器对象
Iterator<要遍历的集合中存储的元素类型> 对象名=要遍历的集合.iteartor()
Iterator<要遍历的集合中存储的元素类型> 对象名=要遍历的集合.iteartor()
2.判断集合中还有没有元素,--对象名.hasNext() true:有 false:没有
3. 一旦有就取出集合中的元素,--对象名.next()
收藏
0 条评论
下一页