- 语法规则
- 一个”.java”源文件中是否可以包括多个类(不是内部类)?有什么限制?
- 使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变?
- final,finally,finalize的区别?
- Void 类的作用
- boolean占几个字节?
- java中有几种类型的流?
- 什么是java序列化,如何实现java序列化?或者请解释Serializable接口的作用。
- heap和stack有什么区别。
- 垃圾回收器的基本原理是什么?垃圾回收器可以马上回收内存吗?有什么办法主动通知虚拟机进行垃圾回收?
- 能不能自己写个类,也叫java.lang.String?
- java中实现多态的机制是什么?
- abstract的method是否可同时是static,是否可同时是native,是否可同时是synchronized?
- abstract和interface的区别
- 接口是否可继承接口?抽象类是否可实现(implements)接口?抽象类是否可继承具体类(concrete class)?抽象类中是否可以有静态的main方法?
- 泛型有什么好处
- switch语句能否作用在byte上,能否作用在long上,能否作用在String上?
- 是否可以从一个static方法内部发出对非static方法的调用?
- 运行时异常与一般异常有何异同?
- 请写出你最常见到的5个runtime exception?
- Java中的异常处理机制的简单原理和应用?
- try{}里有一个return语句,那么紧跟在这个try后的finally{}里的code会不会被执行,什么时候被执行,在return前还是后?
short s1 = 1; s1 = s1 + 1;有什么错?short s1 = 1; s1 += 1;有什么错?- &和&&的区别
- Overload和Override的区别?
- 如果两个方法的参数列表完全一样,是否可以让它们的返回值不同来实现重载Overload。
- 构造器Constructor是否可被override?
语法规则
一个”.java”源文件中是否可以包括多个类(不是内部类)?有什么限制?
可以有多个类,但只能有一个public的类,并且public的类名必须与文件名相一致。
使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变?
使用final关键字修饰一个变量时,是指引用变量不能变,引用变量所指向的对象中的内容还是可以改变的。
final,finally,finalize的区别?
- final用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。内部类要访问局部变量,局部变量必须定义成final类型,例如,一段代码
- finally是异常处理语句结构的一部分,表示总是执行。
finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。JVM不保证此方法总被调用
Void 类的作用
在java方法中参数类型不能是void,因此可以用Void类解决这个问题。
boolean占几个字节?
boolean在java规范中没有规定所占的字节数,它所占的字节数由jvm自己规定。 sun jvm中boolean占1个字节。
java中有几种类型的流?
字节流,字符流。
字节流继承于InputStream,OutputStream,字符流继承于InputStreamReader,OutputStreamWriter。
什么是java序列化,如何实现java序列化?或者请解释Serializable接口的作用。
我们有时候将一个java对象变成字节流的形式传出去或者从一个字节流中恢复成一个java对象,例如,要将java对象存储到硬盘或者传送给网络上的其他计算机,这个过程我们可以自己写代码去把一个java对象变成某个格式的字节流再传输,但是,jre本身就提供了这种支持,我们可以调用OutputStream的writeObject方法来做,如果要让java帮我们做,要被传输的对象必须实现serializable接口,这样,javac编译时就会进行特殊处理,编译的类才可以被writeObject方法操作,这就是所谓的序列化。需要被序列化的类必须实现Serializable接口,该接口是一个mini接口,其中没有需要实现的方法,implementsSerializable只是为了标注该对象是可被序列化的。
例如,在web开发中,如果对象被保存在了Session中,tomcat在重启时要把Session对象序列化到硬盘,这个对象就必须实现Serializable接口。如果对象要经过分布式系统进行网络传输或通过rmi等远程调用,这就需要在网络上传输对象,被传输的对象就必须实现Serializable接口。heap和stack有什么区别。
java的内存分为两类,一类是栈内存,一类是堆内存。
栈内存是指程序进入一个方法时,会为这个方法单独分配一块私属存储空间,用于存储这个方法内部的局部变量,当这个方法结束时,分配给这个方法的栈会释放,这个栈中的变量也将随之释放。
堆是与栈作用不同的内存,一般用于存放不放在当前方法栈中的那些数据,例如,使用new创建的对象都放在堆里,所以,它不会随方法的结束而消失。方法中的局部变量使用final修饰后,放在堆中,而不是栈中。
垃圾回收器的基本原理是什么?垃圾回收器可以马上回收内存吗?有什么办法主动通知虚拟机进行垃圾回收?
GC采用有向图的方式记录和管理堆(heap)中的所有对象。通过这种方式确定哪些对象是”可达的”,哪些对象是”不可达的”。当GC确定一些对象为”不可达”时,GC就有责任回收这些内存空间。
程序员可以手动执行System.gc(),通知GC运行,但是Java语言规范并不保证GC 一定会执行。能不能自己写个类,也叫java.lang.String?
可以,但在应用的时候,需要用自己的类加载器去加载,否则,系统的类加载器永远只是去加载jre.jar包中的那个java.lang.String。
java中实现多态的机制是什么?
靠的是父类或接口定义的引用变量可以指向子类或具体实现类的实例对象,而程序调用的方法在运行期才动态绑定,就是引用变量所指向的具体实例对象的方法,也就是内存里正在运行的那个对象的方法,而不是引用变量的类型中定义的方法。
abstract的method是否可同时是static,是否可同时是native,是否可同时是synchronized?
abstract的method不可以是static的,因为抽象的方法是要被子类实现的,而static与子类扯不上关系。
- native方法表示该方法要用另外一种依赖平台的编程语言实现的,不存在着被子类实现的问题,所以它也不能是抽象的,不能与abstract混用。
synchronized应该是作用在一个具体的方法上才有意义。而且方法上的synchronized同步所使用的同步锁对象是this,而抽象方法上无法确定this是什么。
abstract和interface的区别
继承关系:一个类只能使用一个继承关系(单继承),但是一个类可以实现多个接口。
- 在abstract class的定义中,可以赋予方法默认行为,但是在interface中方法不能拥有默认行为(java8后用default修饰的方法可以有方法体)。
abstract class表示的是”is a”关系,interface表示的是”like a”关系。
接口是否可继承接口?抽象类是否可实现(implements)接口?抽象类是否可继承具体类(concrete class)?抽象类中是否可以有静态的main方法?
接口可以继承接口。
- 抽象类可以实现(implements)接口。
- 抽象类可以继承具体类。
-
泛型有什么好处
编译的时候检查类型安全
- 所有强制转换都是自动和隐式的
-
switch语句能否作用在byte上,能否作用在long上,能否作用在String上?
在switch(expr1)中,expr1只能是一个整数表达式或者枚举常量,整数表达式可以是int基本类型或Integer包装类型, 由于byte,short,char都可以隐含转换为int,所以,这些类型以及这些类型的包装类型也是可以的。 显然,long和String类型都不符合switch的语法规定,并且不能被隐式转换成int类型,所以,它们不能作用于swtich语句中。 值得一提的是enum类型可以用在switch中
是否可以从一个static方法内部发出对非static方法的调用?
不可以。因为非static方法是要与对象关联在一起的,必须创建一个对象后,才可以在该对象上进行方法调用,而static方法调用时不需要创建对象,可以直接调用。
运行时异常与一般异常有何异同?
异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机运行时可能遇到的异常。java编译器要求方法必须声明抛出可能发生的非运行时异常,但是并不要求必须声明抛出未被捕获的运行时异常。
请写出你最常见到的5个runtime exception?
ClassCastException,IllegalArgumentException,IllegalStateException,IndexOutOfBoundsException,NullPointerException,FileNotFoundException
Java中的异常处理机制的简单原理和应用?
Java对异常进行了分类,不同类型的异常分别用不同的Java类表示,所有异常的根类为java.lang.Throwable,Throwable下面又派生了两个子类:Error和Exception:
Error表示应用程序本身无法克服和恢复的一种严重问题,程序只有死的份了,例如,说内存溢出和线程死锁等系统问题。
- Exception表示程序还能够克服和恢复的问题,其中又分为系统异常和普通异常,系统异常是软件本身缺陷所导致的问题,但在这种问题下还可以让软件系统继续运行或者让软件死掉,例如,数组脚本越界(ArrayIndexOutOfBoundsException),空指针异常(NullPointerException)、类转换异常(ClassCastException);普通异常是运行环境的变化或异常所导致的问题,是用户能够克服的问题,例如,网络断线,硬盘空间不够,发生这样的异常后,程序不应该死掉。
Exception的处理方案:
- 普通异常必须try..catch处理或用throws声明继续抛给上层调用方法处理,所以普通异常也称为checked异常。
系统异常可以处理也可以不处理,所以译器不强制用try..catch处理或用throws声明,所以系统异常也称为unchecked异常
try{}里有一个return语句,那么紧跟在这个try后的finally{}里的code会不会被执行,什么时候被执行,在return前还是后?
public class ReturnFinallyTest {public static void main (String[] args) {System.out.println("main a=" + a());}public static String a() {String a = "return";try {System.out.println("starting return a=" + a);return a;} catch(Exception e) {} finally {a = "finally";System.out.println("runing finally a=" + a);}return a;}}
返回结果:
starting return a=return runing finally a=finally main a=return从程序运行的结果可以知道:
finally中的代码在return以后执行。
- 方法的返回值会另外做存储,在执行完finally后使用,因此在finally中给a赋值不会影响函数的返回值。
-
short s1 = 1; s1 = s1 + 1;有什么错?short s1 = 1; s1 += 1;有什么错? 对于s
hort s1 = 1; s1 = s1 + 1;由于s1+1运算时会自动提升表达式的类型,所以结果是int型,再赋值给short 类型s1时,编译器将报告需要强制转换类型的错误。对于
short s1 = 1; s1 += 1;由于+=是java语言规定的运算符,java编译器会对它进行特殊处理它等价于s1 = (short)(s1 + 1),因此可以正确编译。&和&&的区别
相同点:
&和&&都可以用作逻辑与的运算符,表示逻辑与(and),当运算符两边的表达式的结果都为true时,整个运算结果才为true,否则,只要有一方为false,则结果为false。
不同点:
- &&还具有短路的功能,即如果第一个表达式为false,则不再计算第二个表达式,例如,对于if(str != null&& !str.equals(“”))表达式,当str 为null 时,后面的表达式不会执行,所以不会出现NullPointerException 如果将&&改为&,则会抛出NullPointerException 异常。If(x==33 &++y>0) y 会增长,If(x==33 && ++y>0)不会增长。
&还可以用作位运算符,当&操作符两边的表达式不是boolean 类型时,&表示按位与操作,我们通常使用0x0f来与一个整数进行&运算,来获取该整数的最低4个bit位,例如,0x31 &0x0f的结果为0x01。
Overload和Override的区别?
Overload是重载的意思。重载Overload表示同一个类中可以有多个名称相同的方法,但这些方法的参数列表各不相同(即参数个数或类型不同)。
- Override是覆盖的意思,也就是重写。重写Override表示子类中的方法可以与父类中的某个方法的名称和参数完全相同,通过子类创建的实例对象调用这个方法时,将调用子类中的定义方法,这相当于把父类中定义的那个完全相同的方法给覆盖了,这也是面向对象编程的多态性的一种表现。
子类覆盖父类的方法时,只能比父类抛出更少的异常,或者是抛出父类抛出的异常的子异常,因为子类可以解决父类的一些问题,不能比父类有更多的问题。子类方法的访问权限只能比父类的更大,不能更小。
如果父类的方法是private类型,那么,子类则不存在覆盖的限制,相当于子类中增加了一个全新的方法。
如果两个方法的参数列表完全一样,是否可以让它们的返回值不同来实现重载Overload。
不行。 因为我们有时候调用一个方法时也可以不定义返回结果变量,即不要关心其返回结果。 例如,我们调用map.remove(key)方法时,虽然remove方法有返回值,但是我们通常都不会定义接收返回结果的变量,这时候假设该类中有两个名称和参数列表完全相同的方法,仅仅是返回类型不同,java就无法确定编程者倒底是想调用哪个方法了,因为它无法通过返回结果类型来判断。
构造器Constructor是否可被override?
构造器Constructor不能被继承,因此不能重写Override,但可以被重载Overload。
