黑马程序员技术交流社区

标题: 【石家庄校区】JavaEE 6期就业班 接口到反射总结 [打印本页]

作者: 人贵自知    时间: 2018-1-4 17:08
标题: 【石家庄校区】JavaEE 6期就业班 接口到反射总结
本帖最后由 小石姐姐 于 2018-1-5 09:17 编辑

d1.接口的特点
使用HashSet存储字符串并遍历
创建集合对象
Set是一个接口,
HashSet<> ha = new HashSet<>();
Set<> set = new HashSet<>();
父接口引用指向子类对象(可以使用子类继承过来的方法,父类的变量和方法,但是无法使用子类特有的方法。)
set集合没有索引,所以有三种遍历的方式
1.把set集合转化为数组 T[] s = set.toArray();
2.迭代器,创建迭代器对象,
3.增强for
set集合的特点:
无序,(存储和读取的顺序有可能不一样,顺序和算法有关(HashSet())。)、
不允许重复(要求元素是唯一的)
没有索引
添加元素对象
遍历集合对象
2.使用HashSet存储自定义对象并遍历
输出对象,默认输出的是该对象的toString()方法
哈希值是  地址值通过哈希算法算出来的值
set集合添加时候先比较的是哈希值。然后
Collections工具类的常用静态方法:
C:/Users/Administrator/AppData/Local/YNote/data/qq29008869A006632F01F3406C688E6E2F/1ee13d2724434e3382502e3bd25c27a7/clipboard.png
Iterator , Collection , Object ,
Map
双列集合的顶级,和Collection属于同级.
Map:是一个双列集合,常用于处理有对应关系的数据,key是不可以重复的,我们也称之为是夫妻对集合
Collection: 是单列集合, 有不同的子体系, 有的允许重复且有序,有的是不允许重复且无序
Hash表可以研究一下!
HashMap
删除功能:
V remove(Object key) :根据指定的key,删除对应的关系,并返回key所对应的值.没有删除成功则返回null.
判断功能:
boolean containsKey(Object key):判断指定的key是否存在.
boolean containsValue(Object value) :判断指定的value是否存在.
boolean isEmpty() : 判断是否有对应关系.没有返回true.

添加和修改功能
V put(K key, V value)
1.关联对应关系 就是讲key映射到value,
2.如果key存在则覆盖value.不存在则返回nul
遍历功能
Set<K> keySet() :  获取所有键的集合.
Collection<V> value()  获取所有值的集合.
获取功能
int size() :返回对应关系的个数.
V get(Object key) :根据key获取对应的value
//遍历方式1:通过keySet.
异常
编译的时候和运行的时候出现的错误
异常的体系结构
Throwable(最顶层)
Error: 出现的不能够处理的严重问题
Exception: 可以处理的问题
RuntiomeException: 运行时异常./

try...catch
异常处理方式:
捕获处理
try...catch语句
try {
放有可能出现问题的代码;(不是一定会出现问题的代码)
} catch(ArithmeticExecption) {
出现问题就会到catch
创建对象
处理异常 ;
}
try...catch的执行顺序
首先执行try语句
如果发现异常,异常下面的代码不执行,直接执行catch, catch结束后,try...catch语句结束
如果没有出现, try 结束后, try...catch直接结束, 不执行catch.
jvm处理异常的方式
如果出现异常我们没有处理,jvm会帮我们进行处理,他会把异常的类型,原因还有位置显示在命令行
并且还终止了程序,异常后面的代码将不再执行.
抛异常
当我们不想处理异常,或者没有能力处理的时候,我们可以抛出异常,谁调用方法谁处理异常
使用关键字throws在方法的声明出抛出异常.

如何处理多个异常
1.可以使用多个try...catch 处理异常
2.使用一个try和多个catch.
try{

}catch(Exception e){

}

多个catch之间子可以有父类继承关系.
多个平级catch之间没有顺序关系,,
一个try和多个平级关系的catch,是一个一个进行比较的.如        果有父类异常,必须放到后面 ,如果放到前面会接收所有异常, 不能到达子类异常
JDK1.7一个catch(异常类型 | 异常类型2 | 异常变量名())

C:/Users/Administrator/AppData/Local/YNote/data/qq29008869A006632F01F3406C688E6E2F/502ae52b59aa48a284447d044587ba3c/clipboard.png
原因
类型和原因
类型原因和位置
虚拟机处理 , 遇到问题会挂掉, 我们处理异常, 可以让异常下面的程序也可以执行

IO上
File
File: 文件和目录路径名的抽象表示形式, File类ring ch的实例是不可变的
构造方法:
File(File parent , String child):根据父路径和文件路径创建FIle对象
File f2 =new File("D:\\a","b.txt "File f4 = File(new File("D:\\a"),"b.txt ");File f4 = File(new File("D:\\a"),"b.txt "););
File(String pathname)  
File f3 = new File("D:\\a\\b.txt ");
File(String parent , String child): 根据父路径对象和文件路径创建File对象
File f4 =new File(new File("D:\\a"),"b.txt ");
创建File 对象 : 只是将指定的路径名转换成一个File对象.
   创建一个对象指向一个文件.
File的常见功能
创建功能
boolean createNewFile()
boolean mkdir()
创建指定
c,d文件都不再的时候使用mkdir创建文件夹会失败

boolean mkdirs()
File f4 = new File("c\\d\\e")
使用mkdirs时候c.d不存在会自动创建文件夹
创建多级目录
删除功能
boolean delet()
删除指定的存在的文件并返回true,如果文件不存在返回false
删除一个文件夹, 下面不能有子文件夹.用delet删除的文件不能静茹回收站.
C:/Users/Administrator/AppData/Local/YNote/data/qq29008869A006632F01F3406C688E6E2F/1ff0416d86424b1d89ce0251b3183eeb/clipboard.png
获取功能
FIlte getAbsoluteFile()
以File对象的形式, 返回绝对路径
String getAbsolutePath()
以字符串的形式返回绝对路径.
String getName()
获得File对象文件名或目录名.
String getParent()
File getParentFile()
String getPath()
返回创建File对象时给的路径,如果是绝对路径则获取绝对路径,如果是相对路径则获取相对路径..
long lastModified()
最后的修改时间
long length()
返回File对象(文件的大小)的字节数.
boolean rename()
将当前File对象所指向的路径修改为指定FIle对象的路径
不能修改为已经存在的File名
判断功能
boolean exists();判断File对象指向的路径  文件或者文件夹是否存在
boolean isAbsolute(); 判断File对象指向的路径  是否是绝对路径
boolean isDirectory() :判断File对象指向的路径  是否是文件夹
boolean isFile(); 判断File对象指向的路径  是否是文件
boolean isHidden(): 判断File对象指向的路径  是否有隐藏文件

IO
C:/Users/Administrator/AppData/Local/YNote/data/qq29008869A006632F01F3406C688E6E2F/07e7a9eea28d405a9e6e495da26c57f1/clipboard.png
标准输入流:
public static final InputStream in: 字节输入流(引用型)
InputStream is = System.in
1.用来读取键盘录入的数据.
public static final PrintStream out:字节输出流
OutputStream out = System.out;多态接收
PrintStream是OutputStream的子类.
System.out.pritln();
(类字段) 静态成员变量.
将数据输出到命令行.
pubilc static final int x:(基本型)
由于标准输入流是一个字节输出流,所以只能输出字节或者字节数组,但是我们读到的数据是字符串,如果想要输出还要转换成字节数组
字符操作起来方便.
为了让我们以字符形式操作,以字节形式输出.
转换流

打印流
自动换行
不能输出字节,但是可以输出其他任意类型
通过某些配置可以自动刷新(只有在调用pritlnln(),printf(),format()方法的时候)
也是包装流,不具备写出功能(在其他自身可以写出)
可以把字节输出流转换成字符输出流.
PrintWriter 打印流
注意:只有输出,没有输入
方法:
使用方法println()实现自动换行
自动刷新

對象操作流
ObjectOutputStream()
WriteObject
ObjectOutputStream(OutputStream out)
ObjectInputStream
ReadObject
ObjectOutputStream(InputStream in)
注意:
使用对象输出流写对象,只能使用对象输入流来读取对象
只能支持java.io.Serializable 接口的对象写入流.
读写对象以后可以直接拿来储存和调用,不必再像过去写学生管理系统那样用字符串和逗号分隔对象.

Serializable
序列号,是一个标识接口,只起标识作用,没有方法
当一个类的对象要实现
想把类的对象写入文件要实现Serializable接口
实现序列化接口以后,就可以读写了,

多线程上
1.多线程的概述
进程(Process) : 当前正在运行的程序, 一个应用程序在内存中的执行区域, (运行程序的时候在内存)
线程(Thread) ; 运行程序通过线程, 它依赖进程 , 进程中的一个执行控制单元 , 执行路径
一个进程可以有一个线程,也可以有多个线程
单线程: 安全性高,但是效率低 ,
多线程: 安全性低,但是效率高 , 一个软件可以同时做多个事情(多线程).
多线程案例: 360 ,迅雷等.

并发:
同步:sync , symbolnize , 一步接一步的执行,一个执行完再执行下一个
异步:async 不是一步一步的执行, 而是同时执行多步 , 没个步骤何时结束不确定.
同一个线程内的代码是同步执行的,不同线程的代码是异步执行的
阻塞: 上一行代码在执行,但是没有执行完毕 , 就是阻塞在这里了, 下一行必须等到上一行执行完毕(Scanner)
2.Thread
多线程的实现方式:
方式1:将类声明为Thread的子类,该子类应重写Thread的run方法,接下来可以分配并启动该子类的实例
开启(start())
String getName() 返回线程的名字
void setName(String name)  改变线程名字, 使之与参数name相同
CPU执行程序的随机性.(多个线程是在高速切换,没有顺序,运行时间不确定)
//static Thread currentThread()
static void sleep(long millis)
自己实现的子类对象就是一个线程.
当启动线程以后,线程的执行就脱离了main方法.
Thread.currentThread.getName()
main---也是默认的一个线程/主方法是单线程.
方式2:
实现Runnable的接口
C:/Users/Administrator/AppData/Local/YNote/data/qq29008869A006632F01F3406C688E6E2F/6318315f41334da482e2b874cbced4c6/clipboard.png
C:/Users/Administrator/AppData/Local/YNote/data/qq29008869A006632F01F3406C688E6E2F/3091bb52ffbe4088a52964f1e80a06a9/clipboard.png
Runnable只是代表你线程要做的事情,真正执行线程的是Thread,所以你还要创建线程对象.
没个线程都要调用run()方法, 创建的是哪个Thread对象,就是哪个Thread去调用run(), 在Thread()中传入runnable,告诉线程要做什么.
Thread.sleep(毫秒值) :
C:/Users/Administrator/AppData/Local/YNote/data/qq29008869A006632F01F3406C688E6E2F/487628ba3c194b2a90ece642d32a9759/clipboard.png

C:/Users/Administrator/AppData/Local/YNote/data/qq29008869A006632F01F3406C688E6E2F/f8548b3bfd9948e5a5c469fa0489e35b/clipboard.png
C:/Users/Administrator/AppData/Local/YNote/data/qq29008869A006632F01F3406C688E6E2F/775a2bae1fce45c69fb2343e9481cb09/clipboard.png
synchronized: 同步 ,可以修饰代码块和方法,被修饰的方法和代码块一旦被某个线程访问则直接锁住,其他线程无法访问
同步代码块:
synchronized(锁对象){

}

网络编程
C:/Users/Administrator/AppData/Local/YNote/data/qq29008869A006632F01F3406C688E6E2F/9bcf0d460fcd4cd0b60557e60ad493d6/clipboard.png
Socket(套接字):
抽象的编程的规范.并不是真正存在的,
用于描述IP地址和端口,是一种网络编程机制.
一般是由多个socket之间进行连接,每个socket都是一个端口.
网络通信三要素:
通信协议:TCP 安全,效率稍低,有连接;UDP:效率高,不安全,打包
IP地址:InetAddress:
端口号:
C:/Users/Administrator/AppData/Local/YNote/data/qq29008869A006632F01F3406C688E6E2F/ba17421a83534be5a6849e334758a236/clipboard.png
InetAddress:
互联网协议(IP)地址,





反射
C:/Users/Administrator/AppData/Local/YNote/data/qq29008869A006632F01F3406C688E6E2F/34e446efd044481197fc753c1416ce6b/clipboard.png
反射是运行时期动态的执行代码.

在运行时 , 让-我们可以获取任意一个类的所有方法和属性
在运行时 , 让我们可以调用任意一个对象的所有方法和属性.
反射的前提:
获取类的对象(Class对象)
通过Object的getClass()方法获取,必须用要有对象
Class clazz  = s.getClass();
通过类名获取字节码对象
Class clazz = Student.class;
static Class<?> forName(String className)
Class clazz = Class.forName("com.itheima_01.Student");
1.反射获取构造方法并创建对象:
类的字码对象,相当于用它描述一个类, 之后就和获取它里面的内容.
Constructor<?>[] getConstrutor()
获取public的构造方法.
Constructor<T>  getConstrutor(Class<?> ... parameterTypes )
获取字节码对象
Class clazz =  Class.forName("com.itheima_01.Student");
获取公共的构造方法.
Constructor c = clazz.getConstructor(String.class,int.class);
Constructor c = clazz.getConstructor(String.class,int.class);
创建对象.
Object obj = c.newInstance();
Object obj = c.newInstance("lisi",30);
Object obj = class.newInstance(); 只能创建无参.
2.通过反射获取成员变量并使用
获取学生类的字节码对象
Class clazz = Class.forName(全类名);
获取学生类的对象
Object  stu = clazz.newInstance();
获取public的成员变量
//FIeld[] getFields
Fields[] fs = class.getFields();
//FIeld getField();
获取所有的成员变量.
//FIeld[] getDeclareFields
使用 getDeclareFields可以看到私有的,但是没有权限访问.
用s.setAccessible(): 暴力访问.
一般配合setAccess和Declared使用, 这样不管什么权限修饰的成员都可以获得.
无论权限是什么,都设置暴力访问, 这样程序不会轻易崩溃.
C:/Users/Administrator/AppData/Local/YNote/data/qq29008869A006632F01F3406C688E6E2F/369bef146cbc41ab9ea6338505c2be1d/clipboard.png
--------------------------------------------------------------------------------------------
//////***
类, 属性, 方法
Reflection: [rɪˈflekʃn], 反射
Class类: 类的字节码对象
获取构造方法
Constructor<?>[] getConstructors(): 以数组形式返回该类中所有public的构造方法. 如果没有public的, 则数组长度为0
Constructor<?>[] getDeclaredConstructors(): 以数组形式返回该类中所有权限的构造方法, 包括private的. 如果该类是接口, 基本类型, 数组, void, 则数组长度为0
Constructor<T> getConstructor(Class<?>... parameterTypes): 根据参数列表返回指定的public的构造方法. 参数列表填写参数的字节码对象
Constructor<T> getDeclaredConstructors(Class<?>... parameterTypes): 根据参数列表返回指定的所有权限的构造方法, 包括private的. 参数列表填写参数的字节码对象
获取成员属性
Field[] getFields(): 获取所有public的成员变量
Field[] getDeclaredFields(): 获取所有权限的成员变量, 包括private的
Field[] getField(String fieldName): 通过指定的成员变量名获取指定的public的成员变量
Field[] getDeclaredField(String fieldName): 通过指定的成员变量名获取指定的所有权限的成员变量, 包括private的
获取成员方法
Method[] getMethods(): 返回所有public的方法数组
Method[] getDeclaredMethods(): 返回所有权限的方法数组
Method getMethod(String name, Class<?>... parameterTypes): 获取public的方法, 传入方法名和方法形参字节码对象
Method getDeclaredMethod(String name, Class<?>... parameterTypes): 获取所有权限的指定方法, 传入方法名和方法形参字节码对象
创建对象
T newInstance(): 使用该类的无参构造创建一个对象
Constructor类: 构造方法对象
T newInstance(): 通过无参构造方法对象创建一个类的对象
T newInstance(Object... initargs): 通过有参构造方法对象创建一个类的对象,






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2