超详细的Java面试题总结之 -- 面向对象

文章目录(一) 面向对象基本概念1. 说一说面向对象和面向过程?2. 面向对象的特征有哪些?3. 多态的必要条件有哪些?(了解)4. 值传递和引用传递有什么区别?Java中参数是什么传递方式?(二) 重载和重写1. 重载和重写有什么区别?2. 构造器能被重写吗?(三) 抽象类和接口1. 说说抽象类和接口?2. 一个类实现了多个接口中的重名默认方法,调用时会使用哪个?3. 抽象类能用final修饰吗?(四) 变量和方法1. 成员变量和局部变量有什么区别?2. 在Java中定义一个空的构造方法有什么用?3. 构
摘要由CSDN通过智能技术生成

文章目录

(一) 面向对象基本概念

1. 说一说面向对象和面向过程?

面向过程,就是遇到一个问题时,将解决问题的方法拆分成一个个函数和数据,然后按一定的顺序执行完。这是一个具体的、流程化的过程。比如洗衣服的流程,先加洗衣粉、再加水、再把衣服扔进洗衣机、洗衣机洗衣、再烘干

面向对象,就是将解决问题的方法模型化、抽象化成对象。然后给这些对象赋予属性和方法,并让对象来执行这些操作。对于洗衣服的例子,就可以抽象出洗衣机两个对象,操作步骤就是人.放洗衣粉()、人.加水()、人.放入洗衣机()、洗衣机.洗衣服()、洗衣机.烘干()

优缺点 面向过程 面向对象
优点 性能更好,因为类调用的时候需要实例化,开销比较大。一些注重性能的程序设计一般采用面向过程开发,比如Linux,单片机 易维护、易拓展、易复用,由于面向对象的封装、继承、多态等特性,能设计出低耦合的系统,方便拓展,复用。
缺点 难以维护,难以拓展,难以复用 性能比面向过程低

2. 面向对象的特征有哪些?

封装

封装把对象中的属性私有化,不允许外部直接访问对象内部的属性。但可以提供被外部访问的接口。比如我不知道空调里面怎么打开开关,但我按遥控器,空调就可以工作了。

继承

继承是在已有类的基础上建立新类的特性。这个特性使得代码复用非常容易。新的类可以调用父类的属性、方法,也可以有自己的属性、方法。例如要为动物园的各种鹦鹉定义类,那么可以提取鹦鹉的共同点,如飞、吃饭、唱歌,作为一个鹦鹉父类。然后让其他鹦鹉都去继承这个类。这样就能复用代码,而不用给每个鹦鹉类创建重复的属性和方法。同时每种鹦鹉也能有自己的特性,比如葵花鹦鹉会吃瓜子,金刚鹦鹉会说话等等。

多态

顾名思义,表示一个变量具有多种状态。变量的具体类型不一定是定义时的类型,而是程序运行期间才能确定。

3. 多态的必要条件有哪些?(了解)

有三个:继承、重写、向上转型

继承:在多态中要存在具有继承关系的子类和父类。

重写:子类应当重新定义了父类中的某些方法,在调用这些方法时就会调用子类的方法。

向上转型:需要将子类的引用赋值给父类。

只有满足了以上三点,才能在继承结构中使用统一的逻辑来处理不同的对象,从而执行不同的行为。

4. 值传递和引用传递有什么区别?Java中参数是什么传递方式?

值传递:传递的参数是值得拷贝。即使在函数中被改动也只是改动的副本。

引用传递:传递的参数是参数的地址,类似C++中的指针,指向参数对应的内存地址。在方法中改动对应地址中的值会影响到任何指向该地址区域的变量。

Java中是值传递,无论是基本数据类型还是对象。

(二) 重载和重写

1. 重载和重写有什么区别?

重载和重写都是实现多态的方式,前者实现的是编译时的多态性,后者实现的是运行时的多态性。

重载:发生在同一个类中,方法名相同但参数列表不同,参数列表包括参数类型参数个数参数的顺序但与方法的返回类型和访问修饰符无关,即重载的方法不能通过返回类型来区分。

重写:发生在父类和子类中,方法名、参数列表必须完全相同。而且返回值的级别应该比父类要小,抛出的异常级别也要比父类小,访问修饰符的级别要高于父类。例如父类返回LIst,子类就可以返回ArrayList;父类抛出Exception,子类就可以抛出IOException;父类的方法是public,子类可以是private。

2. 构造器能被重写吗?

构造器不能被继承,因此不能被重写。但可以被重载。

(三) 抽象类和接口

1. 说说抽象类和接口?

面对对象的设计中,复用的重点是抽象层的复用,抽象类和接口都是抽象层的体现。它们有相同点,比如说都不能被实例化,都可以包含方法声明。但又有许多不同的地方:

  • 最大的不同点,就是抽象类中能提供某些方法的实现,而JDK8之前,接口不能提供方法的实现。如果向一个抽象类中添加一个具体实现的方法,那么它所有子类都具有了这个方法,而接口做不到这一点。
  • 抽象类需要使用extents关键字继承,但由于Java的单继承特性,使得一个类只能继承一个抽象类,这样就有局限性。而一个类可以实现多个接口,这时接口的优势就体现出来了。
  • 抽象类中方法和变量的访问修饰符可以是任意的,public、private都行,但接口中方法和变量的访问修饰符必须是public,而且默认是public。
  • 接口中的属性必须是static final,但抽象类中的属性可以是任意的。

不过在JDK8中,新增了接口可以实现默认方法的新特性。在方法前加default关键字,就能在接口中实现该方法,继承该接口的类也默认可以调用这个方法。

2. 一个类实现了多个接口中的重名默认方法,调用时会使用哪个?

  1. 首先判断本来是否重写了默认方法,如果重写了,就直接调用本类的方法。如果本类没重写,那么判断其父类是否重写了,本类和父类中方法优先级最高

  2. 如果以上无法判断,那么子接口的优先级更高。例如类C继承了接口B,接口B继承了接口A,在接口A和B中都实现了一个重名默认方法,那么,B的优先级更高。

  3. 如果继承的多个接口是同级的,比如接口A和接口B没有关系,那么就得在本类中显示声明要调用哪一个接口中的实现。

3. 抽象类能用final修饰吗?

不能,抽象类是提供其他类继承的,用final修饰就不能被继承了。

(四) 变量和方法

1. 成员变量和局部变量有什么区别?

  1. 位置:成员变量是在类中,方法外定义的变量。局部变量是在方法中定义的变量。
  2. 作用域:成员变量可以被整个类中的方法或代码块使用。局部变量只针对特定范围有效。
  3. 生命周期:成员变量随着对象的创建而创建,随着对象的销毁而销毁。局部变量当方法执行完,或语句结束后,就会被销毁。
  4. 初始值:成员变量有默认初始值。局部变量没有初始值,需要先赋值再使用。

2. 在Java中定义一个空的构造方法有什么用?

如果一个子类继承了一个父类,那么在子类调用构造方法时,会提前调用父类的空参构造。如果父类只有有参构造,没有空参构造,那就会编译错误。所以定义一个空的构造方法是为了让子类调用。

3. 构造方法有哪些特性?

  • 方法名和类名相同。
  • 没有返回值,但不能加void。
  • 0
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值