泛型
1)泛型类——》泛型参数定义类中
语法:class 类名<泛型参数名1,泛型参数名2...>{}
2)泛型接口——》泛型参数定义接口中
语法:interface 接口<泛型参数名1,泛型参数名2...>{}
3)泛型方法——》泛型参数定义方法中
语法:[访问修饰符 ][static] [<泛型参数名1,泛型参数名2...>] 返回值类型 方法名(参数列表){方法代码}
泛型方法泛型使用步骤
1)定义泛型参数在方法中
语法: [访问修饰符 ][static] [<泛型参数名1,泛型参数名2...>] 返回值类型 方法名(参数列表){方法代码}
2)通过泛型参数代替对应的类型
位置:在对应的方法中使用:参数类型,返回值类型,方法内局部变量类型
3)在调用方法传入泛型参数的具体类型
语法1(静态方法):类名.<具体类型1,具体类型...>方法名(参数);
语法2(成员方法):对象引用.<具体类型1,具体类型...>方法名(参数);
调用方法的时候,可以不出传入泛型参数的具体类型-不传入-自动兼容
自动检查所有的用到泛型参数的类型是否匹配。
传入泛型类型参数:
a)传入具体类型 -->使用对应api的时候泛型类型类型必须传入对应的类型
b)传入带通配符的类型 -->使用对应api的时候泛型类型类型传入 对应类型所限制的范围的类型即可
? :表示匹配任意类型
?extends 类或接口 :表示匹配类型必须是【指定类或接口】或【其子类型】
?super 类或接口 : 表示匹配类型必须是【指定类或接口】或【其超类型】
装饰设计
一个类想要使用另一个类的功能(数据和方法)
两种方式
1)继承
2)组合
A类想使用B类的功能
继承:调用重用代码方便,直接使用,但是只能(单继承)
语法:A继承B
class A extends B{}
组合:调用重用代码需要先调用组合的类,再调用重用代码,可以(多组合)
组合语法:一个类A把另一个类B作为属性(成员变量),就是组合。
class A{
B havaB=new B();
}
IO(流)
流:一个流就是一个管道,通过节点流插入到数据源和程序中,把两者连接起来,如果把数据从数据源读入到程序,那么就是输入流,从程序写出数据到
数据源那么就是输出流。(输入输出是相对程序而言)
流的分类
输入流:把一个数据源的数据--(流向)--程序里,数据源到程序(InputStream、Reader读进来)
输出流:把程序里的数据--(流向)一个数据源,程序到目的地(OutPutStream、Writer写出去)
处理最小数据单元
字节流:按照字节读取数据(InputStream、OutputStream)且数据的单位为字节(8 bit)一个byte
字符流:按照字符读取数据(Reader、Writer)且数据的单位为字节(16 bit)一个char
如果已经有字节流想使用字符流,可以通过转换流完成(字节流———》字符流)
功能
节点流:可以直接从数据源或目的地读写数据。
处理流:不直接连接到数据源或目的地,是处理流的流。通过对其他流的处理提高程序的性能,增强功能。
四个基本抽象类
InputStream:此抽象类是表示字节输入流的所有类的超类。
OutputStream:此抽象类是表示字节输出流的所有类的超类。
Reader:此抽象类是表示字符输入流的所有类的超类。
Writer:此抽象类是表示字符输出流的所有类的超类。
使用步骤
输入流
a)创建数据源
b)通过数据源创建需要的输入流
c)通过流从对应的数据源读取数据
d)关闭流close
输出流
a)创建数据源
b)通过数据源创建需要的输出流
c)创建要写出的数据
d)通过流把数据写到对应的数据源
e)刷新流flush
f)关闭流close
关闭多个流
a)每个流都要关闭
b)先打开的后关闭
注意点:
1)读取文件的数据的时候-》文件必须存在
2)写出数据到文件的时候-》文件可以不存在-》不存在自动创建再写出数据