最近看了一些JAVA的笔试题,发现基础性的知识太欠缺,于是打算坚持每天看一点点,记录一点点。虽然参与过的项目很多了,但是我觉得要从根本上提高编程能力,还得靠扎实的知识功底。以下的题目仅仅是从别处拷贝过来,我只加了一些代码片段,代码仅供学习参考,不考虑规范性。
1、一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制?
可以有多个类,但只能有一个public的类,并且public的类名必须与文件名相一致。
如下写法(可以不考虑代码的规范性):
package DAY1;
public class day1 {
public static void main(String[] args) {
}
}
class test{
}
package DAY1;
public class day1 {
public static void main(String[] args) {
}
}
//此处给test类加pribate、public、protected都是错误的
//错误提示:Illegal modifier for the class test; only public, abstract & final are permitted
private class test{
}
2、&和&&的区别
(1)&和&&都可以用作逻辑与的运算符,表示逻辑与(and),当运算符两边的表达式的结果都为true时,整个运算结果才为true,否则,只要有一方为false,则结果为false。
(2)&&还具有短路的功能,即如果第一个表达式为false,则不再计算第二个表达式,例如,对于if(str != null && !str.equals(""))表达式,当str为null时,后面的表达式不会执行,所以不会出现NullPointerException如果将&&改为&,则会抛出NullPointerException异常。
(3)If(x==33 & ++y>0) y会增长,If(x==33 && ++y>0)不会增长
(4)&还可以用作位运算符,当&操作符两边的表达式不是boolean类型时,&表示按位与操作,我们通常使用0x0f来与一个整数进行&运算,来获取该整数的最低4个bit位,例如,0x31 & 0x0f的结果为0x01
示例代码:
package DAY1;
public class day1 {
public static void main(String[] args) {
int i=3;
int y=6;
if(i>3&&++y>6){
}
System.out.println(y);//输出6
}
}
package DAY1;
public class day1 {
public static void main(String[] args) {
int i=3;
int y=6;
if(i>3&++y>6){
}
System.out.println(y);//输出7
}
}
3、switch语句能否作用在byte上,能否作用在long上,能否作用在String上
在switch(expr1)中,expr1只能是一个整数表达式或者枚举常量(更大字体),整数表达式可以是int基本类型或Integer包装类型,由于,byte,short,char都可以隐含转换为int,所以,这些类型以及这些类型的包装类型也是可以的。显然,long和String类型都不符合switch的语法规定,并且不能被隐式转换成int类型,所以,它们不能作用于swtich语句中。
4、short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?
对于short s1 = 1; s1 = s1 + 1; 由于s1+1运算时会自动提升表达式的类型,所以结果是int型,再赋值给short类型s1时,编译器将报告需要强制转换类型的错误。
对于short s1 = 1; s1 += 1;由于 += 是java语言规定的运算符,java编译器会对它进行特殊处理,因此可以正确编译。
示例代码:
package DAY1;
public class day1 {
public static void main(String[] args) {
short a =1;
a+=1;
a=a+1;//Type mismatch: cannot convert from int to short
}
}
6、用最有效率的方法算出2乘以8等於几?
2 << 3
解析:
2的二进制是10 在32位存储器里面是0000 0000 0000 0010 左移三位后变成 0000 0000 0001 0000 也就是16
7、使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变?
使用final关键字修饰一个变量时,是指引用变量不能变,引用变量所指向的对象中的内容还是可以改变的。例如,对于如下语句:
final StringBuffer a=new StringBuffer("immutable");
执行如下语句将报告编译期错误:
a=new StringBuffer("");
但是,执行如下语句则可以通过编译:
a.append(" broken!");
8、是否可以从一个static方法内部发出对非static方法的调用?
不可以。因为非static方法是要与对象关联在一起的,必须创建一个对象后,才可以在该对象上进行方法调用,而static方法调用时不需要创建对象,可以直接调用。也就是说,当一个static方法被调用时,可能还没有创建任何实例对象,如果从一个static方法中发出对非static方法的调用,那个非static方法是关联到哪个对象上的呢?这个逻辑无法成立,所以,一个static方法内部发出对非static方法的调用。
9、Math.round(11.5)等於多少? Math.round(-11.5)等於多少?
Math类中提供了三个与取整有关的方法:ceil、floor、round,这些方法的作用与它们的英文名称的含义相对应,例如,ceil的英文意义是天花板,该方法就表示向上取整,所以,Math.ceil(11.3)的结果为12,Math.ceil(-11.3)的结果是-11;floor的英文意义是地板,该方法就表示向下取整,所以,Math.floor(11.6)的结果为11,Math.floor(-11.6)的结果是-12;最难掌握的是round方法,它表示"四舍五入",算法为Math.floor(x+0.5),即将原来的数字加上0.5后再向下取整,所以,Math.round(11.5)的结果为12,Math.round(-11.5)的结果为-11。