switch 是否能作用在 byte 上,是否能作用在 long 上,是否能作用在 String 上
在jdk1.5之前只支持byte,short,char,int。jdk1.5引入枚举,switch支持枚举。jdk1.7开始支持String。long在所有版本中都不支持。
用最有效的方式计算2*8
位运算。2 << 3(左移3位相当于乘以2的3次方,右移3位相当于除以2的三次方)
Math.round(11.5) 等于多少?Math.round(-11.5)等于多少
Math.round是将值 + 0.5,向下取值。所以Math.round(11.5) = 12,Math.round(-11.5) = -11。
float f = 3.4 是否正确
&emsp 不正确,3.4是双精度数,将双精度数(double)赋值给浮点型(fload)属于向下转型,会造成精度损失,因此需要强制类型转换fload f = 3.4f或者 fload f = (fload)3.4;
short s1 = 1; s1 = s1 + 1;有错吗?short s1 = 1; s1 += 1;有错吗
对于 short s1 = 1; s1 = s1 + 1;由于 1 是 int 类型,因此 s1+1 运算结果也是 int型,需要强制转换类型才能赋值给 short 型。
而 short s1 = 1; s1 += 1;可以正确编译,因为 s1+= 1;相当于 s1 = (short(s1 + 1);其中有隐含的强制类型转换
。
访问修饰符 public,private,protected,以及不写(默认)时的区别
访问修饰符是java对于封装特性提供的语法支持。
private:在同一个类中可见。
default:在同一个包中可见。
protected :在同一个包内的类可见。不同包下的子类可见。
public:对所有类和所有子类可见。
final 有什么用?
被final修饰的类不可以被继承
被final修饰的方法不可以被重写
被final修饰的变量不可以被改变,被final修饰不可变的是变量的引用,而不是引用指向的内容,引用指向的内容是可以改变的
final finally finalize区别
final可以修饰类、变量、方法,修饰类表示该类不能被继承、修饰方法表示该方法不能被重写、修饰变量表示该变量是一个常量不能被重新赋值。
finally一般作用在try-catch代码块中,在处理异常的时候,通常我们将一定要执行的代码方法finally代码块中,表示不管是否出现异常,该代码块都会执行,一般用来存放一些关闭资源的代码。
finalize是一个方法,属于Object类的一个方法,而Object类是所有类的父类,该方法一般由垃圾回收器来调用
,当我们调用System.gc() 方法的时候,由垃圾回收器调用finalize(),回收垃圾,一个对象是否可回收的最后判断。
break ,continue ,return 的区别及作用
break 跳出总上一层循环,不再执行循环(结束当前的循环体)
continue 跳出本次循环,继续执行下次循环(结束正在执行的循环 进入下一个循环条件)
return 程序返回,不再执行下面的代码(结束当前的方法 直接返回)
在 Java 中,如何跳出当前的多重嵌套循环
可以在外面的循环语句前定义一个标号,然后在里层循环体的代码中使用带有标号的break 语句,即可跳出外层循环。例如:
public static void main(String[] args) {
ok:
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
System.out.println("i=" + i + ",j=" + j);
if (j == 5) {
break ok;
}
}
}
}
抽象类能使用 final 修饰吗?
不能,定义抽象类就是让其他类继承的,如果定义为 final 该类就不能被继承,这样彼此就会产生矛盾,所以 final 不能修饰抽象类
成员变量与局部变量的区别有哪些
作用域:
成员变量针对整个类有效
局部变量只针对某个范围有效(一般指方法内)
存储位置:
成员变量:随着对象的创建存在,随着对象的消失消失,存储在堆内存中。
局部变量:随着方法的调用,存储在栈内存中。当方法调用结束,就自动释放。
初始值:
成员变量:有默认初始值。
局部变量:没有默认初始值,必须赋值。
声明周期:
成员变量:随着对象的创建而存在,随着对象的消失而消失。
局部变量:当方法调用完,就自动释放。
静态变量和实例变量区别
static变量也称作静态变量,静态变量和非静态变量的区别是:静态变量被所有的对象所共享,在内存中只有一个副本,它当且仅当在类初次加载时会被初始化。而非静态变量是对象所拥有的,在创建对象的时候被初始化,存在多个副本,各个对象拥有的副本互不影响。
还有一点就是static成员变量的初始化顺序按照定义的顺序进行初始化。
在调用子类构造方法之前会先调用父类没有参数的构造方法,其目的是?
帮助子类做初始化工作。
什么是内部类?
在Java中,可以将一个类的定义放在另外一个类的定义内部,这就是内部类。内部类本身就是类的一个属性,与其他属性定义方式一致。
静态内部类:
被static修饰的内部类
成员内部内:
&mesp; 没有被static修饰的内部类
局部内部类:
&mesp; 定义在方法内的内部类
匿名内部类:
&mesp; 没有名字的内部类
== 和 equals 的区别是什么
== : 它的作用是判断两个对象的地址是不是相等
。即,判断两个对象是不是同一个对象。(基本数据类型 == 比较的是值,引用数据类型 == 比较的是内存地址)
equals() : 它的作用也是判断两个对象是否相等。但它一般有两种使用情况:
(1)情况1:类没有覆盖 equals() 方法。则通过 equals() 比较该类的两个对象时,等价于通过“==”比较这两个对象。
(2)情况2:类覆盖了 equals() 方法。一般,我们都覆盖 equals() 方法来两个对象的内容相等;若它们的内容相等,则返回 true (即,认为这两个对象相等)
String中的equals方法是被重写过的,因为object的equals方法是比较的对象的内存地址,而String的equals方法比较的是对象的值。
当创建String类型的对象时,虚拟机会在常量池中查找有没有已经存在的值和要创建的值相同的对象,如果有就把它赋给当前引用。如果没有就在常量池中重新创建一个String对象。