java面试基础篇*持续更新

1、谈谈面向对象

面向对象:实现对象是谁,不关心具体实现,只关心怎么使用(只关心实现对象是谁,三大特性:封装、继承、多态);
面向过程:一件事具体该怎么做,注重实现过程,以过程为中心;
封装:不关心内部实现、具体构造,只需要知道怎么操作,类似于手机、电视这种,将内部封装起来,直接使用就可以;
多态:同一个方法被调用,可能会由于不同的对象产生不同的行为,比如都是娱乐,张三是打游戏、李四是打球、王五是跳舞,或者具体到某一个场景中,现在不清楚传进来的对象是student还是teacher,那么可以用people去接收它;
多态存在的三个必要条件:继承、方法重写、父类引用指向子类对象(当父类引用指向子类对象后,用该父类引用调用子类重写的方法,此时多态就出现了);
继承:使代码更容易扩展,比如有学生教师,他们都有一些公用方法和属性,可以将其抽取出来定义为父类,再去继承它,复用代码、减少冗余、易于扩展;

面向对象是一种基本的编程思想,早期的面向过程的思想就是一件事该怎么去做,而面向对象就是一件事该由谁去做,它怎么去做我不管,我只需要调用就可以,这些就是由于面向对象的三大特性(封装、继承、多态)决定的。封装就是将一类属性和行为抽象成一个类使其属性私有化,行为公开化,提高属性安全性的同时,也可以使其代码模块化,这样做可以使代码的复用性更高。继承就是将几个类共有的属性和行为抽象成一个父类,每个子类都有父类的属性和行为,也有自己的属性和行为,这样做,扩展了已存在的代码,进一步提高了代码的复用性,但是继承是耦合性比较高的一种关系,父类代码重写,子类行为也会随之改变,所以如果过度使用继承会起到反效果。多态必须要有继承和重写,并且父类/接口引用指向自子类/实现类对象,很多设计模式都是基于面向对象中的多态性设计的。

2、面向对象与面向过程的区别

面向过程:面向过程性能比之面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源,所以当性能是最重要的考量因素时,比如单片机、嵌入式开发、linux/unix等一般采用面向过程开发,但是面向过程没有面向对象易于维护、复用和扩展。
面向对象:面向对象易维护、易复用、易扩展,因为面向对象有封装继承多态三大特性,,所以可以设计出低耦合的系统,使系统更加灵活,但是面向对象性能方面比面向过程低。

3、JDK与JRE的区别

JDK(java developer’s kit):
JDK = JRE + 开发工具集(java、javac、javadoc、jar…)
JER(java runtime environment)–java运行环境:
JRE = JVM + 核心类库
如果只需运行,有JRE即可,若需编译,需要JDK;

4、值传递与引用传递

5、 ==与equals()的区别

==比较的是地址,对应基本数据类型比较的是值,对于引用数据类型比较的是内存地址;
equals()属于object类方法,没有重写之前使用效果和双等号一致,可以重写例如String类,使其比较内容值是否相等。

6、为什么重写equals()时必须重写hashCode方法

hashCode可以获取哈希码,确定该对象在哈希表中的索引位置;
提高效率:使用hashCode提前校验定位,就不用每次都使用equals()比较;
保证没有重复对象出现,确保hashCode去重性:假如只重写equals()方法,不重写hashCode方法,相同的对象hashCode不同,从而映射到不同的下标下面,HashMap无法保证去重,equals相同,hashCode相同,hashCode不同,equals一定不同,hashCode相同,equals不一定相同(哈希冲突)。

7、深拷贝与浅拷贝

8、 Student s = new Student();在内存里做了那些事情?

载入student.class文件进入内存(方法区);
在栈内存为s开辟空间;
在堆内存为学生对象开辟空间;
对学生对象的成员变量进行默认初始化;
对学生对象的成员变量进行显示初始化;
通过构造方法对学生对象的成员变量赋值;
学生对象初始化完成,把对象地址赋值给s变量;

9、重载和重写(Override)的区别

方法的重载和重写都是实现多态的方式,区别在与前者实现的是编译时的多态性,而后者实现的是运行时的多态性;
重载:发生在同一个类中

10、Object类中方法及说明

registerNatives() 私有方法
getClass() 返回object的运行类
hashCode() 获取对象的哈希值
equals() 比较两个对象是否“相同”
clone() 创建并返回此对象的一个副本
toString() 返回该对象的字符串
notify() 唤醒此对象监视器上等待的单个进程
notifyAll() 唤醒此对象监视器上等待的所有进程
wait() 使当前线程失去操作权限,当前线程进入等待序列
finalize() 当垃圾回收确定不存在对该对象更多的引用时,由对象的垃圾回收器调用此方法;

11、重载和重写(Override)的区别

方法的重载和重写都是实现多态的方式,区别在于前者实现的是编译时的多态性,而后者实现的是运行时的多态性。
重载:发生在同一个类中,方法名相同参数列表不同(参数类型不同、个数不同、顺序不同),与方法返回值和访问修饰符无关,即重载的方法不能根据返回类型进行区分
重写:发生在父子类中,方法名、参数列表必须相同,返回值小于等于父类,抛出的异常小于等于父类,访问修饰符大于等于父类(里氏代换原则);如果父类方法访问修饰符为private则子类中就不是重写。

12、多态理解

父类或接口定义的引用变量可以指向子类或具体实现类的实例对象,然后你编译的时候不知道这个指针指向哪里,等到运行时才知道,从而去指向对应的子类或者接口具体实现的类所指向的方法

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值