1.一个".java"源文件是否可以包括多个类?
可以有多个类,但只能有一个public的类,并且public的类名必须与文件名相一致。
2.switch语句能否作用在byte上,能否作用在long上,能否作用在String上?
在switch(expr1)中,expr1只能是一个整数表达式或者枚举常量,整数表达式可以是int基本类型或者Integer包装类型,由于byte,short,char都可以隐含转换为int,所以这些类型以及这些类型的包装类也是可以的,显然long和String类型都不符合switch的语法规定,并且不能被隐式转换成int类型。
3.short s1=1;s1=s1+1;有什么错?short s1=1;s1+=1;有什么错?
作用域 | 当前类 | 同包 | 子类 | 其他包 |
public | Yes | Yes | Yes | Yes |
protected | Yes | Yes | Yes | No |
private | Yes | Yes | No | No |
default | Yes | No | No | No |
8.Overload和Override的区别?Overloaded的方法是否可以改变返回值的类型?
重载表示同一个类中可以有多个名称相同的方法,但这些方法的参数列表各不相同(即参数个数或类型不同)
重写表示子类中的方法可以与父类中的某个方法的名称和参数完全相同,子类覆盖父类的方法时,只能比父类抛出更少的异常,或者抛出父类抛出的异常的子异常。子类方法的访问权限只能比父类更大,不能更小
9.构造器是否可被override?
构造器不能被继承,因此不能重写,但可以被重载。
10.abstract class和interface的区别?
含有abstract修饰符的class即为抽象类,abstract类不能创建实例对象,含有abstract方法的类必须定义为abstract class,abstract class 类中的方法不必是抽象的。abstract class类中定义抽象方法必须在具体子类中实现,所以,不能有抽象构造方法或抽象静态方法。如果子类没有实现抽象中父类中的所有抽象方法,那么子类也必须定义为abstract类型。
接口可以说成是抽象类的一种特例,接口中的所有方法都必须是抽象的。接口中的方法定义默认为public abstract类型,接口中的成员变量类型默认为public static final。
下面比较一下两者的语法区别:
1.抽象类可以有构造方法,接口中不能有构造方法。
2.抽象类中可以有普通成员变量,接口中没有普通成员变量。
3.抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的普通方法。
4.抽象类中的抽象方法的访问类型可以是public,protected,但接口中的抽象方法只能是public类型的,并且默认即为public abstract类型。
5.抽象类中可以包含静态方法,接口中不能包含静态方法。
6.抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能是public static final类型,并且默认即为public static final类型。
7.一个类可以实现多个接口,但只能继承一个抽象类。
11.abstract的method是否可同时是static?
abstract的method不可以是static,因为抽象的方法是要被子类实现的。
12.String是最基本的数据类型吗?
基本数据类型包括:byte,int,char,long,float,double,boolean和short。
java.lang.String类是final类型的,因此不可以继承这个类,不能修改这个类。为了提高效率节省空间,建议使用StringBuffer类。
13.String和StringBuffer的区别?
他们都可以存储和操作字符串,String类提供了数值不可改变的字符串。StringBuffer可以进行字符串修改。
String s="hello";s=s+"world!";s所指向的那个对象没有发生改变,s不指向原来那个对象了,而是指向了另一个String对象,内容为"hello world!",原来那个对象还存在于内存中,只是s这个引用变量不再指向它了。
14.final,finally,finalize的区别?
final用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。
finally是异常处理语句结构的一部分,表示总是执行。
finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法。
15.运行时异常与一般异常有何异同?
异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见运行错误。java编译器要求方法必须声明抛出可能发生的非运行时异常,但是并不要求必须声明抛出未被捕获的运行时异常。
16.error和exception的区别?
error是一种错误,如内存溢出和线程死锁,代码不可控,exception是代码可以控制的。
17.heap和stack的区别?
java的内存分为两类,一类是栈内存,一类是堆内存。栈内存是指程序进入一个方法时,会为这个方法单独分配一块私属存储空间,用于存储这个方法内部的局部变量,当这个方法结束时,分配给这个方法的栈会释放,这个栈中的变量也将随之释放。堆和栈是作用不同的内存,一般用于存放不放在当前方法栈中的那些数据,例如,使用new创建的对象都放在堆里,所以,它不会随方法的结束而消失。方法中的局部变量使用final修饰后,放在堆中,而不是栈中。
18.sleep()和wait()的区别?
sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用sleep不会释放对象锁。
wait是object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获取锁进入运行状态。