java高编复习

名词解释:

1.泛型

答:所谓泛型,就是允许在定义类、接口、方法时使用类型形参,这个类型形参将在声明变量、创建对象、调用方法时动态地指定(即传入实际的类型参数,也可称为类型实参).例如:List,ArrayList
2. 多态
答:Java引用变量有两个类型:一个是编译时的类型,一个是运行时的类型,编译室的类型由声明该变量时使用的类型决定,运行时的类型由实际赋给该变量的对象决定。如果编译时类型不一致,就出现所谓的多态。
3.阻塞
答:当前正在执行的线程被阻塞之后,其他线程就可以获得执行机会.被阻塞的线程会在合适的时候重新进入就绪状态,也就是说,被阻塞线程的阻塞解除后,必须重新等待线程调度器再次调度它。
4. 封装
答:封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面。面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。
5. 继承
答:继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。对象的一个新类可以从现有的类中派生,这个过程称为类继承。新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类)。派生类可以从它的基类那里继承方法和实例变量,并且类可以修改或增加新的方法使之更适合特殊的需要。
6. 抽象:
答:抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。抽象包括两个方面,一是过程抽象,二是数据抽象。
简答题

  1. 什么是可变参数?
    答:Java1.5增加了新特性:可变参数——适用于参数个数不确定,类型确定的情况,java把可变参数当做数组处理。当你调用这个方法的时候,可以传给它任意个参数,JVM都能将这些数据封装成一个数组,然后按照你方法内的操作进行操作。可变参数要注意:可变参数的定义,必须是放在参数列表的最后面,否则编译失败。
  2. JAVA垃圾回收是指什么?
    答:垃圾回收是一种动态存储管理技术,它自动释放不再被程序引用的对象按照特定的垃圾回收算法来实现内存资源的自动回收功能,即能自动释放内存空间,减轻编程的负担。
  3. 什么是初始化数据块?
    答:初始化块是JAVA类里第4种成员(前面依次有成员变量。方法和构造器);由大括号{…}括起,可以由static修饰;没有名字,无法通过对象、类来被调用;总在构造器之前执行,且不能接受形参。
  4. JAVA中"equals"和"=="它们之间有什么区别?
    答:equals 方法(是String类从它的超类Object中继承的)被用来检测两个对象是否相等,即两个对象的内容是否相等,区分大小写。
    ==用于比较引用和比较基本数据类型时具有不同的功能:
    比较基本数据类型,如果两个值相同,则结果为true
    而在比较引用时,如果引用指向内存中的同一对象,结果为true

5、简单给出JAVA 实现线程的两种方式。
答:①继承Thread类
public class ThreadTest extends Thread {
private int i;
public void run() {
//…
}
}
public static void main(String []arg){
new ThreadTest().start();
}
}
②实现Runable接口
public class RunnableTread implements Runnable {
public void run() {
//…
}
public static void main(String []arg){
RunnableTread run = new RunnableTread ();
new Thread(run," ").start();
}
}
6、JAVA抽象类和接口之间有什么区别?
答:接口里只能包含抽象方法,不同包含已经提供实现的方法;抽象类则完全可以包含普通方法。
接口里不能定义静态方法;抽象类里可以定义静态方法。
接口里只能定义静态常量属性,不能定义普通属性;抽象类里则既可以定义普通属性,也可以定义静态常量属性。
接口不包含构造器;抽象类里可以包含构造器(抽象类里的构造器并不是用于创建对象,而让其子类调用这些构造器来完成属于抽象类的初始化操作)
接口里不能包含初始化块,但抽象类则完全可以包含初始化块。
一个类最多只能有一个直接父类,包括抽象类;但一个类可以直接实现多个接口,通过实现多个接口可以弥补Java单继承的不足。
7、String是最基本的数据类型吗?基本类型有哪些?
答:String不是基本数据类型,基本数据类型包括:byte, short, int, long, float, double, boolean, char八大类型。而String是类代表字符串,属于引用类型,所谓引用类型包括:类,接口,数组等。
8、说出ArrayList,Vector, LinkedList的存储性能和特性?
答:ArrayList和Vector都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector由于使用了synchronized方法(线程安全),通常性能上较ArrayList差,而LinkedList使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。
9、&和&&的区别。
答:&是位运算符,表示按位与运算,&&是逻辑运算符,表示逻辑与(and)。
10、sleep() 和 wait() 有什么区别?
答:sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用sleep不会释放对象锁。
wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。
11、GC是什么? 为什么要有GC?
答:GC是垃圾收集的意思(Gabage Collection),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,Java语言没有提供释放已分配内存的显示操作方法。

综合题
1.udp编程

  1. 说明在java在UDP协议与TCP协议实现中连接和数据传输方面的不同
    答:TCP:通过端口来区分程序间的若干通信进程数据的传送是按字节流的方式顺序传播。
    UDP:同样通过端口来区分程序间的若干通信进程数据的传送是按数据报的方式传播,包到达的先后顺序不固定。
    (补充)UDP是一种不可靠的网络服务,负载比较小,而TCP则是一种可靠的通信服务,负载相对而言比较大。TCP采用套接字(socket)或者端口(port)来建立通信。TCP给端口到端口通信提供了错误和流量控制机制,同时TCP还负责建立连接、处理终止和中断的端对端通信控制。
    2)编程举例udp如何发送数据
    答: DatagramPacket packet = new DatagramPacket(buf, length,address,port);
    socket.send(packet);
    3)编程举例udp如何接受数据
    答: DatagramPacket packet = new DatagramPacket(buf, 256);
    socket.receive(packet);
    2.在理解线程同步概念的基础上,针对一个银行账户对象account,编程实现使用同步代码块和同步方法来完成多线程正确取钱行为,请编写两段代码,分别实现这两种实现方法。
    答:同步代码块:
    public class DrawThread extends Thread {
    public void run() {
    synchronized (account) {
    if (account.getBalance() >= drawAmount) {
    System.out.println(“取钱成功”);
    } else
    System.out.println(“取钱失败”);
    }
    }
    }

同步方法:
public class Account {
public synchronized void draw(double drawAmount){
if(account.getBalance() >= drawAmount) {
System.out.println(“取钱成功”);
} else
System.out.println(“取钱失败”);
}
}
3. 请使用jdbc和SQL语法完成如下任务

  1. 创建学生表student(字段:逻辑主键id,学号studentId,姓名studentName,年龄age,性别sex-0表示女生-1表示男生),并给studentName字段创建索引。
    答:DROP DATABASE IF EXISTS studentdb;
    CREATE DATABASE studentdb;
    USE studentdb;
    CREATE TABLE IF NOT EXISTS STUDENT (
    studentId int AUTO_INCREMENT NOT NULL,
    studentNAME varchar(20),
    age int(10),
    sex int(10),
    PRIMARY KEY (studentId));
    CREATE TABLE IF NOT EXISTS COURSE (
    courseId int AUTO_INCREMENT NOT NULL,
    courseName varchar(20),
    PRIMARY KEY (courseId)
    );

CREATE INDEX idx_courseName on studentdb(courseName);

2)使用jdbc完成对MySql数据库(ip:127.0.0.1, port:3306, DataBase: studentdb; 用户名:student, 密码:student)中student表的访问,输出全部学生的学号和姓名。
答:Connection con;
Statement stmt;
ResultSet rs;
String dburl = “jdbc:mysql://127.0.0.1:3306/studentdb”;
String user = “student”;
String password = “student”;
con = DriverManager.getConnection(dburl,user,password);
System.out.println(“连接成功”);
stmt = con.createStatement();

4、编写代码,使用ServerSocket和Socket类完成从客户端发送一行字符串给服务器,服务器接收后再发回同样一行字符串给客户端,请完成Server.java和Client.java类的主要代码;请参考上述代码从客户端发送一个double数据、一个文件、一个java对象给服务器端,分别在服务器端输出、另存文件和读取对象。
public class Client {
public static void main(String[] args) throws IOException {
Socket socket = new Socket(“127.0.0.1”, 30000); // ①

	DataOutputStream dos = new DataOutputStream(new BufferedOutputStream(
			socket.getOutputStream()));
	dos.writeDouble(10.01);
	dos.flush();

	ObjectOutputStream oos = new ObjectOutputStream(
			new BufferedOutputStream(socket.getOutputStream()));
	oos.writeObject(new Student("hzj", 35));
	oos.flush();

	byte[] buff = new byte[32];
	BufferedInputStream bis = new BufferedInputStream(new FileInputStream("\test"));
	bis.read(buff, 0, buff.length);
	System.out.println(buff.length);
	OutputStream os = socket.getOutputStream();
	os.write(buff, 0, buff.length);
	os.flush();

	socket.close();
}

}

public class Server {
public static void main(String[] args) throws IOException {
ServerSocket ss = new ServerSocket(30000);
while (true) {
System.out.println("接受客户连接前 ");
Socket s = ss.accept();
System.out.println(“接受客户链接后”);
DataInputStream dis = new DataInputStream(new BufferedInputStream(
s.getInputStream()));
Double d = dis.readDouble();
System.out.println(“第一个数据:” + d);

		ObjectInputStream ois = new ObjectInputStream(
				new BufferedInputStream(s.getInputStream()));
		try {
			Student st = (Student) ois.readObject();
			System.out.println("学生姓名:" + st.getName() + "  学生年龄:"
					+ st.getAge());
		} catch () {
		}
		
		byte[] buff = new byte[32];
		InputStream is = s.getInputStream();
		FileOutputStream fos = new FileOutputStream(" ");
		BufferedOutputStream bos = new BufferedOutputStream(fos);
		int bytesRead = is.read(buff, 0, buff.length);
		bos.write(buff, 0, buff.length);
		bos.close();
		s.close();
	}
}

}
5、编写Java代码实现单例(Singleton)模式。
Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在。
一般Singleton模式通常有几种种形式:
第一种形式: 定义一个类,它的构造函数为private的,它有一个static的private的该类变量,在类初始化时实例话,通过一个public的getInstance方法获取对它的引用,继而调用其中的方法。
public class Singleton {
private Singleton(){}
//在自己内部定义自己一个实例,是不是很奇怪?
//注意这是private 只供内部调用
private static Singleton instance = new Singleton();
//这里提供了一个供外部访问本class的静态方法,可以直接访问
public static Singleton getInstance() {
return instance;
}
}
第二种形式:
public class Singleton {
private static Singleton instance = null;
public static synchronized Singleton getInstance() {
//这个方法比上面有所改进,不用每次都进行生成对象,只是第一次
//使用时生成实例,提高了效率!
if (instance==null)
instance=new Singleton();
return instance;
}
}
其他形式:
定义一个类,它的构造函数为private的,所有方法为static的。
一般认为第一种形式要更加安全些

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值