面向对象的基本概念
面向编程:我们在解决问题中,注重的是解决问题的每一个问题和过程。
面向对象:注重的是在问题中,设计到哪些对象,以及对象之间有哪些关系。
| 核心思想 | 缺点 | 算法 |
面向编程 | 自顶向下,逐步求精,也就是把功能分解。
设计数据结构。
编写基础代码,基于数据结构操作。
| 一旦数据结构发生修改,就要修改操作的代码
可重用性差
可维护性差,维护的成本高 | 程序 =数据结构+算法 |
|
| 相对的优点 |
|
面向对象 | 分解数据
数据,和操作数据是一个整体 | 数据修改,只涉及对该数据的操作(封装)
可实用性好(继承)
可维护性好,维护的成本低 | 程序 = 对象+消息 |
万事万物皆对象,对象是由静态的属性和动态的行为来组成的。
类:一组具有相同属性和行为的对象的抽象。
消息:像某个对象发送请求。
方法:对象对收到请求的响应。
Java的三大特性:
封装 继承 多态
面向对象的基本特征
类级变量>成员级变量>方法级变量>块级变量
抽象:提取实物本质、共性的属性和方法,忽略某些不必要的细节和个性的差异。
类的组成:成员变量和成员方法。
封装:存在一个边界,边界之内的细节隐藏起来,只留下对外的接口(如,笔记本,手机,饮水机)。
为什么使用封装:
(1) 易用,简单。
(2) 安全。
(3) 易维护。
面向对象封装的体现:
多态的体现:重写,重载等。
重写:重写是对类中方法的扩充,因为继承用的是父类的东西,重写则不仅得到父类的东西,同时也加入了自己的东西。如需父类中原有的方法,可使用super关键字,该关键字引用了当前类的父类。
重载:根据参数不一样,根据传的参数调用。
继承:允许后代直接使用先辈的所有属性和行为。
为什么用继承?更好的实现了代码的重用。
多态:不同的对象,接收到相同的消息,产生的响应不同。
总结:面向对象是一种很自然朴素的方法,来源于生活。
构造函数,是在对象实例化时自动被系统调用的,该函数名必须是独一无二的。对于一个类来说,是将类名作为函数名。
构造函数不需要程序员去定义返回值,它是系统自动决定的,viod也不行。
Static静态:静态代码块是在加载类的时候自动被执行,早于构造函数,静态的方法,面向的是整个类,不是某个对象,所以没有this,并且只能使用类名来调用,不能使用实例化对象去调用。(一般工具性的方法定为静态)
静态方法只能访问静态的变量
一般格式访问的方法是:只有在类被实例化成对象时 根据对象名.调用 而静态格式:只能类名.调用
引用:
Pointp = new Point();的含义是首先实例化一个对象(newPoint()),然后定义一个引用,p2只想这个实例,p2=p1;并不是将实例p1赋值给实例p2,而是改变了引用的关系。
Final修饰的类不能不被继承,final修饰的变量不能被修改(也就是常量),final修饰的方法。
抽象类
为什么去使用抽象类?
在现实生活中,有些类我们明明知道是有某些方法的,但具体这些方法是怎么去做的呢又无法说清楚。比如手机、电报、固定电话等都是通讯工具,而通讯工具就应该具有向外送消息的方法、但是却无法说明具体怎么发,而手机、电报等我们又可以说清楚他们是怎么发送消息的。
由于抽象类中有未实现的方法,所以抽象类是无法去实例化对象(new),那么它的作用是什么呢,他可以对他的后代进行规划和约束,后代必须去按照他的要求去实现,但具体怎么去实现由后代去决定。
抽象方法:只有声明,没有实现。abstract修饰抽象方法。抽象类不能被实例化,也不能被new,他只能作为父类被继承。
作用:对后代进行规范,即凡是他的后代,必须实现他未实现的方法。
抽象类:就是含有抽象方法的类。
比如:形状肯定有计算周长和面积的方法,但是具体如何计算,却无法描述。三角形有三角形的方法,圆有圆的计算方法。所以在形状这个类里只能声明这个方法,但不能实现。
接口
接口里面所有的方法都是抽象方法:所以在接口里面写方法时,所以在声明时,关键词abstract写不写都无所谓。
接口的定义关键词是:interface;抽象类是class;抽象类是来继承(extends)的,接口是实现(implementsss)的。
赋值兼容:凡是要用到父类对象的地方,都可以使用其公有子类去代替。