Java基础面试题

Java基础面试题

Java基础面试题

1.一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制?
答:一个“.java”源文件可以包含多个类,但是其中只能有一个类是public的。

2.Java有没有goto?
答:goto是java的保留字(现在不用,但以后可能用)。在C语言中,主要是 为了实现条件转移, 构成循环,跳出循环体等功能。

3.说说&和&&的区别
答:&和&& 都是判断符号左右两边的表达式是否都为真,区别在于&& 在判断第一个表达式若为false,第二个表达式就不进行判断了。而& 无论结果如何2个都会进行判断。 所 以建议使用&&。

4.在JAVA中如何跳出当前的多重嵌套循环?
答:使用break、或者continue。 break退出整个循环,而continue只退出当前循环。

5.switch语句能否作用在byte上,能否作用在long上,能否作用在String上?
答: switch() 括号内只能是 整数表达式(int、Integer)或者枚举常量。 byte、short、char 都能隐式转化成Int类型数据,而long、String 不符合语法规定,也不能隐式 转成int类型。

6.short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?
答:表达式一: s1+1; 运算时将自动提升表达式类型,输出结果是int. 而s1是short 类型( 其范围是-32768至32767(或-215至215-1))的,所以编译器会报错。

7、char型变量中能不能存贮一个中文汉字?为什么?
答: char型变量是用来存储Unicode编码的字符的,unicode编码字符集中包含了汉字,所以,char型变量中当然可以存储汉字。

8.用最有效率的方法算出2乘以8等於几?
答: int a=2<<3 (2左移3位 等于乘以8)
a=16

9.请设计一个一百亿的计算器
答:主要考察了对整形数据的表示范围经行考察。Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。BigDecimal(int) 创建一个具有参数所指定整数值的对象。BigDecimal(double) 创建一个具有参数所指定双精度值的对象。BigDecimal(long) 创建一个具有参数所指定长整数值的对象。BigDecimal(String) 创建一个具有参数所指定以字符串表示的数值的对象。BigDecimal 的运算方式 不支持 + - * / 这类的运算 它有自己的运算方法
BigDecimal add(BigDecimal augend) 加法运算
BigDecimal subtract(BigDecimal subtrahend) 减法运算
BigDecimal multiply(BigDecimal multiplicand) 乘法运算
BigDecimal divide(BigDecimal divisor) 除法运算

10.使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变?
答: final关键字修饰一个变量时,是指引用变量不能变,引用变量所指向的对象中的内容还是可以改变的。

11."=="和equals方法究竟有什么区别?
答: ==比较的是 引用的地址是否相同,而equals 是比较类容是否相同。 补充: JVM调优机制 通常 相同常量和final关键字修饰的变量 的地址是相同的。 利用get() 获取常量变动引起地址的变化。

12.静态变量和实例变量的区别?
答: 静态变量用static 修饰,静态变量属于类,在没有经行任何实例化就开始经行加载。实例变量不需要修饰 实例变量属于实例对象,只有在经行对象实例化时才经行加载。

13.是否可以从一个static方法内部发出对非static方法的调用?
答:不能,因为非static 是与对象所关联的,而static方法 在没有经行任何实例化就已经开始执行,当内部有非static方法 编译器无法判断该非static不知道与那个对象经行关联,所以会报错。

14.Integer与int的区别
答:int 是Java的原始数据类型,而Integer是对int的封装类。 int默认值是0,而Integer的默认值是null. Integer能够区分是否经行赋值,而int类型数据则无法经行判断。 应用实例:用来区分考零分和没有参加考试的区别。

15、Math.round(11.5)等於多少? Math.round(-11.5)等於多少?
答:Math类中提供了三个与取整有关的方法:ceil(向上取整 偏大)、floor(向下取整 偏小)、round(四舍五入 正数大于5偏大 小于等于4偏小 负数相反 ) Math.round(11.5)=12 Math.round(-11.5)=-11

16、下面的代码有什么不妥之处?
a. if(username.equals(“zxx”){}
b. int x = 1; return x==1?true:false;

17、请说出作用域public,private,protected,以及不写时的区别
答:说明:如果在修饰的元素上面没有写任何访问修饰符,则表示friendly。
作用域 当前类 同一package 子孙类 其他package
public √ √ √ √
protected √ √ √ ×
friendly √ √ × x
private √ × × ×

18、Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型?
答:Overload是重载的意思 (方法的参数类型是不同的 对方法经行重写),Override是覆盖的意思(方法的参数与父类的方法是不同的)。 重载和覆盖都不能对private进行操作。 当重载方法 方法名相同 参数不同 可以改变返回值的类型

19.构造器Constructor是否可被override?
答:构造器Constructor不能被继承,因此构造器不能重写Override,但可以被重载Overload(参数类型不同)。

20、接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承具体类(concrete class)? 抽象类中是否可以有静态的main方法?
答:接口可以继承接口。抽象类可以实现(implements)接口,抽象类可以继承具体类(具体类必须明确的构造函数)。抽象类中可以有静态的main方法。
记住抽象类与普通类的唯一区别就是不能创建实例对象和可以有abstract方法。

21、写clone()方法时,通常都有一行代码,是什么?
答:封装、继承(父类)、多态(接口)、抽象。

23.java实现多态的机制?
答:父类或者接口的引用变量可以指向子类或者实现类的实例对象 而程序调用的方法在程序调用的时候才进行绑定。

24、abstract class和interface有什么区别?
答:1.抽象类可以有构造方法,接口中不能有构造方法。
3.抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的普通方法。
4. 抽象类中的抽象方法的访问类型可以是public,protected和(默认类型,虽然eclipse下不报错,但应该也不行),但接口中的抽象方法只能是public类型的,并且默认即为public abstract类型。
5. 抽象类中可以包含静态方法,接口中不能包含静态方法
6. 抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意, 但接口中定义的变量只能是public static final类型,并且默认即为public static final类型。
7. 一个类可以实现多个接口,但只能继承一个抽象类

25、abstract的方法是否可同时是static,是否可同时是native,是否可同时是synchronized?
答 :abstract的方法 不能用static 因该方法要被子类所实现;
abstract的方法 不能用native(依赖平台使用) 它不需要被子类所实现
abstract的方法 不能用synchronized 同步中多使用 this来确定同步锁对象 而abstract无法确定this对象

26、什么是内部类?Static Nested Class 和 Inner Class的不同。
答:内部类就是在一个类的内部定义的类,内部类中不能定义静态成员,内部类可以直接访问外部类中的成员变量,内部类可以定义在(public、private等)外部类的方法外面,也可以定义在(只能用abstract或final)外部类的方法体中。方法外内部类:Outer outer = new Outer();Outer.Inner1 inner1 = outer.new Innner1();Static Nested Class类的名称为“外部类名.内部类名”,失去了内部类(inner Class)的特性,在外面不需要创建外部类的实例对象,就可以直接创建Static Nested Class。方法内内部类: 内部类对其他类是不可见的其他类无法引用这种内部类,但是这种内部类创建的实例对象可以传递给其他类访问。这种内部类必须是先定义,后使用,即内部类的定义代码必须出现在使用该类之前,这与方法中的局部变量必须先定义后使用的道理也是一样的。这种内部类可以访问方法体中的局部变量,但是,该局部变量前必须加final修饰符。

27、内部类可以引用它的包含类的成员吗?有没有什么限制?
答:如果包含类不是静态类的话,没有什么限制。 静态类的话直接创建不需要实例化。class Outer{static int x;static class Inner{void test(){syso(x);}}}

28、Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)?
答:匿名内部类必须要继承父类或者实现接口

29、super.getClass()方法调用下面程序的输出结果是多少?
import java.util.Date;
public class Test extends Date{

public static void main(String[] args) {

new Test().test();
}
public void test()
{

System.out.println(super.getClass().getName());
}}
答:super.getClass() 从父类继承的getClass方法 但本质已经是子类的方法 所以结果是Test getClass().getSuperClass().getName() 获取父类的class名 Date

30、String是最基本的数据类型吗?
答基本数据类型包括byte、int、char、long、float、double、boolean和short。java.lang.String类是final类型的,因此不可以继承这个类、不能修改这个类。

31、String s = “Hello”;s = s + " world!";这两行代码执行后,原始的String对象中的内容到底变了没有?
答:没有。因为String被设计成不可变(immutable)类,所以它的所有对象都是不可变对象。在这段代码中,s原先指向一个String对象,内容是 “Hello”,然后我们对s进行了+操作,那么s所指向的那个对象是否发生了改变呢?答案是没有。这时,s不指向原来那个对象了,而指向了另一个 String对象,内容为"Hello world!",原来那个对象还存在于内存之中,只是s这个引用变量不再指向它了。

32、是否可以继承String类?
答·: String类是final类故不可以继承。

33、String s = new String(“xyz”);创建了几个String Object? 二者之间有什么区别?
答:两个或一个,”xyz”对应一个对象,这个对象放在字符串常量缓冲区,常量”xyz”不管出现多少遍,都是缓冲区中的那一个。New String每写一遍,就创建一个新的对象,它一句那个常量”xyz”对象的内容来创建出一个新String对象。如果以前就用过’xyz’,这句代表就不会创建”xyz”自己了,直接从缓冲区拿(JVM调优机制)。

34、String 和StringBuffer的区别
答:JAVA平台提供了两个类:String和StringBuffer,它们可以储存和操作字符串,即包含多个字符的字符数据。这个String类提供了数值不可改变的字符串。而这个StringBuffer类提供的字符串进行修改(没有equals()和hashcode()方法 )。接着要举一个具体的例子来说明,我们要把1到100的所有数字拼起来,组成一个串。StringBuffer sbf = new StringBuffer(); for(int i=0;i<100;i++){sbf.append(i);}上面的代码效率很高,因为只创建了一个StringBuffer对象,而下面的代码效率很低,因为创建了101个对象。String str = new String(); //不提供修改 改变一次就创建一个对象for(int i=0;i<100;i++){str = str + i;}

35、如何把一段逗号分割的字符串转换成一个数组?
1.用正则表达式,代码大概为:
String [] result = orgStr.split(“,”);
2.用 StingTokenizer ,代码为:
StringTokenizer tokener = StringTokenizer(orgStr,”,”);
String [] result = new String[tokener .countTokens()];
Int i=0;while(tokener.hasNext(){

result[i++]=toker.nextToken();
}

36、数组有没有length()这个方法? String有没有length()这个方法?
答:数组没有length()这个方法,有length的属性。String有有length()这个方法。

37、下面这条语句一共创建了多少个对象:String s=“a”+“b”+“c”+“d”;答:对于如下代码:
String s1 = “a”;
String s2 = s1 + “b”; //常量 所以地址没有经行优化
String s3 = “a” + “b”; //JVM优化
System.out.println(s2 == “ab”); // false
System.out.println(s3 == “ab”); //true
第一条语句打印的结果为false,第二条语句打印的结果为true,这说明javac编译可以对字符串常量直接相加的表达式进行优化,不必要等到运行期去进行加法运算处理,而是在编译时去掉其中的加号,直接将其编译成一个这些常量相连的结果。
题目中的第一行代码被编译器在编译时优化后,相当于直接定义了一个”abcd”的字符串,所以,上面的代码应该只创建了一个String对象。写如下两行代码,
String s = “a” + “b” + “c” + “d”;
System.out.println(s == “abcd”);
最终打印的结果应该为true。

38、try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后?
答:static int test()
{

int x = 1;
try
{

return x;
}
finally
{

++x;
}
}
}

---------执行结果 ---------
1
finally{} 在return 中间被执行 ,但自加的行为并没完成。
39、下面的程序代码输出的结果是多少?
public class smallT
{

public static void main(String args[])
{

smallT t = new smallT();
int b = t.get();
System.out.println(b);
}
public int get()
{

try
{

return 1 ;
}
finally
{

return 2 ;
}
}
}

答:返回的结果是2。 finally{} 在最后被执行

40、final, finally, finalize的区别。
答:
1.final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。
内部类要访问局部变量,局部变量必须定义成final类型,例如,一段代码……

2.finally是异常处理语句结构的一部分,表示总是执行。

3.finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。JVM不保证此方法总被调用

41、运行时异常与一般异常有何异同?

答:异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见运行错误。java编译器要求方法必须声明抛出可能发生的非运行时异常,但是并不要求必须声明抛出未被捕获的运行时异常。

42、error和exception有什么区别?
答:error 表示恢复不是不可能但很困难的情况下的一种严重问题。比如说内存溢出。不可能指望程序能处理这样的情况。 exception 表示一种设计或实现问题。也就是说,它表示如果程序运行正常,从不会发生的情况。

43、Java中的异常处理机制的简单原理和应用。
答:异常分为eroor 和 exception ;
java为系统异常(unchecked异常)和普通异常(checked)提供了不同的解决方案,编译器强制普通异常必须try…catch处理或用throws声明。

44、请写出你最常见到的5个runtime exception(系统异常)。
答:NullPointerException、ArrayIndexOutOfBoundsException、ClassCastException, BufferOverflowException ,ArrayStoreException

45、JAVA语言如何进行异常处理,关键字:throws,throw,try,catch,finally分别代表什么意义?在try块中可以抛出异常吗?
答:
try块表示程序正常的业务执行代码。如果程序在执行try块的代码时出现了“非预期”情况,JVM将会生成一个异常对象,这个异常对象将会被后面相应的catch块捕获。
catch块表示一个异常捕获块。当程序执行try块引发异常时,这个异常对象将会被后面相应的catch块捕获。
throw用于手动地抛出异常对象。throw后面需要一个异常对象。
throws用于在方法签名中声明抛出一个或多个异常类,throws关键字后可以紧跟一个或多个异常类。
finally块代表异常处理流程中总会执行的代码块。
对于一个完整的异常处理流程而言,try块是必须的,try块后可以紧跟一个或多个catch块,最后还可以带一个finally块。
try块中可以抛出异常。

46、java中有几种方法可以实现一个线程?用什么关键字修饰同步方法? stop()和suspend()方法为何不推荐使用?
答:
Java中实现多线程有两种途径:继承Thread类或者实现Runnable接口
//继承Thread类
new Thread(){

public void run(){

}
}.start();
//实现Runnable
new Thread(new Runnable(){public void run(){

}
}
).start();
//使用进程池
用synchronized关键字修饰同步方法
stop(),是因为它不安全。难以检查问题原因。
suspend()方法容易发生死锁。

47、sleep() 和 wait() 有什么区别?
答:
sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用sleep不会释放对象锁。
wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。

48、同步和异步有何异同,在什么情况下分别使用他们?举例说明。
答:
同步交互:指发送一个请求,需要等待回复,然后才能够发送下一个请求。 //实现数据共享
异步交互:指发送一个请求,不需要等待回复,可以直接发送多个请求。 //使编程更有效率

49. 下面两个方法同步吗?
class Test
{

synchronized static void sayHello3()
{

}
synchronized void getX(){}
}
答:
A: synchronized static是某个类的范围,synchronized static cSync{}防止多个线程同时访问这个 类中的synchronized static 方法。它可以对类的所有对象实例起作用。
B: synchronized 是某实例的范围,synchronized isSync(){}防止多个线程同时访问这个实例中的synchronized 方法。 只对该实例起作用
50.同步几种实现方法?
答: synchronized关键字(标记临界区)、wait/notifyAll(使用了java对象中内置锁)
wait():使一个线程处于等待状态,并且释放所持有的对象的lock。
sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要捕捉InterruptedException异常。
notify():唤醒一个处于等待状态的线程,注意的是在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且不是按优先级。
Allnotity():唤醒所有处入等待状态的线程,注意并不是给所有唤醒线程一个对象的锁,而是让它们竞争(根据优先级)

在这里插入图片描述

本文来源蹊源的奇思妙想,由架构君转载发布,观点不代表Java架构师必看的立场,转载请标明来源出处:https://javajgs.com/archives/14760

发表评论