均为个人理解,若有不严谨之处,望君指出!
今天有幸和小组长交流了一些java基础知识,非常非常基础,但可能很多人没有深入思考过!
面向对象的三大特性
关于面向对象的特性:继承、封装、多态这三个特性众所周知,此外还有一个特性抽象,有部分人认为抽象也是面向对象的特性,但这不是普遍公认的,而且是有问题的。因为抽象无处不在(表达式抽象、控制抽象、数据抽象等等),普遍存在的东西只能说共性,不可称之为特性。虽然这么说,但接下来我们仍会讨论抽象这一特性(暂且称之为特性)。
抽象、封装、继承、多态这四个特性环环相扣:
首先要有对现实世界的抽象才能确定其属性与行为。封装在此基础上限制了这些属性和行为的访问权限以做到高内聚低耦合。有了封装好的具有共性的模板,想要扩展一些特殊的属性和行为,此时要在模板上进行修改,于是有了继承。同时继承也是多态的基础,多态是建立在继承基础之上的(此处认为java中实现接口也是继承的一种形式)。
抽象
抽象是从众多的事物中抽取出共同的、本质性的特征,而舍弃其非本质的特征的过程。具体地说,抽象就是人们在实践的基础上,对于丰富的感性材料通过去粗取精、去伪存真、由此及彼、由表及里的加工制作,形成概念、判断、推理等思维形式,以反映事物的本质和规律的方法。–来自百度百科
举个例子:抽象出电脑的概念
电脑的品牌型号各种各样,但所有的电脑都有一些共性:有鼠标(触摸板)、键盘、显示器、能够根据用户输入产生对应输出等等。
这样电脑的概念就被抽象出来。
封装
继承是从已有类得到继承信息创建新类的过程,继承让变化中的软件系统有了一定的延续性,同时继承也是封装程序中可变因素的重要手段.子类继承父类属性(静态特征)和方法(动态特征),继承必须遵循封装当中的控制访问
关于private属性能不能被继承:
Java官方文档的解释:子类不能继承父类的私有属性,但是如果子类中公有的方法影响到了父类私有属性,那么私有属性是能够被子类使用的。
此处我觉得更应理解为子类能继承父类的全部属性和方法,但有些能访问有些不能,因为在子类构造方法中会默认调用super(),此时父类构造父类。
知乎中的一个回答:https://www.zhihu.com/question/51345942/answer/145388196
多态
所谓多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。因为在程序运行时才确定具体的类,这样,不用修改源程序代码,就可以让引用变量绑定到各种不同的类实现上,从而导致该引用调用的具体方法随之改变,即不修改程序代码就可以改变程序运行时所绑定的具体代码,让程序可以选择多个运行状态,这就是多态性。
实现机制:子类对象可以当作父类对象使用。通过重写父类方法实现。
父类 A,子类B : A a = new B();
五个注意点:尤其是1和3 体现了属性和方法的不同
1、若子类覆盖了某方法,则父类引用调用子类重新定义的新方法
2、若子类未覆盖某方法,则父类引用调用父类本身的旧方法
3、若子类覆盖了某属性,但父类引用仍调用父类本身的旧属性
4、若子类未覆盖某属性,则父类引用调用父类本身的旧属性
5、父类引用不能访问子类新定义的属性和方法
此处涉及向上转型与向下转型