1.请列举Java语言中的8种基本数据类型,并说明每种数据类型所占用的空间大小。
答:Java语言的8种基本数据类型有:
byte字节型,占1个字节;
short短整型,占2个字节;
int整型,占4个字节;
long长整型,占8个字节;
float单精度浮点型,占4个字节;
double双精度浮点型,占8个字节;
char字符型,占两个字节;
boolean型,表示逻辑值,有true和false两个值,分别占1个字节。
2.什么是方法重载?(overload)
答:方法重载是指在一个类中可以声明多个同名的方法,而方法中参数的个数或者数据类型不一致。调用这些同名的方法时,JVM会根据实际参数的不同绑定到不同的方法。
3.什么是方法重写/覆盖?(override)
答:在继承关系中,子类的方法与父类的某一方法具有相同的方法名、返回类型和参数列表,则称子类的该方法重写或覆盖父类的方法。
4.什么是容器?
答:在Java当中,如果有一个类专门用来存放其它类的对象,这个类就叫做容器。
5.什么是事件?
答:当用户在界面上执行一个操作,就会产生一个事件。Java中事件是用来描述不同类型用户操作的对象。
6.什么是事件源?
答:事件源,即产生事件的组件。例如:当在Button上单击鼠标时,会产生一个ActionEvent类型的事件,Button就是事件源。
7.什么是事件监听器?
答:调用事件处理方法的对象。当界面操作事件产生并被发送到产生事件的组件时,该组件将把事件发送给能接受和处理该事件的监听器
8.请简述GUI中实现事件监听的步骤。
答: (1)通过实现ActionListener接口或者继承ActionAdapter类实现一个事件监听器类,并对处理监听动作的方法进行重写;
(2)创建事件源对象和事件监听器对象;
(3)调用事件源的addActionLisntener()方法,为事件源注册事件监听器对象
9.线程的生命周期
答:新建、就绪、执行、阻塞、死亡
10.区别:构造方法和普通方法
答: (1)构造方法是类的一个特殊成员,它会在类实例化对象时被自动调用。
(2)普通方法只有在使用的时候才会被调用。
在定义构造方法时要求方法名与类名相同、在方法名的前面没有返回值类型的声明、在方法中不能使用return语句返回一个值。
11.匿名内部类的访问
答: (1)匿名内部类与局部类对作用域内的变量拥有相同的访问权限。
(2)匿名内部类只能访问外部的静态变量 和final修饰的变量
12.区别:继承和多态
答: (1)多态意味着一个对象有着多种形态,可以在特定的情况下,表现不同的状态,从而对应着不同的属性和方法。简单的说,多态就是使用父类的变量引用子类对象,根据被引用子类对象的特性,程序会得到不同的运行效果。
(2)继承是指可以使用现有类的所有功能,并在无需重写原来的类的情况下对这些功能进行扩展。子类继承父类中所有的属性和方法,但是对于private的属性和方法,是父类的隐私,所以子类虽然是继承了,但是不能访问这些属性和方法的引用,所以相当于没有继承。
13.区别:抽象类和接口
答: (1)在Java中,使用abstract关键字修饰的类称之为抽象类。抽象类是不能被实例化的,通常需要写一个子类来继承抽象类,同时实例化子类来获得该类的对象。抽象类通常用于表示一种抽象的概念。
(2)接口可以说是一种特殊的抽象类,接口中只能定义常量和抽象方法。由于接口的特殊性,在定义时需要使用interface关键字。
14.区别:sleep() 和 wait()
答: (1)调用sleep()方法,正在执行的线程主动让出CPU去执行其他线程,在sleep()方法指定的时间过后,CPU才会回到这个线程上继续往下执行,如果当前线程进入了同步锁,sleep()方法并不会释放锁,即使当前线程使用sleep()方法让出了CPU,但其它被同步锁挡住了的线程也无法得到执行。
(2)wait()在一个已经进入了同步锁的线程内进行调用,让当前线程暂时让出同步锁,以便其它正在等待此锁的线程可以得到同步锁并运行。当其它线程调用了notify()方法后,调用wait()方法的线程就会解除wait状态,当再次获得同步锁后,程序可以继续向下执行。
15.区别:String和StringBuffer
答: (1)String类是不可变类,即字符串值一旦初始化后就不可能改变。
(2)StringBuffer是可变字符串类,类似String的缓冲区,可以修改字符串的值。
16.区别:Date和Calender类
答:Date类用来表示某个特定的瞬间,能够精确到毫秒。而在实际应用中,往往需要把一个日期中的年、月、日等信息单独返回进行显示或处理,这个类中的大部分方法都已被标记过时。
Calender类基本取代了Date类,该类中定义了一系列用于完成日期和时间字段操作的方法。
Calendar的getTime()方法,getTime()返回一个表示Calendar时间值的Date对象,同时Calendar有一个setTime(Date date)方法,setTime()方法接收一个Date对象,将Date对象表示的时间值设置给Calendar对象,通过这两个方法就可以完成Date和Calendar对象之间的转换。
17.区别:AWT和Swing
答: (1)AWT提供了一套与本地图形界面进行交互的接口。AWT 所提供的图形功能是各种通用型操作系统所提供的图形功能的交集。由于AWT 是依靠本地方法来实现其功能的,我们通常把AWT控件称为重量级控件。
(2)Swing 是在AWT的基础上构建的一套新的图形界面系统,它提供了AWT 所能够提供的所有功能,并且用纯粹的Java代码对AWT 的功能进行了大幅度的扩充。由于在Swing 中没有使用本地方法来实现图形功能,我们通常把Swing控件称为轻量级控件。
AWT和Swing之间的基本区别:AWT 是基于本地方法的C/C++程序,其运行速度比较快;Swing是基于AWT 的Java程序,其运行速度比较慢。在标准版的Java中则提倡使用Swing。
18.区别:continue和break
答: (1)用break语句可以使流程跳出switch语句体,也可以用break语句在循环结构终止本层循环体,从而提前结束本层循环。只能在循环体内和switch语句体内使用break;当break出现在循环体中的switch语句体内时,只是跳出该switch语句体,并不能终止循环体的执行。若想强行终止循环体的执行,可以在循环体中,但并不在switch语句中设置break语句,满足某种条件则跳出本层循环体。
(2)continue语句的作用是跳过本次循环体中余下尚未执行的语句,立即进行下一次的循环条件判定,可以理解为仅结束本次循环。continue语句并没有使整个循环终止。
19.区别:throws和throw
答: (1)throws出现在方法函数头;而throw出现在函数体。
(2)throws表示出现异常的一种可能性,并不一定会发生这些异常;throw则是抛出了异常,执行throw则一定抛出了某种异常。
两者都是消极处理异常的方式(这里的消极并不是说这种方式不好),只是抛出或者可能抛出异常,但是不会由函数去处理异常,真正的处理异常由函数的上层调用处理。
20.区别:封装和隐藏
答: 对父类变量封装就是将变量设置为private通过set和get方法获取。
对父类方法的隐藏就是子类中复写父类的方法,然后实现多态来隐藏。
21.区别:类方法和实例方法
答: (1)类方法是属于整个类,而不属于某个对象。
(2)类方法只能访问类成员变量,不能访问实例变量,而实例方法可以访问类成员变量和实例变量。
(3)类方法的调用可以通过类名.类方法和对象.类方法,而实例方法只能通过对象.实例方法访问。
(4)类方法只能访问类方法,而实例方法可以访问类方法和实例方法。
(5)类方法不能被覆盖,实例方法可以被覆盖。
22.区别:final和finally
答: (1)final用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。内部类要访问局部变量,局部变量必须定义成final类型。
(2)finally是异常处理语句结构的一部分,表示总是执行。
23.区别:throws和try-catch
答: (1)throws是表明方法抛出异常,需要调用者来处理,如果不想处理就一直向外抛,最后会有JVM来处理;
(2)try catch 是自己来捕获别人抛出的异常,然后在catch里面去处理;
一般情况下,第二种情况要好一些,这样可以清楚地看到异常的原因,并加以修正。
24.catch语句中处理异常时,异常之间是否有继承关系,若有关系,父类在子类的后面,若无关系,顺序任意
25.java中有几种方法可以实现一个线程?请举例说明
答:(1)继承java.lang包下的Thread类,重写Thread类的run()方法,在run()方法中实现运行在线程上的代码。
new Thread() {
public void run(){}
}.start();
(2)实现java.lang.Runnable接口,同样是在run()方法中实现运行在线程上的代码。
new Thread(new Runnable(){
public void run(){}
}).start()
26.多线程有几种实现方法?同步有几种实现方法?
答:多线程有两大实现方法:extends Thread类、implements Runnable接口
(1)继承Thread类,由子类重写run()方法
自定义子类继承Thread类
将让线程运行的代码存储到run()方法中
通过创建Thread的子类对象,创建线程对象
通过子类调用start()方法,开启线程
(2)实现Runnable接口
自定义类实现Runnable接口
将让线程运行的代码存储到run()方法中
创建Thread类线程对象
创建自定义类对象,将自定义类对象作为实际参数传递给Thread类的构造函数(为了让线程对象明确要运行的run方法所属的对象)
调用Thread对象的start方法开启线程,并运行Runnable接口中的run方法synchronized,wait 与notify 都可以实现同步