Java基础面试 1/5

1、面向对象的三个基本特征
让一个类可以获取另一个类的属性和方法叫继承,子类继承父类,子类重写父类的方法叫多态,隐藏类的属性和方法实现的细节,对外提供公开访问的接口,叫封装

2、String是Java基本数据类型吗?
不是,String是引用类型,?

3、String类可以继承吗?
不可以,String被final关键字修饰,不可以被继承

4、String s = new String(“xyz”) 创建了几个字符串对象?
一个或两个,如果字符串常量池中有“xyz”,就是一次,否则就是两次
注:字符串常量池中放的是引用,实例还是在堆中

new String(“xyz”)就是在堆中创建并初始化,内容与“xyz”相同的实例

5、String s = “xyz”和String s = new String(“xyz”)区别
两个都是先去字符串常量池检查有没有“xyz”,有就直接使用,没有就创建一个实例在堆中,字符串常量池放着引用。

另外new String(“xyz”)还会另外在堆中创建一个内容与“xyz”相同的实例

6、== 和 equals的区别
==是用于比较基本数据类型和引用类型的

当比较基本类型的时候,比较的是值是否相等,和类型无关,比如short a = 1;int b = 1;
a == b 是true

当比较引用类型的时候,比较的是两个对象的地址是否相等,比如两个单独new出来的对象的地址肯定不一样

equals是Object中定义的方法,通常用于比较两个对象的值是否相等

7、两个对象的 hashCode() 相同,则 equals() 也一定为 true,对吗?
hashcode()是为了提高查找效率的,hashcode()相同的对象,equals()不一定相同,但equals()相同的对象,hashcode()一定相同

8、什么是反射?
反射是基于class对象实现的,类在编译后会生成对应的.class文件,包含着这个类所有信息,如成员变量、成员方法的,在程序运行期间通过.class动态获取类信息来创建实例等完成一系列操作的过程称为反射。反射的好处是大大提高了代码的扩展性,但不好的地方是滥用反射可能会导致安全漏铜,破坏Java原有的封装性。

9、深拷贝和浅拷贝的区别?
浅拷贝其实就是变量A把其引用的对象的地址复制一份给新的变量B,A和B指向的是同一块堆空间

深拷贝就是重新new一个实例赋值给变量B,再把变量A指向的对象的值get、set一份给变量B所指向的对象,所以就是变量A和变量B分别指向不同的堆空间,但堆空间的内容是一样的

10、并发和并行有什么区别?
并行是真正意义上地同一时刻可以做多件事,并发本质上是“串行”,是在一小段时间内,通过给每个事件分配时间碎片,宏观上达到并行的效果。

11、构造器是否可被重写
构造器不能被重写,但可以被重载,因此一个类会有多种构造方法,重载可以有不同参数列表

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

值传递!Java只用值传递,传对象传的对象的地址

13、Java静态变量和成员变量的区别
静态变量是类变量,与类共存亡
成员变量是属于对象的,是实例变量,与对象共存亡,对象被回收了成员变量就没了

成员变量是存在堆内存中,类变量是存在方法区中

类变量推荐通过类.变量名获取,也可以通过对象调用
成员变量只能通过对象调用

14、是否可以从一个静态(static)方法内部发出对非静态(non-static)方法的调用?

非静态方法只能通过对象调用,判断静态方法能否调用的依据的是否在调用方法前创建了实例,并用对象实例调用。

15、重载(Overload)和重写(Override)的区别?
方法的重载和重写都是实现多态的方式,区别在于前者是编译的多态性,后者是运行时多态性。

重载:一个类中可以有多个同名方法,具有不同的参数列表,
1、参数类型不同
2、参数个数不同
3、或都不同

重写:发生在子类和父类之间,子类对父类方法的重写,参数都不能变,返回值类型可以变,但必须是父类的派生类,即外壳都不变,方法体核心重写,好处在于子类可以根据自己的特殊性定义自己的行为。

16、Java 中的 final 关键字有哪些用法?
修饰类:不能被继承
修饰方法:该方法不能被子类重写
修饰变量:变量声明时要给初值,且以后只能读取,不能修改;变量是对象时,引用不可以修改,但是对象的属性是可以修改的

17、wait() 和 sleep() 方法的区别
wait之后线程进入阻塞态,sleep进入超时阻塞态
wait是属于object类方法,sleep是Thread类方法
调用wait前需要获取monitor锁,只能在同步代码块和同步方法中使用,sleep任何地方可使用
wait会释放同步锁,其他线程可以获得同步锁,进入同步控制流程执行,调用sleep的线程不会释放同步锁
sleep超时后会重新恢复,wait需要其他线程调用同一对象的notify或notifyAll才能被唤醒,重新恢复

18、编写多线程程序有几种实现方式?
1、继承Thread类
2、实现Runnable接口
3、实现Callable接口

推荐:实现Runnable接口,相比继承Thread类来说,对代码的拓展性更好,还可以继承其他父类,Callable一般不常用,异步线程很少需要获取返回值

19、Thread 调用 start() 方法和调用 run() 方法的区别

run方法相当于规划了一个待做的任务,并没有创建线程,就是一个普通的方法。
start方法相对于启动一个线程并处于就绪状态,一旦得到CPU时间片,立即执行这个任务。

20、为什么要使用线程池?直接new个线程不是很舒服?
线程的创建和销毁会消耗很多系统资源,在面对高并发量的时候,大量线程的不断创建和销毁容易造成系统宕机,降低系统稳定性。

线程池的好处:
1、通过利用重复的线程,降低因线程的创建和销毁导致的资源消耗。
2、通过利用现成已创建好的线程,提高响应速度。
3、通过线程池统一分配、监控和调优,增加线程的客观理性。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值