2021春招必备Java面试题大全(二)Java面对对象基础 持续更新

9 篇文章 0 订阅
7 篇文章 0 订阅
  1. 面向对象和面向过程的区别
    面向过程:

优点:性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源;比如单片机、嵌入式开发、Linux/Unix等一般采用面向过程开发,性能是最重要的因素。
缺点:没有面向对象易维护、易复用、易扩展

面向对象

优点:易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统更加灵活、更加易于维护
缺点:性能比面向过程低

面向过程是具体化的。流程化的要一步一步的来解决问题
而面向对象是模型化的,你只需要抽象出一个类,这这个类里面有你需要的所有东西
面向对象只是把面向过程抽象成类,然后再封装

  1. 面向对象的三大特征

封装,继承 ,多态

  • 封装(把东西装起来 想给被人看的给别人看 不想给别人看的可以隐藏起来)
    封装把一个对象的属性私有化,同时提供一些可以被外界访问的属性的方法,如果属性不想被外界访问,我们大可不必提供方法给外界访问。但是如果一个类没有提供给外界访问的方法,那么这个类也没有什么意义了。
  • 继承(继承的存在是为了面对对象 子父类之间的共享 和 子父类之间的扩展 继承可以用来使得封装更加多样性)
    继承是使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地继承父类。通过使用继承我们能够非常方便地复用以前的代码。
    关于继承如下 3 点请记住:
  1. 子类拥有父类非 private 的属性和方法。
  2. 子类可以拥有自己属性和方法,即子类可以对父类进行扩展。
  3. 子类可以用自己的方式实现父类的方法。(以后介绍)。
  • 多态 (类的引用指向不同的实现 可以向上定义一个规范 来创建不同的实现)
    所谓多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并
    不确定,而是在程序运行期间才确定,即一个引用变量到底会指向哪个类的实例对象,该引用变量发出
    的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。
    在Java中有两种形式可以实现多态:继承(多个子类对同一方法的重写)和接口(实现接口并覆盖接口
    中同一方法)。
  1. 抽象类和接口的对比

抽象类是对类的抽象,是一种模板的设计,而接口时行为的抽象,是一种规范的实现

  • 相同点
    1. 抽象类和接口都不能被实例化
    2. 都是用来被其他的类继承或者是实现的
    3. 都包含抽象的方法 子类都必须重写这些方法
  • 不同点
    1. 抽象类可以由构造器 而接口不能由构造器
    2. 抽象类中的方法可以是由任意访问修饰符 而接口中的默认修饰符是public 不允许被定义为pricate 或者是 protected 在java8中新定义的接口可以拥有一些常量 和 默认修饰符的方法 可以用来被继承但只允许接口之间的互相继承
    3. 抽象类的字段声明可以是任意的 接口的字段默认都是static和final的
    4. 单继承和多实现 我就不多说了!
  1. 普通类和抽象类有哪些区别?

普通类不能包含抽象的方法,抽象类可以包含抽象方法也可以包含普通方法。
抽象类不能直接实例化,普通类可以直接实例化

  1. 创建一个对象用什么关键字?对象实例与对象引用有何不同?

new关键字,new创建对象实例(对象实例在堆内中),对象引用指向对象实例(对象引用存放在栈内存中)

  1. 成员变量与局部变量的区别

变量:在程序执行的过程中,在某个范围内其值可以发生改变的量。从本质上讲,变量其实是内存中的一小块区域
成员变量:方法外部,类内部定义的变量
局部变量:类的方法中的变量。
成员变量和局部变量的区别

  • 作用域
    成员变量:针对整个类有效。
    局部变量:只在某个范围内有效。(一般指的就是方法,语句体内)
  • 存储位置
    成员变量:随着对象的创建而存在,随着对象的消失而失,存储在堆内存中。
    局部变量:在方法被调用,或者语句被执行的时候存在,存储在栈内存中。当方法调用完,或者语句结束后,就自动释放。
  • 生命周期
    成员变量:随着对象的创建而存在,随着对象的消失而消失
    局部变量:当方法调用完,或者语句结束后,就自动释放。
  • 初始值
    成员变量:有默认初始值。(在jvm类加载的初始化阶段来分配成员变量的初始值
    局部变量:没有默认初始值,使用前必须赋值
  1. 静态变量和实例变量区别
  • 静态变量
    静态变量由于不属于任何的实例对象,属于类,在内存中只有一次 在jvm的类加载过程中来被分配到栈中的内存空间
  • 实例变量
    每次创建对象,都会为每个对象分配空间 实例变量是属于实例对象的,在内存的创建过程中,创建几次对象,就会拥有几份成员变量
  1. 静态方法和实例方法有何不同?

静态方法和实例方法的区别主要体现在两个方面:

  1. 在外部调用静态方法时,可以使用"类名.方法名"的方式,也可以使用"对象名.方法名"的方式。而实
    例方法只有后面这种方式。也就是说,调用静态方法可以无需创建对象。
  2. 静态方法在访问本类的成员时,只允许访问静态成员(即静态成员变量和静态方法),而不允许访
    问实例成员变量和实例方法;实例方法则无此限制
  • 静态方法可以直接用类名调用 不需要实例化方法
  • 而实例方法必须通过方法的实例化 通过实例化对象来调用
  1. 内部类的优点
  • 一个内部类对象可以访问创建它的外部类对象的内容,包括私有数据
  • 内部类不为同一个包的其他类所见,具有很好的封装性
  • 内部类有效实现了“多重继承”, 优化Java但继承的缺陷
  • 匿名内部类可以很方便的定义回调
  1. 内部类有哪些应用场景
  • 场合里面有算法
  • 解决一些非面向对象的语句块
  • 适当使用内部类,使得代码更加灵活和富有扩展性。
  • 当某个类除了它的外部类,不再被其他的类使用时。
  1. 局部内部类和匿名内部类访问局部变量的时候为什么要加final

因为生命周期的问题 局部变量存储在栈中,当方法执行结束后非final的局部变量就被销毁了,而局部内部类或者是匿名内部类对局部变量的引用依然存在,所以就会出错
但是加了final就保证了引用依然存在,所以解决了这个问题!!!

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

比较中要分为两种不同的变量

  1. 基本类型变量 基本类型变量== 比较的 就是值比较
    引用类型==比较的是内存的额地址
  2. 在引用类型的情况下,equals()在没有重写的情况下 底层就是实现的==
    在重写之后就是根据重写object类中的equals方法来判断
  1. hashcode与equals()

你重写过 hashcode 和 equals 么,为什么重写equals时必须重写hashCode方法?
hashCode() 的作用是获取哈希码,也称为散列码;它实际上是返回一个int整数。这个哈希码的作用是 确定该对象在哈希表中的索引位置。hashCode() 定义在JDK的Object.java中,这就意味着Java中的任何 类都包含有hashCode()函数。

hashCode()与equals()的相关规定
如果两个对象相等,则hashcode一定也是相同的
两个对象相等,对两个对象分别调用equals方法都返回true
两个对象有相同的hashcode值,它们也不一定是相等的
因此,equals 方法被覆盖过,则 hashCode 方法也必须被覆盖
hashCode() 的默认行为是对堆上的对象产生独特值。如果没有重写 hashCode(),则该 class 的两个对 象无论如何都不会相等(即使这两个对象指向相同的数据)

  • 像HashSet 中add元素时。他会先比较元素的HashCode值如果hashcode值相等 set就会通过equals来判断是否元素可以加入HashSet集合
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值