二、java之面向对象
面向对象
面向对象编程(Object-Oriented Programming,OOP)
面向对象编程的本质就是:以类的方式组织代码,以对象的组织(封装)数据
三大特性:
◆封装
◆◆封装的概念
程序设计要追求“高内聚、低耦合”:
高内聚:类的内部数据操作细节自己完成,不允许外部干涉;
低耦合:仅对外部暴露少量的方法用于使用。
设计程序时我们要隐藏对象内部的复杂性、对外只公开简单的接口。便于外界调用从而提高系统的可扩展性、可维护性。
通俗的说,把该隐藏的隐藏起来,该暴露的暴露出来,这就是封装的设计思想。
在Java中通过权限修饰符关键字公有(public)、私有(private)和受保护(protected)实现封装。
◆◆封装的作用:提高代码的安全性。
保护或者防止代码(数据)被我们无意中破坏。
在面向对象程序设计中数据被看作是一个中心的元素并且和使用它的函数结合的很密切,从而保护它不被其它的函数意外的修改。
◆◆封装的使用
封装的使用情况
1、拒绝直接调用声明字段,保护内部数据,更安全;
2、在编程中可达到缓存的效果,执行效率高;
3、重复调用,避免代码冗余,程序编写效率高。
相关概念
1、private关键字:权限修饰符 (私有的)
2、Get和Set
3、this关键字 表示当前类型当前对象的引用 哪个对象来调用this关键字所在的方法,this就指代哪个对象
在set方法中,this该关键字在见名知意的前提下,用于区分哪个是对象的成员变量,
剩下的一个按照就近原则,就是局部变量。所以在set方法中,使用【this.成员变量的变量名】,一定是成员变量,
没有使用name的变量,就按照就近原则去寻找。
4、构造方法 又叫做构造器或者构造函数,Constructor。(重点)
作用:用于给成员变量赋值
在创建对象的过程中,会自动调用构造方法,等对象创建完毕的时候,对象中的成员变量就已经通过构造方法赋值成功了。
注意:
构造方法不能手动调用,在创建对象的时候由JVM自动调用;
因为一个对象只能被创建一次所以构造方法针对同一个对象只能被调用一次;
构造方法可以重载;
当一个类没有手动提供任何构造方法时,在编译时系统会自动为我们添加一个空参构造。
当我们手动添加了一个任何构造的时候,系统就不会在为我们添加任何构造方法
如果构造方法没有修饰符,也是构造方法,只不过是默认权限而已,方法中的内容无关紧要
◆继承
◆◆继承的概念
使得子类具有父类的属性和方法,还可以在子类中重新定义,追加属性和方法。继承可以在原有类的基础上,进行功能扩展,创建新的类型。
◆◆继承的作用
1、有效的解决了代码重用的问题,是代码扩展更加灵活
2、从始至终完成的体现了一个应用系统,逻辑更加清晰
3、增加软件的可扩展性,以适应不同的业务需求
◆◆继承必须遵守的规则
1、重写方法和被重写方法必须具有相同的方法名
2、重写方法和被重写方法必须具有相同的参数列表
3、重写方法返回值类型必须和被重写方法的返回值类型相同或为其子类
4、重写方法不能缩小被重写方法的访问权限
◆◆ 方法重载与方法重写
. | 位置 | 方法名 | 参数表 | 返回值 | 访问修饰符 |
---|---|---|---|---|---|
方法重载 | 同类 | 相同 | 不相同 | 无关 | 无关 |
方法重写 | 子类 | 相同 | 相同 | 相同或是其子类 | 不能必父类更严格 |
◆◆继承功能得利弊
继承好处:
实现了数据和方法的共享
提高了代码的复用性(多个类相同的成员可以放到同一个类中)
提高了代码的维护性(如果方法的代码需要修改,修改一处即可)
提高了代码的可扩展性
继承弊端
继承让类与类之间产生了关系,类的耦合性增强了,当父类发生变化时子类实现也不得不跟看变化,削弱了子类的独立性
◆多态
◆◆多态的概念
是指同一行为,具有多个不同表现形式。
通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态。
在java中要实现多态,必须要满足如下几个条件,缺一不可:
- 必须在继承体系下
- 子类必须要对父类中方法进行重写
- 通过父类的引用调用重写的方法
◆◆重写
重写(override):也称为覆盖。重写是子类对父类非静态、非private修饰,非final修饰,非构造方法等的实现过程进行重新编写, 返回值和形参都不能改变。
即外壳不变,核心重写!重写的好处在于子类可以根据需要,定义特定 于自己的行为。 也就是说子类能够根据需要实现父类的方法。
规则:
子类在重写父类的方法时,一般必须与父类方法原型一致:返回值类型方法名(参数列表)要完全一致
被重写的方法返回值类型可以不同,但是必须是具有父子关系的
访问权限不能比父类中被重写的方法的访问权限更低。例如:如果父类方法被public修饰,则子类中重写该方 法就不能声明为 protected
父类被static、private修饰的方法、构造方法都不能被重写。
重写的方法, 可以使用 @Override 注解来显式指定. 有了这个注解能帮我们进行一些合法性校验. 例如不小心 将方法名字拼写错了 (比如写成 aet), 那么此时编译器就会发现父类中没有 aet 方法, 就会编译报错, 提示无法构成重写.
规则:
子类在重写父类的方法时,一般必须与父类方法原型一致: 返回值类型 方法名 (参数列表) 要完全一致
被重写的方法返回值类型可以不同,但是必须是具有父子关系的
访问权限不能比父类中被重写的方法的访问权限更低。例如:如果父类方法被public修饰,则子类中重写该方 法就不能声明为 protected
父类被static、private修饰的方法、构造方法都不能被重写。
重写的方法, 可以使用 @Override 注解来显式指定. 有了这个注解能帮我们进行一些合法性校验. 例如不小心 将方法名字拼写错了 (比如写成 aet), 那么此时编译器就会发现父 类中没有 aet 方法, 就会编译报错, 提示无法 构成重写.
总结
从认识论角度考虑是先有对象后有类。对象,是具体的事物。类,是抽象的,是对对象的抽象
从代码运行角度考虑是先有类后有对象。类是对象的模板。
类与对象的创建:
使用new关键字创建对象
使用new关键字创建的时候,除了分配内存空间之外,还会给创建好的对象 进行默认的初始化以及对类中构造器的调用。
类被实例化后会返回一个自己的对象,
类中的构造器也称为构造方法,是在进行创建对象的时候必须要调用的。并且构造器有以下俩个特点:
◆1.必须和类的名字相同
◆2.必须没有返回类型,也不能写void
初始化顺序
创建对象的时候,成员变量经历了三个过程: