Java史上最最基础面试题系列(2、面向对象技术)——看到,你离工作就比别人近了一半!!!

注:资料有书为证,大伙可放心翻阅并熟记,由本人亲自总结!

1、面向对象与面向过程有什么区别?

面向对象是当今软件开发方法的主流方式之一,它是把数据及对数据的操作方法放在一起,作为一个相互依存的整体,即对象。(例如人只是一个抽象的概念,他是不存在的实体,但是所有具备人这个群体的属性与方法的对象都叫人,这个对象人是实际存在的尸体,每个人都是人这个群体的一个对象。)

而面向过程是一种以事件为中心的开发方法,是自顶向下顺序执行,逐步求精,其程序结构是按功能划分为若干个基本模块的执行程序。

两者的区别主要在于:

①、出发点不同。面向对象更加注重把问题映射到对象或者对象之间的接口的这种人类拥有的常规思维方式来解决问题,而面向过程强调的是过程的抽象化和模块化。

②、层次逻辑关系不同。面向对象是用计算机逻辑来模拟客观世界中的物理存在,以对象的集合类作为处理问题的基本单位。面向过程方法处理问题的基本单位则是能清晰准确地表达过程的模块

③、数据处理方式与控制程序方式不同。面向对象将数据和代码封装成一个整体,控制程序方式通过“事件驱动”来激活和运行程序。面向过程则是直接通过程序来处理数据,控制程序方式上也是按照设计调用和返回程序,不能自由导航。

④、分析设计与编码转换方式不同。面向对象实现的是一种无缝连接,而面向过程实现的则是一种有缝连接。

2、面向对象有哪些特征?

面向对象的主要特征包括抽象(理解:只需定义一个方法名,具体实现则不需要)、继承、封装和多态。

3、面向对象的开发方式有什么有点?

①、较高的开发效率。因为它和人类的思维过程相似,而且面向对象的开发方式可以通过继承或者组合的方式来实现代码的重用,因此可以大大提高软件的开发效率。

②、保证了软件的鲁棒性,也就是健壮性。

③、保证了软件的高可维护性。因为面向对象开发的可读性非常高,而且面向对象开发已经设计出了非常多成熟的设计模式,维护起来更加方便。

4、什么是继承?

通过继承可以提高代码的复用性,提高开发效率。

继承主要的几个特性有:

①、不支持多重继承。

②、子类只能继承父类的非私有成员变量与方法。

③、当子类自定义的成员变量(方法,与父类相同的方法名,相同的参数个数与类型)和父类中定义的成员变量(方法)相同时,子类中的成员变量(方法)会覆盖掉父类的成员变量(方法),不会选择继承。

5、组合和继承有什么区别?

组合是指在新类里面船舰原有类的对象,重复利用已有类的功能。

//继承
class Verhicle{}
class Car extends Verhicle{}

//组合
class Tire{}
class Car extends Verhicle{
    private Tire t = new Tire();
}

使用时应当遵循以下两个原则:

①、除非两个类之间时“is-a”的关系,否则不要轻易地使用继承,过多继承会破坏代码的可维护性。

②、不要仅仅为了实现多态而使用继承,如果两个类之间没有“is-a”的关系,则可以通过实现接口和组合的方式来达到相应的目的。

拓展:能使用组合就尽量不要使用继承!

6、多态的实现机制是什么?

多态主要有以下两种表现方式:

①、方法的重载(overload),它是一种编译时多态,重载可以被看做一个类中的方法多态性。

②、方法的覆盖(override),由于只有在运行时才能确定调用哪个发给发,所以通过方法覆盖实现的多态也可以被称为运行时多态。

此外,只有类中的方法才有多态的概念,类中的成员变量是没有多态概念的,也就是说成员变量将不会具备重载和覆盖这两种多态的表现方式。

成员变量的值去父类还是子类并不取决于创建对象的类型,而是取决于所定义变量的类型,这时在编译期间就确定好了的。

7、重载和覆盖的区别!

①、覆盖是子类和父类之间的关系,是垂直关系;重载是同一个类中方法之间的关系,是水平关系。

②、覆盖只能由一个方法或只能由一对方法产生关系;重载是多个方法之间的关系。

③、覆盖要求参数列表相同;重载要求参数列表不同。

④、覆盖关系中,调用方法体是根据对象的类型来决定的;而重载关系是根据调用时的实参表与形参表来选择方法体的。

拓展:函数不能通过返回值来进行区分,这在重载的规定中由提到!

8、抽象类和接口由什么异同?

如果一个类中包含有抽象方法,那么这个类就是抽象类,通过关键字abstract来声明抽象类。接口就是指一些方法的集合,其中这些方法没有具体的方法体,都是一些抽象方法。

同:①、都不能被实例化;②、接口的实现类或抽象类的子类都只有实现了接口或抽象类的方法后才能被实例化。

异:①、Java8之前,接口只有定义,方法不能在接口中实现。而抽象类可以有定义与实现,即方法可以子抽象类中被实现。

②、一个类可以实现多个接口,但只能继承一个抽象类。

③、接口强调的是“has-a”的设计理念,而抽象类则是强调的是"is-a"的设计理念。

④、接口中定义的成员变量默认为public static final,其成员方法则都是public、abstract的。至于抽象类则比接口要宽松的多,但是抽象类中的抽象方法不能用private、static、synchronized、native等访问修饰符修饰。

⑤、接口被用于实现比较常用的功能,便于维护;而抽象类更倾向于充当公共类的角色,不适于维护。

拓展:当功能需要积累时,采用抽象类,不需要积累时,就用接口。此外,接口可以继承接口,抽象类可以实现接口,也可以继承具体类。抽象类也可以静态的main方法

9、内部类有哪些?

内部类有静态内部类、成员内部类、局部内部类和匿名内部类。

**静态内部类:**被static修饰的内部类,可以不依赖于外部类实例而被实例化。它不能与外部类有相同的名字,不能访问外部类的普通成员变量,只能访问外部类中的静态成员和静态方法。

**成员内部类:**没有static修饰,可以自由地引用外部类的属性和方法,只有在外部类实例化后,它才能被实例化。需要注意的时,非静态内部类中不能有静态成员。

**局部内部类:**它指的是定义在一个代码块内的类,它的作用范围为其所在的代码块。不能被public、protected、private以及static修饰。

**匿名内部类:**一种没有类名的内部类,不使用关键字class、extends、implements;没有构造函数;不能定义静态成员、方法和类;不能是public、protected、private、static;只能创建一个实例;它肯定是跟在new后面的;它必须继承其他类或实现其他接口;且它也是局部内部类,所以局部内部类的限制对它也生效。

10、如何获取父类的类名?

//getClass().getName()可以用来获取当前正在运行的类的类名!
//getClass().getSuperclass().getName()用来获取父类的类名!

但在这里值得注意的是,Java语言中任何类都继承自Object类,getClass()方法在Object类中被定义为final和native,子类不能覆盖该方法。因此this.getClass()和super.getClass()最终都调用的是Object中的getClass()方法。而Object的getClass()方法的释义是:返回此Object的运行时类。

11、this和super有什么区别?

this用来指向当前实例对象,它一个非常重要的作用就是用来区分对象的成员变量与方法的形参。

super可以用来访问父类的方法或成员变量。

拓展:当子类构造函数需要显示调用父类构造函数的时候,super()必须为构造函数中的第一条语句,不然会发生编译错误。

转载麻烦请附录地址,感谢大家配合!!!
https://blog.csdn.net/HOLLOWYANG/article/details/119983365

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值