一、面向对象的特性有哪些方面
1、抽象:抽象是将一类对象的共同特征总结出来构造成类的过程,包括数据抽象和行为抽象两方面。抽象只关注抽象对象有哪些属性和行为,并不关心这些行为的细节是什么。
2、封装:通常认为封装是把数据和操作数据的方法绑定起来,对数据的访问只能通过已经定义的接口。面向对象的本质就是将现实世界描绘成一系列完全自治、封闭的对象。我们在类中编写的方法就是对实现细节的一种封装;我们编写一个类就是对数据和数据操作的封装。可以说,封装就是隐藏一切可以隐藏的东西,只向外界提供最简单的变成接口(可以想想普通洗衣机和全自动洗衣机的差别,明显全自动洗衣机封装更好因此操作起来更简单;我们现在使用的智能手机也是封装好得足够好的,因为几个按键就搞定了所有的事情)。
3、继承:继承从已有的类得到继承信息创建新类的过程。提供继承信息的类被称为父类(超类、基类);得到继承信息的类被称为子类(派生类)。继承让变化中的软件系统有了一定的延续性,同时继承也是封装程序中可变因素的重要手段(如果不能理解请阅读阎宏博士的《Java 与模式》或《设计模式精解》中关于桥梁模式的部分)。
4、多态性:多态性是指允许不同子类型的对象对同一消息作出不同的响应。简单的说就是用同样的对象引用调用同样的方法但是做了不同的事情。多态性分为编译时的多态性和运行时的多态性。如果将对象的方法是为对象向外界提供的服务,那么运行时的多态性可以解释为:当A系统访问B系统提供的服务时,B系统有多种提供服务的方式,但一切对A系统来说都是透明的(就像电动剃须刀是A系统,它的供电系统是B系统,B系统可以使用电池供电或者用交流电,甚至还有可能是太阳能,A系统只会通过B类对象调用供电的方法,但并不知道供电系统的底层实现是什么,究竟通过何种方式获得了动力)。方法重载(overload)实现的是编译时的多态性(也称之为前绑定),而方法重写(override)实现的是运行时的多态性(也称为后绑定)
二、多态的好处
允许不同类对象对同一消息做出响应,即同一消息可以根据发送对象的不同而采用多种不同的行为方式(发送消息就是函数调用)。主要有以下优点:
1、可替换性:多态对已存在代码具有可替换性
2、可扩充性:增加新的子类不影响已经存在的类结构
3、接口性:多态是超类通过方法签名,向子类提供一个公共接口,由子类来完善或者重写它实现的。
4、灵活性
5、简化性
三、如何实现多态
实现多态主要有以下三种方式
1、接口实现
2、继承父类重写方法
3、同一类中进行方法重载
四、接口的意义
接口的意义用三个词就可以概括:规范,扩展,回调
五、抽象的依赖
抽象类的意义可以用三句话来概括
为其他子类提供一个公共的类型
封装子类中重复定义的内容
定义抽象方法,子类虽然有不同的实现,但是定义是一致的
六、访问修饰符public、private、protect、不写(default默认)的区别
修饰符 | 当前类 | 同包 | 子类 | 其他包 |
public | √ | √ | √ | √ |
protected | √ | √ | √ | × |
default | √ | √ | × | × |
private | √ | × | × | × |
七、要实现多态需要的三个必要条件
第一 要有类的继承
第二 要有方法的重写(子类继承父类并重新给父类中已有的或抽象方法)
第三 对象造型(父类的引用指向子类的对象,这样同样的引用调用同样的方法会根据子类对象的不同而表现不同的行为)
八、抽象类和接口的区别
1、抽象类只能被单继承,但是接口可以实现多实现;
2、抽象类中有构造方法,需要对子类访问父类的成员进行初始化,接口中没有构造方法。
3、抽象类中既可以有普通成员变量也可以有普通方法,但是有抽象方法的类必须定义为抽象类;接口中的方法只能定义抽象方法,默认修饰符public abstract。
5、抽象类的抽象方法可以用public、protected和default等修饰,接口只能被public修饰。
九、父类的静态方法能否被子类重新
不能。重写只是用于实例方法,不能用于静态方法,而子类当中含有和父类相同签名的静态方法,我们一般称之为隐藏。
十、什么是不可变对象
不可变对象指对象一旦创建,状态就不可变。
任何修改都会创建一个新的对象,如 String、Integer及其他包装类。
十一、重载(Overload)和重写(Override)的区别。重载的方法能否根据返回类型进行区分
重载(Overload):在同一个类中,方法名称相同,参数列表不同(参数类型,参数个数,参数名称),与返回值无关,称之为重载;
重写(Override):子类中存在与父类中方法声明完全相同的方法,称之为方法重写;
方法重载只与方法名称和参数列表相关,与返回值无关,不能通过返回值类型区分。