6、方法的概述
解决某建事情的办法,函数main
计算一个结果
处理一段业务逻辑
有助于程序的模块化开发和处理
方法等于函数
args数组,为main函数接收的参数,可以为空
7、方法的定义格式
修饰符 返回值类型 方法的名称(参数列表){
方法体
return;
}
8、方法定义的注意事项
1)方法不能定义在其他方法之中
2)方法有返回值,则需返回相应数据类型的数据
3)调用方法的时候 参数列表必须定义好
4)方法可以重载
5)参数类型和返回值无关
9、方法重载特性
同一个类中 允许出现同名的方法
参数列表类型不同
参数个数不同
参数类型顺序不同
1)方法重载与名字无关
2)重载与修饰符无关
3)与返回值类型无关
二、面向对象概述
Java语言最大特点
面向对象是对现实世界理解和抽象的一种方法
核心思想
大象放冰箱里
大象:(定义一个类 规定一些属性)
冰箱:(定义一个类 平平 功率 大小)
冰箱.OpenDoor
冰箱.save(大象)
冰箱.close
三、面向对象与面向过程
面向过程:传统程序的设计思路。将一个问题看成是一系列函数或者模块的集合
自顶向下
例如
方法1:打开冰箱门
方法2:放大象
方法3: 关闭冰箱
最大区别:面向对象的程序设计具有更高的灵活性,便于拓展和升级
面向过程主要是针对特定需求满足某业务条件设计。
面向对象的三特征
封装、继承、多态
四、对象
对象指的是一个具体实例,包含属性和方法
学生的某个对象 属性和方法
五、类
具有相同属性和方法的一组对象的集合
六、类和对象的关系
对象是一个具体的实例
类是抽象的
七、类的创建
修饰符 class 类名{
属性:成员变量
方法:成员变量
}
八、对象的使用
1)类名 对象名=new 对象名();
2)对象的属性和方法通过
对象名.属性(或方法使用)
3)不同的对象和属性值是不同的,而且不交叉
相当是一个独立的个体
具有独立的地址和存储空间
4)实现对象之间的交互
九、成员变量与局部变量
成员变量:对象属性,放在对象里面
局部变量: 在方法里面或者 for(int i.....)
局部变量是在栈中
成员变量是在堆中
Heap (堆) 是临时的 由创建对象时所开辟的一块空间,对象销毁之后被回收
Stack (栈) 是方法生成的时候 ,压栈生成 ,程序或方法结束后销毁
十、封装
封装:生活中的包裹 隐私性较好
程序:通过封装成接口,通过方法来调用
1)实现数据的访问权限控制,不是所有人都可以访问
2)实现数据赋值的规范化、标准化、标准化的管控
例如:person中的性别
3)实现封装的方法是
成员变量 加修饰符 private 私有的 无法直接访问 需要生成方法
十一、生成构造函数
new 对象的时候 直接初始化 用到构造函数 -->直接赋值
例如:int[] arr =new arr[]{1,2,3}
Person p=new Person("ferfref",20,'男‘);
构造函数是一种特殊的方法,主要是用来对象初始化 。 总与new 放在一起使用
构造函数的函数名与类名一样
构造函数的重载
构造函数中,可以对初始化的内容进行验证
按住ctrl +左键进入 open declaration 进入到具体的函数和变量定义的地方
十二、构造函数的注意事项
1)构造函数没有返回值
2)有参构造定义后,无参将被覆盖
3)构造函数只能调用一次
4)调用失败则无法创建对象
5)对象实例化是,虚拟机调用构造方法
十三、this关键字
this表示当前类的对象,那个对象调用了this1所属的方法,this就表示那个对象
通过this可以调用当前对象的属性,方法
this(),调用该类的构造函数
十四、static关键字
(1)主要用来修饰类的成员(成员变量、方法)main函数
(2)static特点
1)static修饰的成员在类加载的室友可以直接运行,优先级高
2)类名.成员名 直接访问
3)static是针对所有对象相同时才使用修饰
4)静态的方法不能使用非静态
5)非静态方法可以随便使用静态变量和费静态变量
十五、静态代码块
class 类名{
static{
变量;
}
}
只执行一次
十六、构造代码块(统一初始化)
直接定义没有static修饰
class 类名{
{
变量
}
}
普通代码块
func(){
{
//普通代码块
}
}
(优先级:静态代码块->构造代码块->构造函数->普通代码块)
十七、继承的介绍和继承
1)extends 多个类中存在相同的属性和行为,将这些内容抽象到单独的一个类
无须再定义相同的属性,只需继承即可
2)子类可以访问父类的非私有成员
3)子类不会继承父类的构造方法
4)子类只有一个直接父类,父类可以有多个子类
5)可以有多层继承
十八、方法重写
重载:同一个类中
重写:子类和父类具有相同的方法 子类的方法叫重写
十九、super关键字
1)在子类通过super调用父类构造函数
父类有多个构造函数, 根据参数调用
放在第一行
2)访问父类和子类变量同名父类的变量
3)子类重写了父类的方法,可以通过super调用
super--父类对象
this--子类对象
super.super破坏了java的封装性
二十、final关键字
final关键字 是一个修饰符 可以修饰类 方法 变量;
1)final 修饰一个类 不能被继承
final 类 不想被重写方法、扩展属性 -------直接用 perfect
如:String
2)final修饰方法 方法不能被重写
二十一、static 和final 关键字
static 静态 只保留一个副本
final 最终 不允许被更改
被static 修饰以后 只有一个值
final 有多个值 因为每次都会赋予一个值 只是保证赋予的一个值不变
二十二、Object类
顶级父类 任何类的父类,可以显示继承,也可以隐式继承
toString方法重写 来满足业务
equals方法·重写
二十三、抽象方法
1)抽象方法是一种特殊的方法,没有声明方法体
2)声明的格式为:
abstract 返回值类型 func(参数列表);
3)存在意义,父类不想或无法提供这个方法的方法体
只知道有这个方法。(针对不同的类,实现的方法不一样)
二十四、抽象类
1)如果一个类中含有抽象方法,则该类必须被定义为抽象类。
抽象类中不一定含有抽象方法
2)声明格式
abstract class 类名()----抽象类
3)抽象类的特点
a、抽象类和抽象方法不能用final修饰
b、如果一个类为抽象类,则必须实现其抽象方法,否则必须为抽象类
c、抽象方法必须为 public 或 protected 不能为 private 或 static
二十五、接口
1)抽象类的延伸 ---在一个类中如果所有方法都是抽象方法的,则可以定义为接口
接口 比抽象类更加纯粹 。 全抽象
2)接口实现 implements ---对比 extends 继承
3)java 中 子类只能够有一个直接父类。要多继承,必须使用接口
接口可以试想多次
例如:
class A implements I1,I2{
}
class A extends B implements I1,I2{}
4)接口的声明:
interface 接口名{}
5)接口不能实例化
6)接口当中可以含有成员变量和方法,方法都是抽象的
变量--public static final
一般情况不在接口定义常量
7)接口中可以定义 static 方法和 默认 (default)方法
8)接口中不能有构造函数
二十六、抽象类和接口的区别
1)抽象类可以实现接口,接口可以继承接口
2)接口重定义的方法,都是抽象的,而抽象类中可以含有普通方法
3)接口中的成员变量都是 public static final 的,抽象类中可以含有普通变量
4)接口中一定不含构造方法,但抽象类可以含有构造方法
5)接口不可以实例化,抽象类可以在子类创建对象的时候子弹创建抽象类的对象
6)接口可以多实现,抽象类只能单继承
门和警报的小例子
抽象类 主要针对公共的属性 进行抽象,对于延伸的附加行为定义为接口
二十七、访问权限控制符
java中用来控制类及类的方法和变量的访问权限
1)public :所有都可以访问
2)protected :同包或子类
3)default :包内
4)private : 类中
二十八、多态
多态分为编译时都得多态和运行时的多态
其中,编译时的多态,称为静态多态
运行时多态称为 动态多态,主要通过动态绑定来实现,常说的默认就是多态
为了应对不同的形式
二十九、静态多态
其实就是方法重载,根据参数列表来区分不同的函数
不需要继承
三十、动态多态
例如:品酒大师
三个杯子 倒了 三杯酒
所谓动态多态就是指 引用在不同情况下所表现的实际对象
1)继承(包含实现接口)。在多态中必须存在 父类和子类的关系
2)重写。
3)向上转型,父类引用指向子类对象,可以访问重写父类的方法,子类方法不能访问
三十一、向下转型
向下转型前提 是有 向上转型
三十二、内部类的定义
在java当中的一个类在声明一个类 就叫 内部类的定义
例如:
class Outter1{
class Inner{
}
}
三十三、内部类的分类
1)成员内部类:不能有 static 关键字
普通内部类
2)静态成员内部类:使用 static 修饰的成员内部类
3)局部内部类:局部范围内有效的内部类(方法里面)
4)匿名内部类:没有名字,且属于局部内部类
三十四、成员内部类定义
1)定义:与我们的成员变量一样,可以声明类名,在成员内部类中可以声明属性和方法
2)作用:
a、内部类可以无限制访问外部类的变量和方法(包括private修饰的)
b、内部类可以有多个
c、成员内部类与外部类存在相同的变量或方法,优先使用自己的,如果需要使用外部的
外部类类名.this.变量或方法
三十五、成员内部类和外部类的访问
1)内访外 无限制
2)外访内 通过对象访问
三十六、成员内部类的初始化
1)其他类中访问,首先实现外部类,再实现内部类
new 外部类类名().new 内部类类名();
2)通过外部类的方法来获取内部类对象
三十七、静态成员内部类
使用 static 修饰的成员内部类
例如:
class Outter{
static class inner{
}
}
外部类不是静态的也可以声明静态内部类
静态内部类 要类比 静态成员变量
静态内部类可以通过外部类直接调用 new Outter.Inner();
静态内部类可以直接访问外部类中所有的静态成员和方法(包含private)
三十八、局部内部类
定义在代码块、方法体等的类叫局部内部类
--局部变量 类比
不能够有 public protected private 以及 static 的修饰
class Outter {
public void func(){
class Inner {
}
}
}
非局部都不认识
三十九、匿名内部类
没有名字的局部内部类
必须要继承一个父类或实现一个接口
正常初始化对象
类名 对象名=new 类名();
定义形式
new 父类构造方法(){
修饰符 返回参数类型 方法名(参数列表){
}
}
与局部内部类的区别 局部位置的位置不同
匿名内部类不能有静态属性和方法
匿名内部类 不需要新建一个类
匿名内部类尤其是对Android开发 例如 监听 鼠标事件 键盘 触屏输入
Listener(){
@Override
MouseMoniter(){
}
}
40、内部类的总结
1)成员内部内部类
2)静态内部类
3)局部内部类
4)匿名内部类
1、每个内部类都可以独立继承或实现一个接口,而外部类也可以继承一个直接父类 --多继承
2、通过内部类可以实现对外界的隐藏 --封装
3、内部类可以无限制的使用外部类的成员变量(包括private),不用生成外部类的对象
4、匿名内部类可以简化代码的编写,方法编写时间驱动程序、线程程序
5、成员内部类 静态内部类 可以对比 成员变量和静态变量
局部内部类和匿名内部类 可以对比 局部变量
41、小案例
酒店管理
员工类 ---干活的人
服务员 ---上菜
厨师 ---做菜
经理 --- 管理
顾客类
账单
菜单
接口-----VIP服务 任何需要VIP的都实现该接口
42、面向对象总结
封装继承多态
面对对象的思路去设计程序
43、javaAPI概述
java写好的一些包 类 方法的使用 --API aplication programing Interface应用程序编程接口
java提供的预定义函数
目的,基于API实现程序快速编写,只需了解实现作用,无须关注源代码
44、数值运算--Math类 final修饰
Math类是java提供支持数值运算的类
45、字符串运算(String 类)final修饰
特殊的数据类型
针对一个API
先看 概述
构造方法
成员方法
46、字符串分割 ---split方法
前后台交互或者进行数据接口会用到
47、字符串运算-------规则匹配
正则表达式 身份证 电话号码 邮箱等等
字符类
[abc] 表示abc都可以
[a-zA-Z] a-z或者A-Z 两头字母包含在内
[0-9] 代表0到9的数字
\d 同上
\D 非数字[^0-9]
\w 表示字母数字,包括下划线在内[a-zA-Z0-9]
X? X出现一次或一次也没有
X* X零次或多次
X+ X出现至少一次
X{n} 恰好只有n次
X[n,m] n<=X<=m;
规则表达式(字符串)
^ 正则表达式的开头
$ 表示正则表达式结尾
48、Date
允许JDBC将其标识为SQLDate值
49、Calender
相对较新的日期类,抽象类
(1)简介
public abstract class Calendar extends Object implements Serializable, Cloneable, Comparable<Calendar>
所述Calendar类是一个抽象类,
可以为在某一特定时刻和一组之间的转换的方法calendar fields
如YEAR , MONTH , DAY_OF_MONTH , HOUR ,等等,
(2)初始化
Calender time= Calendar.getInstance();
(3)常用方法
boolean after(Object when) 返回 Calendar是否 Calendar指定时间之后的时间 Object 。
boolean before(Object when) 返回此 Calendar是否 Calendar指定的时间之前指定的时间 Object 。
int getWeekYear() 返回这个 Calendar 。
void set(int year, int month, int date) 设置日历字段中的值 YEAR , MONTH和 DAY_OF_MONTH 。
abstract void add(int field, int amount) 根据日历的规则,将指定的时间量添加或减去给定的日历字段。
void roll(int field, int amount) 将指定(签名)金额添加到指定的日历字段,而不更改较大的字段。
------直接访问(get和set字段编号)
public static final int ERA
public static final int YEAR
public static final int MONTH
public static final int WEEK_OF_YEAR
abstract void add(int field, int amount) 根据日历的规则,将指定的时间量添加或减去给定的日历字段。
abstract void roll(int field, boolean up) 在给定时间字段上添加或减少单个时间单位,而不改变较大的字段。
50、DateFormate 类(抽象类)
(1)简介
public abstract class DateFormat extends Format
DateFormat是日期/时间格式化子类的抽象类,它以语言无关的方式格式化和分析日期或时间。
日期/时间格式化子类(如SimpleDateFormat )允许格式化(即日期文本),解析(文本日期)和归一化。
该日期表示为一个Date对象,或自1970年1月1日00:00:00 GMT以来的毫秒。
(2)初始化
DateFormat df=Date.getInstance()
(3)常用方法
String format(Date date) 将日期格式化成日期/时间字符串。
abstract StringBuffer format(Date date, StringBuffer toAppendTo, FieldPosition fieldPosition) 将日期格式化成日期/时间字符串。
StringBuffer format(Object obj, StringBuffer toAppendTo, FieldPosition fieldPosition) 覆盖格式。
Date parse(String source) 从给定字符串的开始解析文本以生成日期。
51、SimpleDateFormat类
1)简介
public class SimpleDateFormat extends DateFormat ---- (非抽象类)
SimpleDateFormat是一个具体的类,用于以区域设置敏感的方式格式化和解析日期。
Date and Time Pattern Result
"yyyy.MM.dd G 'at' HH:mm:ss z" 2001.07.04 AD at 12:08:56 PDT
2)初始化
SimpleDateFormat() 构造一个 SimpleDateFormat使用默认模式和日期格式符号为默认的 FORMAT区域设置。
SimpleDateFormat(String pattern) 使用给定模式 SimpleDateFormat并使用默认的 FORMAT语言环境的默认日期格式符号。
SimpleDateFormat(String pattern, DateFormatSymbols formatSymbols) 使用给定的模式和日期格式符号构造一个 SimpleDateFormat 。
SimpleDateFormat(String pattern, Locale locale) 构造一个 SimpleDateFormat使用给定的模式和给定的区域设置的默认日期格式符号。
SimpleDateFormat(String pattern) 使用给定模式 SimpleDateFormat并使用默认的 FORMAT语言环境的默认日期格式符号。
使用这个将不许使用smf.applyPattern(pattern);
3)方法
String format(Date date) 将日期格式化成日期/时间字符串。 --------进行重写
Date parse(String text, ParsePosition pos) 从字符串中解析文本以产生一个 Date 。
//void applyLocalizedPattern(String pattern) 将给定的本地化模式字符串应用于此日期格式。
void applyPattern(String pattern) 将给定的模式字符串应用于此日期格式。
52、StringBuffer类
1)简介
任意调节长度和内容
例如:
String s="abc";
s+="1";
StringBuffer buffer
2)构造函数
3)方法
append加入
insert
一、集合(一)
1、集合概念
回忆数组。-----数组长度固定
针对数据长度可变的情况----->集合
java集合 应对动态增长数据 (在编译时无法知道具体数据项)
集合类又称容器类(可变容器)
2、数组和集合的区别
都是容器
(1)数组长度固定,集合的长度可变
(2)数组存基本类型,集合存引用类型
(String 、自定义的对象、Integer-->int 、Long)
(3)基本类型转换为引用数据类型后可用集合存储
3、集合包含的内容
(1)Collection(接口)
public interface Collection<E> extends Iterable<E>
方法
boolean add(E e) 确保此集合包含指定的元素(可选操作)。
Iterator<E> iterator() 返回此集合中的元素的迭代器。
boolean remove(Object o) 从该集合中删除指定元素的单个实例(如果存在)(可选操作)。
1)List集合(接口) ---特定顺序的元素
public abstract class AbstractCollection<E> extends Object implements Collection<E>
public interface List<E> extends Collection<E>
方法
void add(int index, E element) 将指定的元素插入此列表中的指定位置(可选操作)。
2)Set集合(接口) ---不能存在重复元素
public interface Set<E> extends Collection<E>
(2)Map ---类似于小型数据库
主要存储键值对 key-value MapReduce
(3)Iterable 集合迭代
4、集合框架 ->集合的继承关系图
Collection 、Map,List,等都是Interface
AbstractCollection AbstractList 等实现了部分Interface的方法
ArrayList LinkedList 等实现了 所有方法
5、List集合介绍
List集合(有序且可重复,每个元素都有对应的顺序索引)
List可加入重复元素,因为根据索引来范文指定位置的元素
List集合会按照元素的添加顺序来增加元素
6、List集合之ArrayList
(1)简介
ArrayList 基于数组实现的List(实现所有可选列表操作,并允许所有元素,包括null 。)
(2)初始化
ArrayList() 构造一个初始容量为十的空列表。
ArrayList<E> a=new ArrayList<E>()------指定数据类型
(3)方法
boolean add(E e) 将指定的元素追加到此列表的末尾。
void add(int index, E element) 在此列表中的指定位置插入指定的元素。
boolean addAll(Collection<? extends E> c) 按指定集合的Iterator返回的顺序将指定集合中的所有元素追加到此列表的末尾。
boolean addAll(int index, Collection<? extends E> c) 将指定集合中的所有元素插入到此列表中,从指定的位置开始
void clear() 从列表中删除所有元素。
boolean contains(Object o) 如果此列表包含指定的元素,则返回 true 。
int indexOf(Object o) 返回此列表中指定元素的第一次出现的索引,如果此列表不包含元素,则返回-1。
boolean remove(Object o) 从列表中删除指定元素的第一个出现(如果存在)。
E remove(int index) 删除该列表中指定位置的元素。
E set(int index, E element) 用指定的元素替换此列表中指定位置的元素。
Object[] toArray() 以正确的顺序(从第一个到最后一个元素)返回一个包含此列表中所有元素的数组。
(4)List集合遍历的四种方法
1)通过List.size()
2)通过Iterator
3)增强for循环
4)foreach
7、List集合之LinkedList
LinkedList 指的是链表类数据结构
与ArrayList不同
(1)链表中的元素可以任意的增加和删除,而且效率很高,查询效率不如ArrayList(有索引,不需遍历)
(2)将对象存在独立的空间中,而且每一个空间保存了下一个连接的索引
(1)初始化
LinkedList<E> list=new LinkedList();
(2)主要方法
void addFirst(E e) 在该列表开头插入指定的元素。
void addLast(E e) 将指定的元素追加到此列表的末尾。
E get(int index) 返回此列表中指定位置的元素。
E getFirst() 返回此列表中的第一个元素。
E getLast() 返回此列表中的最后一个元素。
E get(int index) 返回此列表中指定位置的元素。
E getFirst() 返回此列表中的第一个元素。
E getLast() 返回此列表中的最后一个元素。
E pop() 从此列表表示的堆栈中弹出一个元素。
二、集合(二)
1、set接口的介绍
Set集合存放无序不可重复的集合
List存放有序重复集合 --索引
Set集合不按照特定方式进行排序,只是放元素放在集合
Set主要由HashSet和TreeSet
2、Set集合-->HashSet
Hash(哈希算法) ----哈希函数定义的好坏
hashCode-----哈希值
(1)equals()方法判断两个元素的hashCode值是否相同
(2) 如果HashCode值相同,继续与集合的元素作比较,
如果还相同则视为同一对象,不保存在HashSet中
如果对象不相同,理论上是要存储的(比较麻烦)---避免发生
(3)如果HashCode不相同,直接把元素存放到HashSet中
(1)简介
public class HashSet<E>extends AbstractSet<E>implements Set<E>, Cloneable, Serializable
(2)构造函数
HashSet<E>set=new HashSet<>();
(3)主要方法
boolean add(E e) 将指定的元素添加到此集合(如果尚未存在)。
boolean contains(Object o) 如果此集合包含指定的元素,则返回 true 。
3、Set集合-->TreeSet
TreeSet是一个有序集合,默认升序,comparable接口
equals判断 是 否重复
比较器 比较大小顺序
4、Map集合
MapReduce,<key,value>键值对
Set和List都属于Collection
Map每一个元素都包含两个对象,key-value键值对
key不能重复 key唯一,value可以多个相同的值
map不存在索引
循环访问方式
5、Map集合 --->HashMap
HashMap是以键值对来存储数据
允许使用null和null键
key值实现元素访问
HashMap可以实现快速访问
HashMap中元素存放是无序的
Hash算法
public class HashMap<K,V>extends AbstractMap<K,V>implements Map<K,V>, Cloneable, Serializable
(2)初始化
(3)主要方法
V put(K key, V value) 将指定的值与此映射中的指定键相关联。
boolean containsKey(Object key) 如果此映射包含指定键的映射,则返回 true 。
boolean containsValue(Object value) 如果此Map将一个或多个键映射到指定值,则返回 true 。
Set<Map.Entry<K,V>> entrySet() 返回此Map中包含的映射的Set视图。
V get(Object key) 返回到指定键所映射的值,或 null如果此映射包含该键的映射。
Collection<V> values() 返回此地图中包含的值的Collection视图。
Set<K> keySet() 返回此地图中包含的键的Set视图。
(4)遍历
1)利用KeySet循环遍历Map
2)通过Values遍历
3)通过EntrySet遍历Map
6、Map集合---->Hashtable
Hashtable 不允许null值作为键
该类实现了一个哈希表,它将键映射到值。 任何非null对象都可以用作键值或值。
与HashMap不一样的方法
Enumeration<V> elements() 返回此散列表中值的枚举。
实现枚举接口的对象生成一系列元素,一次一个。
连续调用nextElement方法返回系列的连续元素。
(特别)利用枚举型遍历
Set<K> keySet() 返回此地图中包含的键的Set视图。
7、总结
Hashtable 基于Dictionary类,HashMap比较年轻(JDK 1.2)
Hashtable 不允许null值,HashMap允许
Hashtable 有Enumeration keys,HashMap没有
三、异常
1、异常概念
1)异常分为:编译时异常,运行时异常
2)编译异常:java IDE(,''),一般是指的语法错误,比较容易修正
3)运行时异常:运行错误或逻辑错误
1/0
4)不正常事件。
异常类,创建对象
NULLPointException空指针异常
5)异常处理机制
抛出异常-----110
catch 异常----依靠自己
2、异常的分类
1)Throwable---异常的处理方式(异常类的鼻祖)Throwable类是Java语言中所有错误和异常的Throwable类。
2)Error:错误
3)Exception:
a、CheckedException try catch显式捕获
例如:
b、RuntimeException
常见异常
ArithmeticException :算数异常 例如 除数为0
IndexOutOfBoundsException数组越界
NULLPointException空指针异常
IOException:IO异常
FileNotFoundException
ClassNotFoundException
SQLException :SQL异常
3、异常处理
1)捕获异常 try catch
try:监视异常的发生
try{
可能出现的异常
}catch{
处理异常1
}catch{
处理异常2
}
1)catch语句可以有多个
2)从上到下catch 先小后大
3)try catch只会处理一个catch语句块
异常尽量以避免为主。实在无法避免,难以预期可以用 try catch
2)逃避异常 throws
异常处理不了,直接丢出异常
3)finally 做最后处理
try{}catch{}finally{}
finally语句一定会执行,且不影响后面的语句执行
但是throws会终止后面语句的执行
建议统一使用 try catch finally
4、异常 ---->方法抛出异常 throw关键字
throw 抛出异常,手动引发异常,例如throw new Exception();
throws 抛出异常,抛出多个异常并不是处理异常。-----推卸责任
谁调用抛给谁
5、异常->异常处理方式 try...catch ...finally
try{
可能出现异常的代码
}catch(异常处理类型1 e1){
处理异常的代码
}catch(异常处理异常2 e2){
}...
(1)catch可以有多个
(2)异常的捕获必须从小类的异常 到大类型的异常
(3)最多执行一个catch块
(4)catch后面的语句仍然可以执行(catch不会中断执行)
finally:一定会执行的代码,一般用来做资源的释放
例如:数据库连接的关闭
try catch finally 也可以直接与try连用
try finally
try catch finally不能单独存在。catch与finally必须与try连用
6、自定义异常
一个类继承(RuntimeException),主要针对Exception无法解决的异常Exception
四、IO流
1、IO概述
Input:将磁盘或硬盘、键盘灯数据读入到内存
Output: 从内存输出到 硬盘、磁盘等
主要以内存为基准
2、输入输出流的分类
(1)字节流
1Byte = 8 bit
1KB =1024B
1MB = 1024KB
1GB = 1024MB
1TB = 1024GB
1FB = 1024TB 商业的存储空间 都认为是1000为单位
字节流可以处理所有数据类型的数据,在java中以Stream结尾的
(2)字符流
一字符 = 2Byte
字符流对于处理文本数据有优势,在java 中以Reader 和Writer结尾
(3)IO包
java.io---HDFS 离线计算
3、File类
文件和目录的抽象的表示
(1)构造方法
File(String pathname) 通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例。
File file = new File(pathname)
pathname:绝对路径或相对路径
可是文件目录或文件
(2)主要方法
boolean exists() 测试此抽象路径名表示的文件或目录是否存在。
boolean isDirectory() 测试此抽象路径名表示的文件是否为目录。
boolean isFile() 测试此抽象路径名表示的文件是否为普通文件。
File[] listFiles() 返回一个抽象路径名数组,表示由该抽象路径名表示的目录中的文件。
boolean createNewFile()当具有该名称的文件尚不存在时,原子地创建一个由该抽象路径名命名的新的空文件。
4、FileInputStream --输入字节流
FileInputStream用于读取诸如图像数据的原始字节流
public class FileInputStream extends InputStream
(1)构造函数
1)FileInputStream(File file) 通过打开与实际文件的连接创建一个 FileInputStream ,
该文件由文件系统中的 File对象 file命名。
FileInputStream is = new FileInputStream(new File(pathname))
(2)常用的方法
1)int read() 从该输入流读取一个字节的数据。到达末尾返回-1
2)int read(byte[] b) 从该输入流读取最多 b.length个字节的数据为字节数组。
5、FileOutputStream --- 输出字节流
FileOutputStream用于写入诸如图像数据的原始字节流
(1)构造方法
FileOutputStream(File file) 创建文件输出流以写入由指定的 File对象表示的文件。
FileOutputStream(File file, boolean append) 创建文件输出流以写入由指定的 File对象表示的文件。 (追加模式)
(2)主要方法
void write(byte[] b) 将 b.length个字节从指定的字节数组写入此文件输出流。
void write(byte[] b, int off, int len) 将 len字节从位于偏移量 off的指定字节数组写入此文件输出流。
void write(int b) 将指定的字节写入此文件输出流。
public void flush()throws IOException
6、FileReader ---输入字符流
(1)构造方法
FileReader(File file) 创建一个新的 FileReader ,给出 File读取。
FileReader(FileDescriptor fd) 创建一个新的 FileReader ,给定 FileDescriptor读取。
FileReader(String fileName) 创建一个新的 FileReader ,给定要读取的文件的名称。
(2)主要的方法
public int read() 每次读取一个字符,-1 文件结束
public int read(char[] cbuf,int offset,int length)throws IOException将字符读入数组的一部分。
7、FileWrite --输出字符流
(1)构造方法
FileWriter(File file) 给一个File对象构造一个FileWriter对象。
FileWriter(File file, boolean append) 给一个File对象构造一个FileWriter对象。
(2)主要方法
public void write(char c)
public void write(char[] cbuf, int off, int len) 写入字符数组的一部分。
public void write(String str, int off, int len) 写一个字符串的一部分。
8、BufferedReader
(1)InputStreamReader ---字符输入流
字节流转换为字符流的桥梁
编码问题,可以指定编码 。 --- utf-8
1)构造函数
InputStreamReader(InputStream in) 创建一个使用默认字符集的InputStreamReader。
· InputStreamReader(InputStream in, Charset cs) 创建一个使用给定字符集的InputStreamReader。
InputStreamReader(InputStream in, CharsetDecoder dec) 创建一个使用给定字符集解码器的InputStreamReader。
InputStreamReader(InputStream in, String charsetName) 创建一个使用命名字符集的InputStreamReader。
2)主要方法
String getEncoding() 返回此流使用的字符编码的名称。
int read() 读一个字符
int read(char[] cbuf, int offset, int length) 将字符读入数组的一部分。
(2)BufferedReader
可以吧字符流效率提高,提供缓冲
可以使用 FileReader InputStreamReader等作为参数
实现字节流到字符流的缓冲
1)构造方法
String readLine() 读一行文字。
9、BufferedWriter
(1)OutputStreamWriter
将字节流转换为字符流的桥梁
1)构造方法
OutputStreamWriter(OutputStream out) 创建一个使用默认字符编码的OutputStreamWriter。
OutputStreamWriter(OutputStream out, Charset cs) 创建一个使用给定字符集的OutputStreamWriter。
OutputStreamWriter(OutputStream out, CharsetEncoder enc) 创建一个使用给定字符集编码器的OutputStreamWriter。
OutputStreamWriter(OutputStream out, String charsetName) 创建一个使用命名字符集的OutputStreamWriter。
2)主要方法
String getEncoding() 返回此流使用的字符编码的名称。
void write(char[] cbuf, int off, int len) 写入字符数组的一部分。
void write(int c) 写一个字符
void write(String str, int off, int len) 写一个字符串的一部分。
(2)BufferedWriter
1)构造函数
BufferedWriter(Writer out) 创建使用默认大小的输出缓冲区的缓冲字符输出流。
BufferedWriter(Writer out, int sz) 创建一个新的缓冲字符输出流,使用给定大小的输出缓冲区。
2)主要方法
void newLine() 写一行行分隔符。
void write(char[] cbuf, int off, int len) 写入字符数组的一部分。
void write(int c) 写一个字符
void write(String s, int off, int len) 写一个字符串的一部分。
10、序列化与反序列化
序列化 就是把对象转换为字节序列的过程
反序列化 就是把字节恢复为对象的过程
11、ObjectOutputStream --序列化(把类序列化需要实现Serializable接口)
(1)构造函数
protected ObjectOutputStream()
为完全重新实现ObjectOutputStream的子类提供一种方法,
不必分配刚刚被ObjectOutputStream实现使用的私有数据。
ObjectOutputStream(OutputStream out)
创建一个写入指定的OutputStream的ObjectOutputStream。
(2)主要方法
void write(byte[] buf) 写入一个字节数组。
void write(byte[] buf, int off, int len) 写入一个子字节数组。
void write(int val) 写一个字节。
12、ObjectInputStream --反序列化
(1)构造函数
ObjectInputStream(InputStream in) 创建从指定的InputStream读取的ObjectInputStream。
(2)主要方法
Object readObject() 从ObjectInputStream读取一个对象。
13、POI 实现对word\excel文件操作
Apache --
五、多线程
1、多线程简介
进程:系统资源分配单位。(CPU 硬盘 内存 网络)
线程:独立调度和分配的基本单位,共享进程资源
一个进程 包含多个线程,用来完成不同的工作,称之为 多线程简介
进程是为了提高系统资源利用率和系统资源吞吐量
线程是为了减少程序在并发执行时的时空开销
2、线程的使用
(1)继承Thread类
public class Threadextends Object implements Runnable
1)构造方法
Thread() 分配一个新的 Thread对象。
Thread(String name) 分配一个新的 Thread对象。
声明方式:
public class 线程类名 extends Thread{
重写run方法
}
调用开启线程:
线程类名 初始化
线程类名.start()
2)主要方法
void run() 如果这个线程使用单独的Runnable运行对象构造,
则调用该Runnable对象的run方法;
否则,此方法不执行任何操作并返回。
void start() 导致此线程开始执行;
Java虚拟机调用此线程的run方法。
static Thread currentThread()
返回对当前正在执行的线程对象的引用
String getName()
返回此线程的名称。
(2)实现Runnable接口
5、线程的优先级
默认 5
最高 10
最低 1
优先级是一种概率
6、守护线程
用户线程:User Thread
守护线程: Daemon Thread,为其他新陈那个提供服务,例如,垃圾回收线程gc
守护线程主要是在用户线程都执行完的情况下执行,如果没有用户线程执行,守护线程自动退出
finally
六、多线程(二)
1、买票小案例
2、线程的同步
(1)同步代码块
回忆,代码块
synchronized(){
//代码
}----同步代码块
同步代码块是一种高开销操作,里面代码尽可能少
(2)同步方法
synchronized 修饰的方法
(3)互斥锁
lock:保证数据完整性
ReentrantLock 创建一个ReentrantLock实例
主要方法
void lock() 获得锁。
void unlock() 尝试释放此锁。
3、线程的notify和wait
wait:线程等待,直到另一个线程调用该对象的notify()方法或notifyAll()方法。
notify:唤醒正在等待对象监视器的单个线程
notifyAll:唤醒正在等待对象监视器的所有线程
sleep:static void sleep(long millis) 使当前正在执行的线程以指定的毫秒数暂停(暂时停止执行),
具体取决于系统定时器和调度程序的精度和准确性。
sleep:Thread类方法
wait:继承自Object
4、线程池概念
多线程运行时运行机制,包括排队策略,包括线程存活时间,框架策略
5、线程池的使用
ThreadpoolExcutor
ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory)
创建一个新的 ThreadPoolExecutor与给定的初始参数和默认拒绝执行处理程序。
corePoolSize:核心池大小
maximumPoolSize:线程池最大线程数
keepAliveTime:线程没有任务,最多多长时间会终止。>=corePoolSize
TimeUnit:时间单位
workQueue:用于存放待执行的任务
ArraryBlockingQueue、LinkedkingQueue、SynchronousQueue等
(2)主要方法
void execute(Runnable command) 在将来某个时候执行给定的任务。
submit:提交任务
shutdown:关闭线程池
shutdownnow:立即关闭
七、反射
1、反射获取clas对象的三种方法
反编译
不是自己写的类,也不知道类里的方法和变量 , 让你能够使用
程序上线了,修改程序 但不终止程序的运行, --- 反射
(1)Object 类的getClass方法
返回此 Object的运行时类。
String getName() 返回由 类对象表示的实体(类,接口,数组类,原始类型或空白)的名称,作为 String 。
(2)通过Class属性来获得
都有一个静态属性class
(3) 通过forName
static 类<?> forName(String className) 返回与给定字符串名称的类或接口相关联的 类对象。
2、反射获得构造方法
(1)获得
Constructor<?>[] getDeclaredConstructors() 返回一个反映 Constructor对象表示的类声明的所有 Constructor对象的数组 类 。
Constructor<T> getDeclaredConstructor(类<?>... parameterTypes) 返回一个 Constructor对象,该对象反映 Constructor对象表示的类或接口的指定 类函数。
Constructor<T> getConstructor(类<?>... parameterTypes) 返回一个 Constructor对象,该对象反映 Constructor对象表示的类的指定的公共 类函数。
Constructor<?>[] getConstructors() 返回包含一个数组 Constructor对象反射由此表示的类的所有公共构造 类对象。
(2)使用
T newInstance() 创建由此 类对象表示的类的新实例。
访问私有的构造方法必须通过Accessible设置为 true
public void setAccessible(boolean flag)
throws SecurityException
将此对象的accessible标志设置为指示的布尔值。
true的值表示反射对象应该在使用时抑制Java语言访问检查。
false的值表示反映的对象应该强制执行Java语言访问检查。
3、反射获取所有字段
Field[] getDeclaredFields()
返回的数组 Field对象反映此表示的类或接口声明的所有字段 类对象。
Field getField(String name)
返回一个 Field对象,它反映此表示的类或接口的指定公共成员字段 类对象。
Field[] getFields()
返回包含一个数组 Field对象反射由此表示的类或接口的所有可访问的公共字段 类对象。
4、反射获取方法及其使用
public 方法 getDeclaredMethod(String name,
类<?>... parameterTypes)
throws NoSuchMethodException,
SecurityException返回一个方法对象,
它反映此表示的类或接口的指定声明的方法类对象。
方法[] getDeclaredMethods()
返回包含一个数组 方法对象反射的类或接口的所有声明的方法,
通过此表示 类对象,包括公共,保护,默认(包)访问和私有方法,
但不包括继承的方法
Object invoke(Object obj, Object... args) 在具有指定参数的 方法对象上调用此 方法对象表示的底层方法。
5、泛型
安全检测机制
例如:ArrayList<T>
如何写一个方法 实现排序
6、泛型方法
(1)基本原则
a、所有泛型方法的声明都有一个类型参数声明的部分(<T>)--表示所有类型的参数
b、泛型方法只能是引用数据类型
例如:
public static <T> void show(){
}
7、泛型类
增加了类型声明的部分
class Test<T>{
private T t;
}
8、泛型擦除
java本身不存在泛型。增加了泛型机制。-- java虚拟机中都是确定的类型 泛型擦除
9、泛型通配符
<?> -- 代表具体类型的参数
例如:public void print(List<?> l){
l.get(0);
}
<T> -- 指所有数据类型
10、反射与泛型
泛型:允许程序员在编译时检测到非法数据类型,运行期间,泛型擦除
通过反射可以添加不同的数据类型。Object
八、MySQL
1、MySQL概要
关系型数据库 -- Access数据库 Oracle数据库 Postgressql
非关系型数据库 -- Hbase 等
库: -- package
表: -- class
字段: -- 属性
Oracle 旗下产品 -- 分两种 (dpl协议的 社区版 和 企业版)
CDH HDP -- 后面大数据
Apache -- hive HDFS Hadoop
RDBMS: 关系数据库管理系统。将数据存储在不同库的表里面
支持标准SQL语句(100%)(体积小、数据库)
3、安装
DBA数据库管理员
4、MySQL数据类型
(1)数值类型
1)整型
tinyint(一个字节)、smallint(2)、mediumint(3)、int(4)、bigint(8)
2)浮点型
(float(M,D)(小数位数部分会四舍五入)、double)3.15
3)定点数
可变长度decimal(M,D)M:有效位数,D:小数位数 3.14
3.145
(2)字符串
char:定长字符串
varchar :变长字符串
blob: 二进制字符串 存储文件或图片等
text:非二进制字符串 -- 长文本类型
(3)日期数据类型
datetime:2018-12-22 21:04:35
timestamp:时间戳 201812228000 ms
5、MySQL 外键、主键、唯一键
(1)外键 关联其他表的
(2)主键 唯一不可重复
(3)唯一表
6、SQL语句 -- 增删改查
SQL:Stryctrue Query Language. -- HiveQL Spark SQL
查询:
select * from 表名 [limit 行数][where 语句]
插入:
insert into 表名[字段名] values(数据)
修改:
update 表名 set 字段名 = 值 where 条件
删除:
delete from 表名 [条件]
truncate [表名]
7、
![](https://img2024.cnblogs.com/blog/35695/202408/35695-20240826070647288-243310440.jpg)