java面试题

java面试总结

目录

java面试总结

1.java面向对象三大特性:继承,封装,多态

2.访问修饰符

3.为什么要用 clone对象?

4.new一个对象和clone一个对象的区别

5.深拷贝和浅拷贝(clone是浅拷贝)

6.java有没有goto语句

7.&和&&的区别

8.如何跳出当前的多重嵌套循环

9.两个对象值相同,但却可以有不同的hashCode,这句话对不对?

10.equals和==的区别

11.是否可以继承String

12.当一个对象被当作参数传递到一个方法后,此方法可以改变对象的属性,并返回变化后的结果,那么这里的传递是值传递还是引用传递?

13.重载(overload)和重写(override)的区别?重载方法能否根据返回类型进行区分?


1.java面向对象三大特性继承封装多态

(如果问四个,就把抽象也算进去)

继承:继承是从已有类得到继承信息创建新类的过程

封装:通常是认为把要访问的数据和方法绑定起来,对数据的访问只能通过已定义的接口

多态:简单的来说就是同样的对象引用调用同样的方法做了不同的事

抽象:抽象是针对同一类的共同特征抽取出来,包括数据抽取和行为抽取,抽象只关心抽取了哪些属性和行为,不在意这些行为的细节是什么

2.访问修饰符

修饰符当前类同包子类不同包
public可以可以可以可以
protected可以可以可以

不可以

private可以不可以不可以不可以

3.为什么要用 clone对象?

在实际开发中,会遇到这种,有一个对象A,在某一刻A已经包含了一些有效值,此时需要一个和A相同的对象B,并且对B的改动不会影响到A,也就是说A和B是两个独立的对象,但B的初始值又是由A对象确定的,在Java语言中可以用clone()方法实现

4.new一个对象和clone一个对象的区别

        new操作符的本意是分配内存,程序执行开始,先看new操作符后面的类型,知道了类型才能知道要分配多大的空间,分配完内存后再调用构造函数,填充对象的各个域,这叫做对象的初始化。构造方法结束后,一个对象就创建好了,可以把他的引用发给外部,这样在外部就可以使用这个引用来操作对象。

        clone和new在第一步是相似的,都是先分配内存,调用clone方法时,分配的内存和原对象相同,然后在使用原对象中的各个域填充新对象的域,填充完成后,clone方法返回,一个新的对象被创建完成,同样可以把这个新对象的引用放到外面用以操作

证明clone是创建新对象,而t2和t1是相同的对象

5.深拷贝和浅拷贝(clone是浅拷贝)

比如一个person类中有name和age两个属性,name是String类型,age是int类型,int是基本类型中的(8大基本类型,int4,short2,long8,char2,byte1,double8,float4,boolean1),name是String类型的,他只是一个引用,指向一个真正的String对象,

那么对他的拷贝有两种方式:1.直接将原对象(t1)中的name的引用值,拷贝给新对象(t2)中的name,

2.根据原对象(t1)中的name指向的字符串对象创建一个新的相同的字符串对象,将这个新字符串对象的引用赋给新对象(t2)的name字段

图是网上的

6.java有没有goto语句

goto是java中的保留字,在目前版本java中没有使用,和goto一样无法使用的关键字还有const

7.&和&&的区别

&有逻辑与和按位与,逻辑与是和&&做比较,可以参照我写的这个程序,关于&&有一个知识点是短路,就是如果&&前的表达式为假,后面的表达式就不执行,称为短路。而&则不同,即便&前的表达式为假,后面的表达式依旧会执行。所以下面的结果,第一个b=2,第二个b=1

而按位与&又涉及到一个知识点,就是有关二进制运算,其中按位与(&),按位或(|),按位异或(^)

记住一个口诀,

按位与:11取1,10取0,00取0

按位或:10/01取1,00取0,11取1

按位异或:同0异1

8.如何跳出当前的多重嵌套循环

在最外层循环前加一个标记A,然后break A;就可以跳出多重循环,但是就像避免goto一样,应该避免使用带标签的break或者continue。

9.两个对象值相同,但却可以有不同的hashCode,这句话对不对?

不对,如果两个对象x和y满足x.equals(y)==true,他们的hashCode应该相同。

java对equals方法和hashCode方法是这样规定的:

1.如果两个对象相同(equals==ture),那么他们的hashCode一定相同

2.如果两个对象的hashCode相同,他们并不一定相同,

实现高质量equals方法:

1.使用==检查参数是否为这个对象的引用

2.使用instanceof操作符检查参数是否为正确的类型

3.重写equals时要重写hashCode

10.equals和==的区别

11.是否可以继承String

String是final类,不可以被继承

12.当一个对象被当作参数传递到一个方法后,此方法可以改变对象的属性,并返回变化后的结果,那么这里的传递是值传递还是引用传递?

是值传递,java语言的方法调用只支持参数的值传递,当一个对象实例作为一个参数被传递到方法中,参数的值就是该对象的引用(引用的副本),对象的属性可以在被调用中改变,但对象的引用(原先的引用)是不会改变的。

13.重载(overload)和重写(override)的区别?重载方法能否根据返回类型进行区分?

无论是重载还是重写都是实现多态的方式,区别在于重载实现了编译时的多态性,而重写实现了运行时的多态性,重载发生在一个类中,同名的方法如果参数类型不同,或者参数个数不同,或二者都不同,则被视作重载。对返回类型无特殊要求

重写发生在子类与父类之间,重写要求子类重写的方法与父类被重写的方法有相同的返回类型,比父类更好访问,不能比父类被重写的方法声明更多异常。

重载的规则:

1.方法名一致,参数列表中的顺序,类型,个数不同

2.重载方法与返回值无关,

3.可以抛出异常,可以有不同的修饰符

方法重写的规则:

1.参数列表与返回类型必须与被重写的方法一致

2.构造方法,和final方法,static方法不能被重写,但是能够被再次声明

3.访问权限不能比父类的被重写的方法访问权限更低。

14.为什么函数不能根据返回值类型来区分重载

因为调用时,不能指定类型信息,变异去不知道你要调用的是哪个函数

比如:1.float max(int a, int b); 2.int max(int a, int b); 

如果调用max(1,2);时,无法确定调用的是哪个函数,所以返回值类型不同的重载时不允许的

函数的返回值,他是一个函数运行后的状态,保持方法调用者与被调用者进行通信的关键,不能当作某个方法的标识

15.char型变量中能不能存储一个中文汉字,为什么?

char类型可以存储一个中午汉字,因为java的编码是Unicode,一个char类型占两个字节,所以放一个中文汉字是可以的,unicode编码字符集中包含一些汉字,所以是可以存储的,但是如果一些汉字不包含在unicode中就不可以存储了

16.抽象类和接口有什么异同?

抽象类接口
抽象类中可以定义构造方法不可以定义构造方法
可以有具体方法和抽象方法只能是抽象方法
抽象类中的成员可以是private,public,protected接口中的方法必须是public abstract
定义的成员变量可以是任意类型接口中定义的成员变量都是static final
有抽象方法的类必须声明为抽象类,而抽象类未必有抽象方法 
支持单继承支持多实现
不能实例化
可以将抽象类和接口类型作为引用类型
一个类如果继承了某个接口或者实现了某个接口,必须对其中的抽象方法进行实现,否则该类仍然需要被声明抽象类

17.抽象方法是否可同时是静态的(static),是否可同时是本地方法(native),是否可同时被synchronized

都不能,首先,抽象方法是要被子类重写,而静态方法是无法被重写的

其次,本地方法是由本地代码实现的方法,抽象方法无法被实现

最后,synchronized和方法的实现细节有关,抽象方法不涉及实现细节。

18.简述静态变量和实例变量的区别

静态变量:是被static修饰符修饰的变量,也被称为类变量,他属于类,不属于类中的任何一个对象,一个类不管创建多少个对象,静态变量在内存中有且仅有一个拷贝

实例变量:必须依存于某一个实例,需要先创建对象然后通过对象才能访问到他。

19.==与equals的区别

==与equals的最大区别就是==是运算符,equals是方法

==:如果比较的对象是基本数据类型,则比较的是数值是否相等;如果比较的是引用数据类型,则比较的是对象的地址是否相等

equals():用来比较两个对象的内容是否相等,equals方法不能用于基本数据类型的变量,如果没有进行过重写,调用的仍是object类中的方法,而object方法返回的是==的判断,所以比较的仍是变量内存中对象的地址。

20.break和continue的区别

break和continue都是用来控制循环语句的。

break用于完全结束一个循环,跳出循环体执行后面的语句

continue用于跳过本次循环执行下一次循环

21.String s="Hello"; s=s+"world";这两段代码执行后,原始的String对象中内容到底变了没有

没有变,因为String被设计成不可变类,所以他的所有对象都是不可变对象,这段代码中,s原先指向了一个String对象,内容是hello,然后我们对s进行了+操作,这时s不指向原来那个对象了,而是指向了另一个String对象,内容为Helloworld,原来那个对象还在内存中,只是再也无法被指向了。通过这个我可以得出一个结论,就是这样的反复修改造成内存空间的浪费,因为String对象创建后就不能再改变了,所以对于每个不同的字符串,都需要一个String对象来表示的话可以考虑用StringBuffer,他允许修改。

22.java中的异常分为哪几种

1.编译时异常CheckedException

2.运行时异常RuntimeException

23.写出常见的5中RuntimeException

1.java.lang.NullPointerException

2.ClassNotFoundException

3.NumberFormateException 字符串转换为数字异常

4.IndexOutOfBoundsException 数组下标越界

5.ClassCastException

6.SQLException

7.NoSuchMethodException 方法不存在异常

8.InstantiationException 实例化异常

24.throw和throws的区别

throw

throw语句在方法体内,表示抛出一样,由方法体内的语句处理

throw是具体向外抛出异常的动作,如果执行了throws一定是抛出了异常

throws

throws语句是在方法生命后面,如果抛出异常由方法的调用者来进行异常处理

throws表示出现异常的可能性,并不一定会发生异常

throws主要是声明了方法会抛出异常的类型,让使用者知道要捕获的异常类型

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值