1. Runnable接口与Thread类的区别之一:实现Runnable接口的线程类的多个线程,可以方便地访问同一变量,而Thread类则需要内部类进行替代。
2. 线程池最重要的特征也就是最大程度利用线程,其次java线程池的编程模型相对于原有的多线程编程模式来说,一大改进就是线程代码和业务代码分离。
3.
反射机制
4. 反射的出发点就在于JVM会为每个类创建一个java.lang.Class类的实例,通过该对象可以获取这个类的信息,然后实现动态要求。
5. 类被加载到JVM中条件:(1)需要使用该类创建对象。如Student stu = new Student();(2)访问该类的静态成员(staticfinal则不会)。(3)使用Class类的静态forName()方法,动态地加载一个指定类名的类。JDBC导入驱动类就是Class.forName()的一个常用例子。
6. 开发者通过3种途径取得Class对象:(1)Class类的forName方法的返回值。(2)访问所有类都会拥有的静态的class属性。(3)调用所有对象都会有的getClass方法。
7. Field类,代表的是类的属性(字段),也称为成员变量。如:Field field = 对象引用.getClass().getDeclaredField(“成员变量名”); intvalue = (Integer)field.get(对象引用);(其中所得的value就是成员变量的值。)
8. Method类,代表的是类的方法(静态或非静态)。Class<类名> clazz = 类名.class; Method m = class.getDeclaredMethod(“方法名”); 类名 obj =clazz.newInstance(); m.invoke(obj);//调用obj对象指定的方法。Method类最常用的方法是invoke方法,用其实现方法的动态调用。
9. 反射的动态性可以减少许多的代码冗余度。
10. 如何利用反射实例化一个类:需要java.lang.reflect.Constructor类:
//使用无参数的构造方法
Class<Student> clazz = Student.class; //获取Class对象
Student obj = clazz.newInstance();//即产生对象
//使用带参数的构造方法
Constructor<Student> con = clazz.getConstructor(String.class,int.class);//getConstructor里的参数是有参构造函数的参数类型。
obj = con.newInstance(“zhangsan”,30);//其实也完全可以使用无参构造,在setters方法设置即可。
11. 如何使用反射机制来访问一个类的私有成员:Field f = clazz.getDeclaredField(“成员变量名”);f.setAccessible(true);//之后就可以调用f.get(类对象引用);
12. 如何利用反射来覆盖数据对象的toString()方法(一种通用的方式):
public String toString(){
StringBuildersb = new StringBuilder();//定义一个StringBuilder
//得到所有的成员变量Fields
Field[]fields = this.getClass().getDeclaredFields();
//遍历
for(Field f : fields){
sb.append(f.getName());
sb.append("=");
try {
sb.append(f.get(this));//得到变量的名字
}catch (IllegalArgumentException e) {
e.printStackTrace();
}catch (IllegalAccessException e) {
e.printStackTrace();
}
sb.append("\n");//添加一个换行符
}
return sb.toString();//返回结果
}
Java的网络编程
13. TCP/IP协议的理解:大多数计算机语言的网络通信基本编程模式都采用Socket(套接字)的形式(包括java)。TCP/IP(Transmission Control Protocol/Internet Protocol,传输控制协议/因特网互联协议)。TCP/IP是一组包括TCP协议、IP协议、UDP协议、ICMP协议和其他一些协议的协议组。
14. TCP协议的通信特点是什么:(1)面向连接的传输。(2)端到端的通信。(3)可靠性,不出现丢失或乱序。(4)采用字节流方式。
15. Java的TCP编程模型(挺简单的,就是建立socket,进行流传输么~):(1)创建一个服务器端的Socket,指定一个端口号(与客户端的区别)。Java提供了java.net.ServerSocket类来实现这一步:ServerSocket ss = new ServerSocket(int型的端口号);//创建ServerSocket。(2)开始监听来自客户端的请求。ss.accept()//ServerSocket的accept方法。(3)获取输出流或输入流。Socket socket =ss.accept();//accept获取socket对象
OutputStream os= socket.getOutputStream();//获得输出流
InputStream is =socket.getInputStream();//获得输入流
(4)调用输入流/输出流的read()或write()方法,进行数据的传输。如果是字符数据流,一般还可以用BufferedReader或PrintWriter进行数据的传输:
OutputStreamos = s.getOutputStream();//获得输出流
PrintWriter pw = new PrintWriter(os);//创建PrintWriter对象
pw.print(内容);
pw.flush(); //清空缓存
//或者
InputStream is = s.getInputStream();//获得输入流
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr); //创建BufferedReader对象
对于数据写出端,需要调用flush()方法,把缓存中的数据发送到对端,否则可能造成数据不能及时送达的后果。
(5)释放资源。关闭输出流/输入流、Socket和Server Socket对象:
pw.close();//关闭输出流
s.close();//关闭socket
ss.close();//关闭server socket
客户端则不必创建ServerSocket对象,步骤如下:
(1)创建Socket对象,建立与服务器端的连接:
Socket s = new Socket(“IP地址”,端口号); //用IP地址和端口号创建Socket对象
(2)获得输入输出流。
(3)调用输入流/输出流的read()或write()方法,进行数据传输。
(4)释放资源,关闭输入流/输出流、socket对象。
16. UDP协议的通信特点是什么:与TCP不同,UDP不提供对IP协议的可靠机制、控制流以及错误恢复功能等,所以它的头部包含了很少的字节,比TCP负载消耗少,速度也相对快。它服务于域名系统(DNS)、简单文件传输系统(TFTP)、动态主机配置协议(DHCP)、某些视频会议程序和影音串流服务。
17. Java的UDO编程模型:(1)创建数据Socket,指定一个端口号。Java提供java.net.DatagramSocket类来支持这一步:DatagramSocket ds = new DatagramSocket(9999);//创建DatagramSocket对象。(2)对于接受消息的一端来说,提供一个byte数组进行数据存储,而对于发送消息一端,除此以外还需要提供对端的IP地址和端口号:
//创建byte数组
Byte[] buff= new byte[1024];
//创建一个数据包对象
DatagramPacketdp = new DatagramPacket(buff,1024);//长度小于等于buff的长度
//或者
String str =“数据”;
//用byte数组,创建数据包对象
DatagramPacketdp = new DatagramPacket(str.getByte(),0,str.length(),InetAddress.getByName(“localhost”),9999);
(3)调用DatagramPacket的receive()或send()方法进行数据的接收或发送:
ds.receive(DatagramPacket对象);//接收消息
//或者
ds.send(DatagramPacket对象);//发送消息
(4)调用DatagramPacket的getData()方法得到byte数组的数据。dp.getData();这边如果缓存的byte数组长度与接收的数据长度不统一,则需要用某些方法进行数据的切分存储。(5)释放资源。关闭DatagramSocket对象:ds.close();
18. TCP通信的服务端多线程模型中,主线程只负责监听和接收请求,业务代码则放在run方法中如:While((socket=serverSocket.accept())!=null){newMyThread(s).start();}ss.close();业务代码放在Mythread的run方法中。
19. 用TCP通信模型创建一个web服务器中HTTP状态值是200则代表请求成功。
20. 使用java关于网络的API来访问web站点,主要步骤:
(1) 用URL类创建一个资源定位对象;
(2) 调用URL的openConnection()方法得到HttpURLConnection对象。
(3) 调用HttpURLConnection的open方法打开连接。
(4) 用getHeaderFields()方法得到响应结果的头部结果。
(5) 用getInputStream()方法得到输入流对象,得到响应内容。
BufferedReader br = new BufferedReader(newInputStreamReader(conn.getInputStream(), ”UTF-8”));//可以用来转换编码