基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语法,集合的语法,io的语法,虚拟机方面的语法。
1、一个”.java”源文件中是否可以包括多个类(不是内部类)?有什么限制?
一个.java源文件可以包含多个类,但是只能包含一个public类,而且这个public类的类名必须和文件名一致。这些多个类在编译时会被编译为多个class文件。
2、说说&和&&的区别和联系
&和&&的共同点:
&和&&都可以用作逻辑与运算符,只有前后两个表达式都为真的时候,结果才为真,只要有一方为false,结果为false。
&和&&的区别:
- &&具有短路功能,即只有第一个表达式为真的时候,才会执行第二个表达式,如果第一个表达式为false,则不会执行第二个表达式。常用在if(str != null && !str.equals(“”)){},如果str为null,后面的表达式不会执行,所以不会出现NullPointerException,如果将&&改为&,则会抛出NullPointerException。另一个案例if(x == 3 & ++y >0),当x!=3时,y也会增长。
- &可以作为位运算符,当两边的表达式不是boolean类型时,&表示按位与运算。我们常用0x0f与一个整数进行&运算,来获取该整数的最低4个bit位,例如0x31 & 0x0f的结果为0x01。
这题的答题思路是,先说共同点,再说区别,并举一些经典的案例来佐证,以表明自己理解的透彻深入。
3、Java中如何跳出当前的多重嵌套循环
- break + 外层标号
- flag标识,让外层的循环可以受到里层代码的控制
//在二维数组中查询某个数字
int[][] a = {{1,2,3},{4,5,6,7},{8,9}};
boolean flag = false;
for(int i = 0; i < a.length && !flag; i++){
for(int j = 0; j < a[i].length; j++){
System.out.println(i + ";" + j);
if(a[i][j] == 7){
flag = true;
break;
}
}
}
4、switch语句能否作用在byte上,能否作用在long上,能否作用在String上?
switch(exp)中,exp可以是整数表达式或者枚举常量。
整数表达式可以是int基本类型或者包装类型,由于short、byte、char都可以隐式的转换为int,所以这些类型及其包装类型是可以的。
long和String不符合规定,也不能隐式转换,所以不可以
5、short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?
s1 = s1 + 1; 运算时会进行表达式提升,运算结果为int类型,int类型再赋值给s1 short类型时,会报类型转换错误,需要强制类型转换。
short s1 = 1;
s1 = (short) (s1 + 1); //2
但是s1 += 1;因为+=是Java规定的运算符,编译器会进行特殊的处理,不会报错。
6、char型变量中能不能存贮一个中文汉字?为什么?
char型变量占用2个字节,16位,用来存储Unicode编码,范围从0~65535。
这个编码范围中包含了汉字,所以char型是可以存储汉字的,不过其包含的汉字大小有限,如果生僻汉字没有包含在其中,则char型无法存储。
char s1 = '雪';
System.out.println(s1);
要求触类旁通,知无不言。
7、用最有效率的方法算出2乘以8等于几?
最有效率的运算是位运算,因为它的CPU直接支持的运算。
左移一位相当于*2,乘以8,即时左移3位。
8、、使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变?
引用不能变,引用指向的对象可以变。
final StringBuffer sb = new StringBuffer("test");
//sb = new StringBuffer("newTest"); 编译错误
sb.append("2017");
System.out.println(sb.toString());
9、”==”和equals方法究竟有什么区别?
==是equals都是判断变量是否相等的方法
==的用法
- 判断基本类型时,直接判断基本类型的值是否相等
- 判断引用类型时,判断引用类型的引用地址是否相同
equals方法是Object类提供的实例方法,用来判断当前实例是否和方法内的实例是同一个引用,内部实现是return this == parm,即没用重写的equals就是==。
但是,特殊的,String类重写了equals方法,只要两个String的字符一致,就会返回true。
字符串比较的时候,要使用equals,因为这才是比较实际内容的
String a = "abc";
String b = new String("abc");
a == b; //false
a.equals(b); //true
10、静态变量和实例变量的区别?
静态变量和实例变量都是变量,都可以保存值。
静态变量
- 语法上:是属于类的变量,使用static修饰,
- 程序运行时:在程序加载类的字节码时,它就会被分配内存空间,值会被初始化,然后就可以调用了。
- 使用上:使用时,可以直接通过类名.静态变量进行调用,主要用于类中共性的数据的存储。
实例变量
- 语法上:属于类的实例的,不能使用static修饰
- 程序运行时:它的值在实例初始化的时候被初始化,没有创建实例对象时,实例变量不会被分配空间。
- 使用上:使用实例变量时,必须先将类实例化,使用classInastance.实例变量来调用,用来存储个性化的数据。
例如:
public void test(){
staticCount ++;
instanceCount ++;
System.out.println("staticCount = " + staticCount + "; instanceCount = " + instanceCount);
}
public static void main(String[] args){
InterfaceTest it1 = new InterfaceTest();
it1.test(); //staticCount = 1; instanceCount = 1
InterfaceTest it2 = new InterfaceTest();
it2.test(); //staticCount = 2; instanceCount = 1
}
理论联系实际