JAVA经典面试题

1 什么是面向对象?谈谈你对面向对象的理解

面向对象与面向过程是两种不同的问题解决方案.个人认为面向过程注重动作,而面向对象则更注重产生这些动作的对象.
如:若完成将大象装入冰箱这一事件.
面向过程而言,可以简单概括为 打开冰箱门,装入大象,将冰箱门关闭.
面向对象而言,可理解为,有这么一个冰箱,具有储存功能,有一个人,人具有开门,关门,装东西,功能.我们只需要运行人的这三个功能,并将大象作为参数传入"东西",即可完成我们甚至可以将这三个功能抽象成一个装入方法,下次冰箱在装其他东西的时候,直接运行装入方法,需要更改的只有传入的参数.
**面向过程注重事情的每一个步骤及顺序
面向对象更加注重事情的参与者以及参与者各自要做什么.**更易于复用以及扩展维护.

面向对象的三个特征

封装

封装通俗来讲就是对外暴露功能,而隐藏功能的具体实现细节.
这里的隐藏细节并不是外部调用无法查看,而是内部使用private进行修饰,使外部无法任意修改内部属性.

继承 extends

继承指的是子类继承父类后,可以对父类中未加限制的方法和属性直接进行使用.

多态
基于对象所属类的不同,外部对同一个方法的调用,实际执行逻辑不同.
多态可分为重写和重载:
重写:
子类对父类的方法进行重写.父类引种指向子类对象
重载:方法名相同,参数不同|方法名相同,同名参数的顺序不同
注意 方法名相同,返回值类型不同,不构成重载.

2 JDK JRE JVM 三者的联系和区别

JDK:

Java Development Kit java开发工具—针对开发人员

JRE:

Java Runtime Environment java运行环境

JVM

Java Virtual Machine java虚拟机 java跨平台的主要实现, .class经过虚拟机转译,映射到系统,从而实现跨平台

3 ==与equals的区别

==对比的是栈中的值,基本数据类型是变量值,存放在栈中,
引用数据类型是堆中内存对象的地址.

equals:object中默认也采用==进行比较,但是通常会进行重写.

简而言之 在基本数据类型的比较中,我们可以使用 ==, 在String类型的比较中,我们可以使用 equals

4 简述final的作用

final 最终的

  • 修饰类:表示该类不可被继承

  • 修饰方法:表示方法不可被子类覆盖,但是可以重载

  • 修饰变量:表示变量一但被赋值就不可以更改它的值

    final修饰成员变量

    如果final修饰的是类变量(也叫静态变量),只能在静态初始块中指定初始值或者声明该类变量时指定初始值.
    如果final修饰的是成员变量,可以在非静态初始化块,声明该变量或者构造器中执行标准值.

    final修饰局部变量

     系统不会为局部变量进行初始化,局部变量必须由程序员显示初始化,因此使用final修饰局部变量时,则可以在定义时指定默认值,之后不再对变量进行赋值,也可以不指定默认值,而在后面的代码中对final变量赋初值(仅一次)
    

5 为什么局部内部类和匿名内部类只能访问局部final变量

首先要明确内部类的声明周期,其生命周期不会随着所在方法的运行完毕而终结.

如果外部类的方法结束了,那么局部变量就会被销毁,但是内部类对象可能还存在,仅当其不再被引用,内部类才会死亡.如果这时候访问到了一个已经被销毁的变量该怎么办呢?

为了解决这个问题,java中将局部变量复制了一份作为内部类的成员变量,这样当局部变量死亡后,内部类仍可访问复制后的成员变量,这样就好像延长了局部变量的生命周期.

而将局部变量复制为内部类的成员变量时,必须保证这两个变量是一样的,也就是如果我们在内部类中修改了成员变量,方法中的局部变量也需要跟着改变,这时候我们就可以采用final关键字对原本的成员变量进行修饰
,这样初始化后就无法再对其进行修改,保证了局部变量和内部类建立的copy保持一致.

6 String StringBuffer StringBuilder 的区别以及使用场景.

String
String 是final修饰不可变的 因此每次操作都会产生新的String对象

StringBuffer
StringBuffer和StringBuilder都是在原对象上操作
StringBuffer是线程安全的 ,StringBuilder是线程不安全的
StringBuffer()方法都是synchronized修饰的

性能:StringBuilder >StringBuffer>String

优先使用StringBuilder
多线程使用共享变量注意使用StringBuffer

7 接口和抽象类的区别

  • 抽象类可以存在普通成员函数,而接口只能存在public abstract 方法
  • 抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是public static final 类型的
  • 抽象类只能继承一个,接口可以实现多个.

接口的设计目的,是对类的行为进行约束,这也就是说,实现同一接口的类,一定有相同的方法.但是接口也只是约束了行为的有无,不对如何实现行为进行限制.

而抽象类的设计目的是代码复用,当不同的类具有某些相同的行为(记为行为集合A) 且其中一部分行为的实现方式一致时,可以将这些类都派生出一个抽象类.

抽象类是对类本质的抽象,表达的是is a 的关系,比如 Student is a Person ,抽象类包含并实现子类的通用特性,将子类存在差异化的特征进行抽象,交由子类去实现.

而接口是对行为的抽象,表达的是like a 的关系 接口的核心是定义行为,也就是实现类可以做什么,至于实现类的主题是谁,如何实现,接口并不关心.

使用场景: 当你关注一个事物的本质的时候,用抽象类;
当你关注一个操作的时候,用接口.

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值