《Java高级编程》复习提纲(小疯版)_第1页
《Java高级编程》复习提纲(小疯版)_第2页
《Java高级编程》复习提纲(小疯版)_第3页
《Java高级编程》复习提纲(小疯版)_第4页
《Java高级编程》复习提纲(小疯版)_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、小疯版权所有一、名词解释泛型、阻塞、多态【详细版】(1)泛型:所谓泛型,就是允许在定义类、接口、方法时使用类型形参,这个类型形参将在声明变量、创建对象、调用方法时动态地指定(即传入实际的类型参数,也可称为类型实参)。(2)阻塞:当前正在执行的线程被阻塞之后,其他线程就可以获得执行机会.被阻塞的线程会在合适的时候重新进入就绪状态,也就是说,被阻塞线程的阻塞解除后,必须重新等待线程调度器再次调度它。(3)多态:Java引用变量有两个类型:一个是编译时的类型,一个是运行时的类型,编译室的类型由声明该变量时使用的类型决定,运行时的类型由实际赋给该变量的对象决定。如果编译时类型不一致,就出现所谓的多态。

2、【精简版】(1)泛型:是指参数化类型(泛化类型)的能力。(2)阻塞:指的是暂停一个线程的执行以等待某个条件发生。(3)多态:指允许不同类的对象对同一消息作出响应。【举例版】(1)泛型:如果声明为List<String> list= new ArrayList<String>,那么集合中只允许包含String类型的对象。(2)阻塞:如果在高速公路上堵车(阻塞),那么只能等前面的车通了之后才能继续行走。(3)多态:例如方法为动物的叫声,如果传入的参数是狗,那么就调用狗的叫声;如果传入的参数是猫,那么就调用猫的叫声。二、简答题(每题10分,共20分)1、请说明”=”和Obje

3、ct类的equals方法和hashcode方法的作用,并实现一个学生类,让学生的姓名和年龄相等则两个学生对象是相等的。(1)=:比较两个对象是否相等,即比较对象在内存中的首地址;如果在基本数据类型中则是比较内容是否相等。(2)equals方法:比较对象的内容是否相等(需要重写)。(3)hashCode方法:比较对象的返回的哈希码是否相等(需要重写)。public int hashCode() return .hashCode();public boolean equals(Object o) if (this = o) return true;if (o instanceof

4、 StudentEqualsHash) StudentEqualsHash s = (StudentEqualsHash) o;if(s.getNumber().equals(this.number) && s.getAge() = this.age) return true;return false;2、 请使用简单代码说明创建线程的三种方式,并说明它们的优缺点。(1)继承Thread类:不能再继承其他父类,编写简单。public class ThreadTest extends Thread public void run() System.out.println(&quo

5、t;Thread");public static void main(String args) new ThreadTest().start();(2)实现Runnable接口:可以继承其他类,编程稍稍复杂。public class RunnableTest implements Runnable public void run() Sys("Runnable");public static void main(String args) Runnable r = new RunnableTest();new Thread(r).start();(3)实现Calla

6、ble接口:可以继续其他类,还可以有返回值类型,编程稍稍复杂。public class CallableTest implements Callable<String> public String call() return "Callable"public static void main(String args)CallableTest c = new CallableTest();FutureTask<String>f=newFutureTask<String>(c);new Thread(f).start();Sys(f.get(

7、);/ 阻塞方法3. 请说明线程的状态及其转换,并说明线程控制相关如下方法的作用,join,yield, sleep, interrupt.(2)线程控制的方法:join:调用线程将被堵塞,直到被加入的join线程执行完为止。sleep:让当前正在执行的线程暂停一段时间,并进入堵塞状态。yield:类似sleep,让当前正在执行的线程暂停,但转入就绪状态而不是堵塞状态。interrupt:让线程立即从堵塞状态转入InterruptedException异常处理流程,再到就绪状态。说明线程同步的概念:同步代码块和同步方法、释放同步锁、同步锁、死锁,请对account的取钱线程进行调试,理解说明上

8、述概念。(1)同步代码块:Synchronized(obj) /此处为同步代码块 obj是同步监视器,通常推荐使用可能被并发访问的共享资源充当同步监视器(例如模拟取钱中的账户)(2)同步方法:用Synchronized关键字修饰的方法(3)释放同步锁:多种途径,如lock.unlock(); /解锁(4)同步锁:private final ReentrantLock lock = new ReentrantLock(); /定义锁对象lock.lock(); /加锁(5)死锁:当两个线程相互等待对方释放同步监视器时就会发生死锁。5、线程的生命周期: 请对照ppt中对线程生命周期的图,结合相关方

9、法说明线程有哪些状态,从一种状态转到另一种状态可以通过什么方法或方式,请使用word进行文字说明(参考ppt)(1) 线程的状态:新建、就绪、运行、阻塞、死亡(2)线程的状态转换:新建状态 Thread t = new Thread(task);新建状态转入就绪状态t.start();就绪状态转入运行状态得到处理器资源,开始执行run方法线程执行流,则该线程处于运行状态。运行状态转入死亡状态 a.run或call方法执行完成,线程正常结束;b.线程抛出一个未捕获的异常;c.调用该线程对象的stop方法(不提倡)。运行状态转入阻塞状态a.线程调用sleep方法主动放弃占用的系统资源;b.线程调用

10、一个阻塞式IO方法,在该方法返回之前,该线程被阻塞;c.线程试图获得一个同步监视器,但更改同步监视器正被其他线程所持有(可使用synchronized关键字避免);d.线程在等待某个通知(object.wait);e.线程调用了其他线程的join方法将等待其他线程执行完毕,然后执行该线程。阻塞状态转入就绪状态(对照修改:运行转入阻塞)a.线程调用sleep方法时间到,转入就绪状态;b.线程调用一个阻塞式IO方法,在该方法返回之后,转入就绪状态;c.线程成功获得一个同步监视器,转入就绪状态;d.线程在获得某个通知(object.notify/notifyAll),转入就绪状态;e.线程处于sle

11、ep、wait、join方法的阻塞状态时,外部调用该线程的interrupt方法后,该线程立即从阻塞状态转入InterruptedException异常处理流程-就绪状态。6、 关于对象比较的两个接口:一是Comparable,二是Comparator分别说明这两个接口方法的说明,对象大小相等与对象equals有什么区别(1)Comparable:在内部类使用,需要重写compareTo方法,返回值为int,例如:public int compareTo(StudentComparable student) return pareToIgnoreCase(student.getNumber()

12、;使用Collections.sort()时直接传递相对应的集合即可,不需要在传递比较器。例如:Collections.sort(StudentList);(2)Comparatro:在外部类使用,需要重写compare方法,返回值为int,例如:public int compare(Student s1, Student s2) return s1.getNumber().compareTo(s2.getNumber();使用Collections.sort()需要传递集合和比较器。例如:Collections.sort(PersonList, new PersonComparator();

13、Comparator也可以在下面两种环境下使用:类的设计者没有考虑到比较问题而没有实现Comparable,可以通过Comparator来实现排序而不必改变对象本身;可以使用多种排序标准,如升序、降序等。(3)与equals区别:equals只是比较是否相等;而以上两个接口是比较大小,而且能排序。7、分别建立HashSet和TreeSet的学生类集合代码请参考老师提供的集合源码collection包7.1对学生类不覆盖equals、hashCode方法,在向HashSet集合中增加不同和相同学生对象时是什么效果,只覆盖其中一个方法呢?两个都覆盖呢(1) 任何情况下(覆盖equals、hashC

14、ode与否),都不能重复增加地址相同的学生对象。(2)只有同时覆盖equals和hashCode方法,才能不重复增加内容相同的学生对象。7.2对学生类不实现Comparable接口,不覆盖equals、hashCode方法,在向TreeSet集合中增加不同和相同学生对象时是什么效果?实现了呢,覆盖了呢?(1) 实现Comparable接口,不会增加内容相同的学生对象。(2)不实现Comparable接口时,必须向TreeSet集合提供一个Comparator比较器,否则程序会报异常,最终效果与实现Comparable一样。(3)覆盖equals、hashCode方法与否不影响结果。9.请使用J

15、DBC给出如下主要过程相关的代码:1)建立与MySql数据库(ip:, port:3306, DataBase: studentdb; 用户名:student, 密码:student)的连接;Class.forName("com.mysql.jdbc.Driver");DriverManager.registerDriver(new com.mysql.jdbc.Driver();Connection con = java.sql.DriverManager.getConnection("jdbc:mysql:/:3306/st

16、udentdb", "student", "student");2) 创建语句对象;Statement stmt = con.createStatement();3) 使用语句对象执行删除表student中id字段值为1的记录;stmt.executeUpdate("delete from student st where st.id = '1'");4) 使用语句对象执行查询表student中name字段值等于“张三”的记录,并遍历打印输出name字段的值ResultSet rs = stmt.execut

17、eQuery("select * from stduent st where = '张三'");while (rs.next() int id = rs.getInt(1);String name = rs.getString(2);System.out.println("id=" + id + ",name=" + name);5) 释放相关资源。Closeall;10、UDP编程1)说明UDP协议与TCP协议的区别,说明在java在上述协议实现中连接和数据传输方面的不同;(1)TCP:面向连接、传输

18、可靠(保证数据正确性和顺序)、用于传输大量数据(流模式)、速度慢、建立连接需要开销较多(时间、系统资源);(2)UDP:面向无连接、传输不可靠、用于传输少量数据(数据包模式)、速度快。2)编程说明udp如何发送数据;InetAddress -BufferedReader -msg=null;-while(msg=localReader.readLine()!=null)byte by=msg.getBytes();DatagramPacket(by,by.length,remoteIP,remotePort);socket.send(by); 3) 编程说明udp如何接受数据;Datagram

19、Packet(new byte512,512);-socket.receive(inputPacket);-System.(new String(p2.getData(),0,p2.getLength(); if(msg.equals("bye")break; 4) 请说明DatagramSocket与DatagramPacket的常用属性作用。DatagramPacket表示存放数据的数据报;DatagramSocket表示接受或发送数据报的套接字。11、TCP编程1)使用ServerSocket和socket类完成从客户端发送一行字符串给服务器,服务器接收后再发回同样一

20、行字符串给客户端,请参考Server.java和Client.javapublic class Server public static void main(String args) Socket s = new ServerSocket(60000).accept();System.out.println("服务器启动成功!");BufferedReader local-BufferedReader br(s.getInputStream);-PrintStream ps = (s.getOutputStream)- msg= null;-while (br.Line()

21、 != null) ps.println(msg);Sys("来自服务器的消息:" + br.readLine();Closeall;public class Client public static void main(String args) Socket s = new Socket("", 60000);BufferedReader local-BufferedReader br(s.getInputStream);-PrintStream ps = (s.getOutputStream)- msg= null;-while (

22、br.Line() != null) ps.println(msg);Sys("来自服务器的消息:" + br.readLine();Closeall;2) 请参考上述代码编码完成:从客户端发送一个double数据、一个文本文件、一个java对象(Student)给服务器端,分别在服务器端打印、另存文件和读取对象/ 发送double数据class Server1 public static void main(String args) Socket s = new ServerSocket(25001).accept();DataInputStream dis = (s.g

23、etInputStream();Sys(dis.readDouble();Closeall;class Client1 public static void main(String args) Socket s = new Socket("", 25001);DataOutputStream dos = (s.getOutputStream();dos.writeDouble(3.14);Closeall;/ 发送文本文件class Server2 public static void main(String args) Socket s = new Se

24、rverSocket(25002).accept();InputStream is = s.getInputStream();FileOutputStreamfos=new("C:/java2.txt");byte buff = new byte64;int hasRead = 0;while (hasRead = is.read(buff) > 0) fos.write(buff, 0, hasRead);fos.flush();/ 清理缓存区Closeall;class Client2 public static void main(String args) So

25、cket s = new Socket("", 25002);FileInputStream fis = new ("C:/java1.txt");OutputStream os = s.getOutputStream();byte buff = new byte64;int hasRead = 0;while (hasRead = fis.read(buff) > 0) os.write(buff, 0, hasRead);os.flush();/ 清理缓存区Closeall;/ 发送对象(省略Student类)class Se

26、rver3 public static void main(String args) Socket s = new ServerSocket(25003).accept();ObjectInputStreamois=new(s.getInputStream();Student st = (Student) ois.readObject();Sys();Closeall;class Client3 public static void main(String args)Socket s = new Socket("", 25003);Student stud

27、ent = new ("1301", "李奕锋", 20);ObjectOutputStreamoos=new(s.getOutputStream();oos.writeObject(student);Closeall;12、完成以文件为例的FileInputStreamFileOutputStream使用,请针对PC上的某一文件(请分别选一个java文件和一个图片文件)进行读取,然后写到另一个新建的文件中,检查新建的文件是否可以正常打开public class FileStreamTest public static void main(String

28、args)/ java文件(可以正常打开)FileInputStream fis1 = new FileInputStream("C:/HelloWorld1.java");FileOutputStream fos1 = new FileOutputStream("C:/HelloWorld2.java");byte bbuf = new byte1024;int hasRead = 0; while (hasRead = fis1.read(bbuf) > 0) fos1.write(bbuf, 0, hasRead);/图片文件(无法正常打开)

29、FileInputStream fis2 = new FileInputStream("C:/java1.jpg");FileOutputStream fos2 = new FileOutputStream("C:/java2.jpg");hasRead = 0; while (hasRead = fis2.read(bbuf) > 0) fos2.write(bbuf, 0, hasRead);Closeall;13、请在word文档中说明流的三种分类标准,写出典型的节点流和处理流,并说明处理流与节点流的一般编程方式(1)按流的方向:输入流和输出

30、流输入流:只读不写,主要由InputStream和Reader作为基类;输出流:只写不读,主要由OutputStream和Writer作为基类。(2)按流所操作的数据单元不同:字节(byte)流和字符(char)流字节流:8位的字节,主要由InputStream和OutputStream作为基类;字符流:16位的字符,以Reader和Writer作为基类。(3)按流的功能角色:节点流和处理流节点流:可以从一个特定的IO设备读/写数据的流,使用节点流使程序直接连接到实际的数据源,节点流也叫低级流。典型:FileInputStream / FileOutputStream、FileReader /

31、 FileWriter;处理流:用于的对一个已存在的流进行连接或封装,通过封装后的流来实现读/写功能,处理流也叫高级流(包装流)。典型:BufferedInputStream / BufferedOutputStream、PrintStream / PrintWriter、BufferedReader / BufferedWriter、InputStreamReader / OutputStreamWriter使用处理流时的典型思路是,使用处理流包装节点流,程序通过处理流来执行输入/输出功能,让节点流与底层I/O设备、文件交互。(优势:简单高效)三、综合题(每题20分,共80分)1.请说明ja

32、va反射技术所涉及的相关类,开发一个student类,包括含两个参数name和age的构造函数及set/get方法、实现含有一个run(Double speed)方法的RunInterface接口,分别说明如何使用反射技术从获得Student类信息、创建Student类实例和调用Student类实例的run方法(注:使用new及直接方法调用不能得分)public interface RunInterface abstract void run(double speed);public class Studentimplements RunInterface private String nam

33、e;private int age;/ 此处省略Student 的有参方法/ 此处省略name和age的get和set方法public void run(double speed) System.out.println(speed);public static void main(String args)Class clazz = Student.class;Constructor constructor = clazz.getConstructor(String.class, int.class);Object object = constructor.newInstance("l

34、iyfieng", 20);Method method = clazz.getMethod("run", double.class);method.invoke(object, 3.14);2. 请给出java输入输出流的分类方式及其特点,并使用图或者表的方式说明其相关类或接口的分类情况。然后给出如下代码:对一个可序列化类Person和相关的输入输出流将其进行序列化保存到文件(c:/myobj.data),然后反序列化从文件读取到内存。输入输出流的分类方式及其特点请看上面第13题public class Person implements Serializable

35、 private String name;private int age;/ 此处省略Person 的有参方法/ 此处省略name和age的get和set方法public class MyObj public static void main(String args)String filePath = "C:/myobj.data"Person person = new Person("liyifeng", 20);ObjectOutputStream oos = new (new FileOutputStream(filePath);ObjectInp

36、utStream ois = new (new FileInputStream(filePath);oos.writeObject(person);Person p = (Person) ois.readObject();Syst("name="+p.getName()+",age="+p.getAge();Closeall;3.说明线程同步的概念,针对一个银行账户对象account,如何分别使用同步代码块和同步方法来完成多线程正确取钱行为,请分别实现上述两种代码。(1)同步代码块public class AccountDrawThread extend

37、s Thread private Account account;private double drawAmount;/ 此处省略AccountDrawThread 的有参方法(String name, Account account, double drawAmount)public void run() synchronized (account) if (account.getBalance() >= drawAmount) Sys(getName()+"成功!吐出钞票:"+drawAmount);account.setBalance(account.getBa

38、lance() -drawAmount);Sys("余额为:"+ account.getBalance(); else Sys(getName()+"失败,余额不足!");public static void main(String args) Account user = new Account("1301030060", 500);new AccountDrawThread("liyifeng", user, 100).start()class Account private String accountNo;

39、private double balance;/ 此处省略Account 的有参方法/ 此处accountNo和balance的set和get方法public int hashCode() return accountNo.hashCode();public boolean equals(Object obj) if (this = obj)return true;if (obj!=null&&obj.getClass()=Account.class) Account target = (Account) obj;Returntarget.getAccountNo().equa

40、ls(accountNo);return false;(2) 同步方法public class NewAccount privateStringaccountNo;privatedoublebalance;/ 此处省略NewAccount 的有参方法/ 此处省略accountNo的set和get方法,balance的get方public int hashCode() return accountNo.hashCode();public boolean equals(Object obj) if (this = obj)return true;if (obj!=null&&obj

41、.getClass()=NewAccount.class) NewAccount target = (NewAccount) obj;return target.getAccountNo().equals(accountNo);return false;public synchronized void draw(double drawAmount) if (balance >= drawAmount) Sys(Thread.currentThread().getName() + "成功!吐出钞票:" + drawAmount);balance -= drawAmoun

42、t;Sys("余额为:" + this.balance);else Sys(Thread.currentThread().getName() + "失败,余额不足");public static void main(String args) NewAccount user = new NewAccount("1301030060", 500);user.draw(123.45);3. 请使用jdbc和SQL语法完成如下任务,其中studentId、courseId不能为空,并为学生表的studentName及课程表中的courseNa

43、me建立索引(20分):1)创建学生表(字段:逻辑主键id,学号studentId,姓名studentName,年龄age,性别sex-0标示女生-1标示男生)和课程表(字段:逻辑主键id,课程编号courseId,课程名称courseName)/ 创建学生表stmt.executeUpdate("create table student("+ "id int auto_increment primary key,"+ "studentId varchar(10) not null,"+ "studentName varch

44、ar(100),"+ "age int, sex int, unique (studentId);");stmt.executeUpdate("create index studentNameIndex on student (studentName);");/ 创建课程表stmt.executeUpdate("create table course("+ "id int auto_increament primary key,"+ "courseId varchar(10) not null,

45、"+ "courseName varchar(25), unique(courseId);")stmt.executeUpdate("create index courseNameIndex on course (courseName);");2) 创建成绩表(字段:逻辑主键id,学生st_fk,课程course_fk,成绩score-百分制,考试标志0标示正常-1标示补考-2标示重考-3标示毕业大补考),其中的学生引用列和课程引用列加入外键约束。/ 创建成绩表stmt.executeUpdate("create table scor

46、e("+ "id int auto_increament primary key,"+ "st_fk, course_fk, score double, type int,"+ "constraint st_score_fk foreign key (st_fk) + "references student (id),"+ "constraint course_score_fk foreign key (course_fk) "+ "references course (id);");3) 请分别使用等值连接查询和学生表左连接查询查出学生课程的成绩记录,并说明这两种查询有什么区别。区别:等值连接会在连接条件中使用等于号(=)运算符比较被连接列的列值,其

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论