Java面试2019常考题系列(附带答案)

Java面向对象:

1、super与this的区别?

This:当前类的对象,super父类对象。

Super:在子类访问父类的成员和行为,必须受类继承规则的约束

而this他代表当前对象,当然所有的资源都可以访问.

在构造函数中,如果第一行没有写super,编译器会自动插入.但是如果父类没有不带参数的构

造函数,或这个函数被私有化了(用private修饰).此时你必须加入对父类的实例化构造.而this就

没有这个要求,因为它本身就进行实例化的构造.

而在方法中super和this使用的方法就差不多了.只不过super要考虑是否能访问其父类的资源.

2、作用域public,protected,private,以及不写时的区别?

Public:不同包、同一包、类内都可用

Private:类内

Protected:不同包的子类、同一包、类内都可用

不写时:同一包

3、编程输出如下图形。

*****

****

***

**

*

代码如下:

publicclassPrint{

publicstaticvoidmain(Stringargs){

for(inti=0;i<5;i++){

for(intj=5;j>i;j--){

System.out.print("*");

}

System.out.println;

}

}

}

4、什么是java序列化,如何实现java序列化?(写一个实例)

序列化:

可以将一个对象保存到一个文件,所以可以通过流的方式在网络上传输,可以将文件的内

容读取,转化为一个对象。

处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行

读写操作,也可将流化后的对象传输于网络之间。序列化是为了解决在对对象流进行读写操作

时所引发的问题。

序列化的实现:

将需要被序列化的类实现Serializable接口,该接口没有需要实现的方法,implements

Serializable只是为了标注该对象是可被序列化的,然后使用一个输出流(如:

FileOutputStream)来构造一个ObjectOutputStream(对象流)对象,接着,使用

ObjectOutputStream对象的writeObject(Objectobj)方法就可以将参数为obj的对象写出

(即保存其状态),要恢复的话则用输入流。

5、Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型?

方法的重写Override,子类覆盖父类的方法,将子类传与父类的引用调用的还是子类的方法。

重载Overloading一个类多个方法,名称相同,参数个数类型不同。

两者都是Java多态性的不同表现。

Overloaded的方法是可以改变返回值的类型。

1,publicclassCtest

{

Publicstaticvoidmain

{

System.out.prinln(8+8+”88”+8+8);

}

}

168888

5、继承时候类的执行顺序问题,一般都是选择题,问你将会打印出什么?

答:父类:

packagetest;

publicclassFatherClass

{

publicFatherClass

{

System.out.println("FatherClassCreate");

}

}

子类:

packagetest;

importtest.FatherClass;

publicclassChildClassextendsFatherClass

{

publicChildClass

{

System.out.println("ChildClassCreate");

}

publicstaticvoidmain(Stringargs)

{

FatherClassfc=newFatherClass;

ChildClasscc=newChildClass;

}

}

输出结果:

C:>javatest.ChildClass

FatherClassCreate

FatherClassCreate

ChildClassCreate

6、用插入法进行排序代码如下

packagetest;

importjava.util.*;

classInsertSort

{

ArrayListal;

publicInsertSort(intnum,intmod)

{

al=newArrayList(num);

Randomrand=newRandom;

System.out.println("TheArrayListSortBefore:");

for(inti=0;i<num;i++)

{

al.add(newInteger(Math.abs(rand.nextInt)%mod+1));

System.out.println("al["+i+"]="+al.get(i));

}

}

publicvoidSortIt

{

IntegertempInt;

intMaxSize=1;

for(inti=1;i<al.size;i++)

{

tempInt=(Integer)al.remove(i);

if(tempInt.intValue>=((Integer)al.get(MaxSize-1)).intValue)

{

al.add(MaxSize,tempInt);

MaxSize++;

System.out.println(al.toString);

}else{

for(intj=0;j<MaxSize;j++)

{

if

(((Integer)al.get(j)).intValue>=tempInt.intValue)

{

al.add(j,tempInt);

MaxSize++;

System.out.println(al.toString);

break;

}

}

}

}

System.out.println("TheArrayListSortAfter:");

for(inti=0;i<al.size;i++)

{

System.out.println("al["+i+"]="+al.get(i));

}

}

publicstaticvoidmain(Stringargs)

{

InsertSortis=newInsertSort(10,100);

is.SortIt;

}

}

JAVA类实现序例化的方法是实现java.io.Serializable接口

Collection框架中实现比较要实现Comparable接口和Comparator接口

7、编程:编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串。但是要保证汉字不被截半个,如"我ABC"4,应该截为"我AB",输入"我ABC汉DEF",6,应该输出为"

我ABC"而不是"我ABC+汉的半个"。

答:代码如下:

publicstaticvoidsplit(Stringsource,intnum)throwsException

{

intk=0;

Stringtemp="";

for(inti=0;i<source.length;i++)

{

byteb=(source.charAt(i)+"").getBytes;

k=k+b.length;

if(k>num)

{

break;

}

temp=temp+source.charAt(i);

}

System.out.println(temp);

}

8、指出下面程序的运行结果。

classA{

static{

System.out.print("1");

}

publicA{

System.out.print("2");

}

}

classBextendsA{

static{

System.out.print("a");

}

publicB{

System.out.print("b");

}

}

publicclassHello{

publicstaticvoidmain(Stringars){

Aab=newB;//执行到此处,结果:1a2b

ab=newB;//执行到此处,结果:1a2b2b

}

}

注:类的static代码段,可以看作是类首次加载(被虚拟机加载)执行的代码,而对于类的

加载,首先要执行其基类的构造,再执行其本身的构造

9、抽象类和接口的区别?

(1)接口可以被多重implements,抽象类只能被单一extends

(2)接口只有定义,抽象类可以有定义和实现

(3)接口的字段定义默认为:publicstaticfinal,抽象类字段默认是"friendly"(本包可见)

当功能需要累积时用抽象类,不需要累积时用接口。

10、什么是类的返射机制?

通过类(Class对象),可以得出当前类的fields、method、construtor、interface、superClass、

modified等,同是可以通过类实例化一个实例、设置属性、唤醒方法。Spring中一切都是返

射、strutshibernate都是通过类的返射进行开发的。

11、类的返射机制中的包及核心类?

java.lang.Class

java.lang.refrection.Method

java.lang.refrection.Field

java.lang.refrection.Constructor

java.lang.refrection.Modifier

java.lang.refrection.Interface

12、得到Class的三个过程是什么?

对象.getClass类.class或Integer.type(int)Integer.class(java.lang.Integer)

Class.forName;

13、如何唤起类中的一个方法?

产生一个Class数组,说明方法的参数

通过Class对象及方法参数得到Method

通过method.invoke(实例,参数值数组)唤醒方法

14、如何将数值型字符转换为数字(Integer,Double)?

Integer.parseInt(“1234”)

Double.parseDouble(“123.2”)

15、如何将数字转换为字符?

1+””

1.0+””

16、如何去小数点前两位,并四舍五入?

doubled=1256.22d;

d=d/100;

System.out.println(Math.round(d)*100);

17、如何取得年月日,小时分秒?

Calendarc=Calendar.getInstance;

c.set(Calendar.YEAR,2004);

c.set(Calendar.MONTH,0);

c.set(Calendar.DAY_OF_MONTH,31);

System.out.println(c.get(Calendar.YEAR)+""+(c.get(Calendar.MONTH)+1)+"

"+c.get(Calendar.DAY_OF_MONTH));

18、如何获取某个日期是当月的最后一天?

当前日期加一天,若当前日期与结果的月份不相同,就是最后一天。

取下一个月的第一天,下一个月的第一天-1

publicstaticvoidmain(Stringargs)

{

Calendarc=Calendar.getInstance;

c.set(Calendar.YEAR,2004);

c.set(Calendar.MONTH,0);

c.set(Calendar.DAY_OF_MONTH,30);

Calendarc1=(Calendar)c.clone;

System.out.println(c.get(Calendar.YEAR)+""+(c.get(Calendar.MONTH)+1)+"

"+c.get(Calendar.DAY_OF_MONTH));

c.add(Calendar.DAY_OF_MONTH,1);

if(c.get(Calendar.MONTH)!=c1.get(Calendar.MONTH))

{

System.out.println("是最后一天");

}

else

{

System.out.println("不是取后一天");

}

}

19、float型floatf=3.4是否正确?

报错,应当是floatf=3.4f

如果是floatf=3(整数)正确

20、说出一些常用的类,包,接口,请各举5个

常用的类:BufferedReaderBufferedWriterFileReaderFileWirterStringInteger

常用的包:java.langjava.awtjava.iojava.utiljava.sqljavax.xmljavax.sevlet

javax.ejb.java.netjavax.faces

常用的接口:ListMapDocumentNodeListEjbObjectEjbHomeSessionBean

EntityBean

21、java中会存在内存泄漏吗,请简单描述。

会。如:inti,i2;return(i-i2);//wheni为足够大的正数,i2为足够大的负数。结果

会造成溢位,导致错误。

22、java中实现多态的机制是什么?

静态的多态:方法名相同,参数个数或类型不相同。(overloading)

动态的多态:

子类覆盖父类的方法,将子类的实例传与父类的引用调用的是子类的方法

实现接口的实例传与接口的引用调用的实现类的方法。

23、垃圾回收器的基本原理是什么?垃圾回收器可以马上回收内存吗?有什么办法主动通知虚拟机进行垃圾回收?

动态内存

存放类实例

静态内存

类本身

垃圾收集主要针对的是动态内存,一般当内存不够用时会进行垃圾收集。

或通过System.gc手动收集,但不保证一定执行。

24、静态变量和实例变量的区别?

statici=10;//常量

classAa;a.i=10;//可变

静态方法可以调用静态变量。

实现方法可以调用静态变量、实例变量

25、是否可以从一个static方法内部发出对非static方法的调用?

不可以,如果其中包含对象的method;不能保证对象初始化.

26、写clone方法时,通常都有一行代码,是什么?

Clone有缺省行为,super.clone;他负责产生正确大小的空间,并逐位复制。

27、Java语言如何进行异常处理,关键字:throws,throw,try,catch,finally分别代表什么意义?在

try块中可以抛出异常吗?

Try:执行部分,产生异常

Catch:捕捉异常

Finally:不管有没有异常都执行

Throws:在方法声明处声明要抛出的异常,调用者必须对其进行处理。

Throw:抛出一个异常

在try中可以抛出异常,一般与声明的异常相同。

自定义异常要继承于Exception或Exception的子类

28、冒泡排序法

//相邻两个数比较,将最小或最大的放到后面,最后面数的不参与比较

publicclassBubbleSort{

privatestaticintal=newint[10];

publicBubbleSort{

al[0]=2;

al[1]=3;

al[2]=23;

al[3]=45;

al[4]=1;

al[5]=67;

al[6]=23;

al[7]=80;

al[8]=35;

al[9]=72;

}

publicstaticvoidmain(Stringargs){

BubbleSortbs=newBubbleSort;

System.out.println("排序前:");

display(al);

for(inti=0;i<al.length;i++){

for(intj=0;j<al.length-i-1;j++){

if(al[j]>al[j+1]){

swap(j,j+1);

}

}

}

System.out.println;

System.out.println("排序后:");

display(al);

}

privatestaticvoiddisplay(intal2){

for(inti=0;i<al2.length;i++){

System.out.print(al2[i]+"");

}

}

privatestaticvoidswap(inti,intj){

inttemp=al[i];

al[i]=al[j];

al[j]=temp;

}

}

29、StringandStringBuffer的区别?

String:长度给定不可变,当多个字符串联合时要先转为StringBuffer,再联合,速度慢。

StringBuffer:长度可变,可以将多个字符串值直接联合,效率高

30、用java代码编写堆栈

publicclassStack{

intdata;

intmaxSize;

inttop;

publicStack(intmaxSize){

this.maxSize=maxSize;

data=newint[maxSize];

top=-1;

}

/**

*依次加入数据

*@paramdata要加入的数据

*@return添加是否成功

*/

publicbooleanpush(intdata){

if(top+1==maxSize){

System.out.println("栈已满!");

returnfalse;

}

this.data[++top]=data;

returntrue;

}

/**

*从栈中取出数据

*@return取出的数据

*/

publicintpopthrowsException{

if(top==-1){

thrownewException("栈已空!");

}

returnthis.data[top--];

}

publicstaticvoidmain(Stringargs)throwsException{

Stackstack=newStack(1000);

stack.push(1);

stack.push(2);

stack.push(3);

stack.push(4);

stack.push(5);

while(stack.top>=0)

{

System.out.println(stack.pop);

}

}

}

欢迎Java工程师朋友们加入Java进阶高级架构:416843702
群内提供免费的Java架构学习资料(里面有高可用、高并发、高性能及分布式、Jvm性能调优、Spring源码,
MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多个知识点的架构资料)
合理利用自己每一分每一秒的时间来学习提升自己,不要再用"没有时间“来掩饰自己思想上的懒惰!趁年轻,使劲拼,给未来的自己一个交代!

猜你喜欢

转载自blog.csdn.net/weixin_44665482/article/details/89212861