(面试题三)【JAVAse部分】面向对象相关

【为了帮助各位和我一样面临找工作的朋友,我把java各个部分的重要知识点进行梳理和总结】

-------------------------------------------------------------------------------------------------------------------

(三)【基础知识梳理——JAVAse部分】Java中面向对象相关知识

面向对象是一种程序设计思想,计算机程序的设计实质上就是将现实中的一些事物的特征抽离出来描述成一些计算机事件的过程,这种抽象的过程中,我们把具体的事物封装成一个一个的整体进行描述,使被描述的对象具备一些系统性、整体性的的行为和特征,我们把这种设计思想称为面向对象

一、Java面向对象有哪三大特征?

分别为继承、封装、多态;封装和继承几乎都是为多态服务的。

二、什么是继承?

继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类。继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。

继承有如下些特征:

①     子类拥有父类private的属性,方法。

②     子类可以拥有自己的属性和方法,即子类可以对父类进行扩展。

③     子类可以用自己的方式实现父类的方法。

④     Java的继承是单继承,但是可以多重继承,单继承就是一个子类只能继承一个父类,多重继承就是,例如A类继承B类,B类继承C类,所以按照关系就C类是B类的父类,B类是A类的父类,这是java继承区别于C++继承的一个特性。

⑤     提高了类之间的耦合性(继承的缺点,耦合度高就会造成代码之间的联系)。

三、继承中子类应该怎么调用父类的构造器?

①    子类不能继承父类的构造器(构造方法或者构造函数),但是父类的构造器带有参数的,则必须在子类的构造器中显式地通过super关键字调用父类的构造器并配以适当的参数列表。

②    如果父类有无参构造器,则在子类的构造器中用super调用父类构造器不是必须的,如果没有使用super关键字,系统会自动调用父类的无参构造器。

四、什么是封装?

在面向对象程式设计方法中,封装是指一种将抽象性函式接口的实现细节部份包装、隐藏起来的方法。封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定义的代码随机访问。要访问该类的代码和数据,必须通过严格的接口控制。封装最主要的功能在于我们能修改自己的实现代码,而不用修改那些调用我们代码的程序片段。适当的封装可以让程式码更容易理解与维护,也加强了程式码的安全性 

封装的优点:

①     良好的封装能够减少耦合

②     类内部的结构可以自由修改

③     可以对成员变量进行更精确的控制

④     隐藏信息,实现细节

五、怎么实现封装?

  修改属性的可见性来限制对属性的访问(一般限制为private)。

 ② 对每个值属性提供对外的公共方法访问,也就是创建一对赋取值方法(setget方法),用于对私有属性的读取和设置。

六、什么是多态?

 多态是同一个行为具有多个不同表现形式或形态的能力;就是同一个接口,使用不同的实例而执行不同操作。如,我们F1这个快捷键在不同应用呈现不同的功能。

七、多态有什么优点?

①  可替换性:多态对已存在代码具有可替换性。

②  可扩充性:多态对代码具有可扩充性。增加新的子类不影响已存在类的多态性、继承性,以及其他特性的运行和操作。实际上新加子类更容易获得多态功能。

③  接口性:多态是超类通过方法签名,向子类提供了一个共同接口,由子类来完善或者覆盖它而实现的。

④  灵活性:它在应用中体现了灵活多样的操作,提高了使用效率。
简化性多态简化对应用软件的代码编写和修改过程,尤其在处理大量对象的运算和操作时,这个特点尤为突出和重要。

八、多态存在的条件是什么?

①  要有继承;

②  要有重写;

③  父类引用指向子类对象。

(难点)九、多态的方法调用的优先级是怎么样的?

优先级由高到低依次为:this.show(O)、super.show(O)、this.show((super)O)、super.show((super)O),其中super表示父类

这里我找了一个经典的多态的练习题:

class A ...{  
         public String show(D obj)...{  
                return ("A and D");  
         }   
         public String show(A obj)...{  
                return ("A and A");  
         }   
}   
class B extends A...{  
         public String show(B obj)...{  
                return ("B and B");  
         }  
         public String show(A obj)...{  
                return ("B and A");  
         }   
}  
class C extends B...{}   
class D extends B...{}  


	A a1 = new A();  
        A a2 = new B();  
        B b = new B();  
        C c = new C();   
        D d = new D();   
        System.out.println(a1.show(b));   ①  
        System.out.println(a1.show(c));   ②  
        System.out.println(a1.show(d));   ③  
        System.out.println(a2.show(b));   ④  
        System.out.println(a2.show(c));   ⑤  
        System.out.println(a2.show(d));   ⑥  
        System.out.println(b.show(b));    ⑦  
        System.out.println(b.show(c));    ⑧  
        System.out.println(b.show(d));    ⑨  
那么运算结果会是怎么样呢?
①   A and A
②   A and A
③   A and D
④   B and A
⑤   B and A
⑥   A and D
⑦   B and B
⑧   B and B
⑨   A and D

为什么会是这个样子呢?

不用怎么说,当a1.show()方法里面参数时,根据优先级最终会调用A中的show(A obj)方法,因此输出“A and A”。

④可能难以理解,这里面我们先来介绍重写和重载。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写。子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被“屏蔽”了;如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载。首先看到④中a2.show(b)因为a的类型是A,b的类型是B,因此我们找到A里面的方法,但是我们这时是找不到show(B obj),因此根据优先级我们在A的父类里面找,但是A是没有父类的,因此我们把B的父类作为参数(即A),因此我们调用A中的show(A obj)方法,但是我们发现a2引用的是类B的一个对象,并且B中对show(A obj)的方法进行了重写,因此我们最终调用的是B中的show(A obj)方法,其他的同理可以得到。

十、重写和重载有什么区别?

重写:重写是子类对父类的允许访问的方法的实现过程进行重新编写,返回值和形参都不能改变。即外壳不变,核心重写!重写的好处在于子类可以根据需要,定义特定于自己的行为。也就是说子类能够根据需要实现父类的方法。重写方法不能抛出新的检查异常或者比被重写方法申明更加宽泛的异常。

重载:重载是在一个类里面,方法名字相同,而参数不同。返回类型可以相同也可以不同。每个重载的方法(或者构造函数)都必须有一个独一无二的参数类型列表。最常用的地方就是构造器的重载。

十一、什么是接口,接口有什么作用?

接口,在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明。一个类通过继承接口的方式,从而来继承接口的抽象方法。接口并不是类,编写接口的方式和类很相似,但是它们属于不同的概念。类描述对象的属性和方法。接口则包含类要实现的方法。除非实现接口的类是抽象类,否则该类要定义接口中的所有方法

接口的作用:

1重要性:Java语言中, abstract class interface是支持抽象类定义的两种机制。正是由于这两种机制的存在,才赋予了Java强大的面向对象能力。

2简单、规范性:如果一个项目比较庞大,那么就需要一个能理清所有业务的架构师来定义一些主要的接口,这些接口不仅告诉开发人员你需要实现那些业务,而且也将命名规范限制住了(防止一些开发人员随便命名导致别的程序员无法看明白)。

3维护、拓展性:比如你要做一个画板程序,其中里面有一个面板类,主要负责绘画功能,然后你就这样定义了这个类。可是在不久将来,你突然发现这个类满足不了你了,然后你又要重新设计这个类,更糟糕是你可能要放弃这个类,那么其他地方可能有引用他,这样修改起来很麻烦。如果你一开始定义一个接口,把绘制功能放在接口里,然后定义类时实现这个接口,然后你只要用这个接口去引用实现它的类就行了,以后要换的话只不过是引用另一个类而已,这样就达到维护、拓展的方便性。


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值