面向对象(三大特征和接口、抽象类)

OOP 语言:也就是面向对象编程。
面向对象的语言有三大特性:封装、继承、多态。三大特性是面向对象编程的核心。

一.封装

1.封装的概念:在我们写代码的时候经常会涉及两种角色: 类的实现者和类的调用者

封装的本质就是让类的调用者不必太多的了解类的实现者是如何实现类的,
把属性和动作隐藏,只提供相应的方法来调用即可,只要知道如何使用类就行了.
当类的实现者把内部的逻辑发生变化时,类的调用者根本不用因此而修改方法。
这样就降低了类使用者的学习和使用成本,从而降低了复杂程度,也保证了代码的安全性

2. private实现封装

private 访问限制修饰符,被它修饰的字段或者方法就只能在当前类中使用。

3. getter和setter方法

当我们用private修饰字段后,这个字段就无法被直接使用了。
这个时候就用到了 get 和 set 方法了

4.封装的好处

1.提高了数据的安全性
别人不能够通过 变量名来修改某个私有的成员属性
2.操作简单
封装后,类的调用者在使用的时候,只需调用方法即可。
3.隐藏了实现
实现过程对类的调用者是不可见的,类的调用者只需调用方法即可,不知道具体实现。

二.继承

1. 继承的概念:

继承的意义:代码的重复使用

代码中创建的类, 主要是为了抽象现实中的一些事物.

注意:

  • 使用 extends 指定父类.
  • Java不同于C++/Python,JAVA中一个子类只能继承一个父类(单继承)
  • 子类会继承父类的所有public 的字段和方法.
  • 对于父类的 private 的字段和方法, 子类中是无法访问的.
  • 子类的实例中, 也包含着父类的实例. 可以使用 super 关键字得到父类实例的引用

2. super 关键字

1.当一个类没有写构造方法的时候,系统默认会有一个没有参数且没有任何内容的构造方法。

当子类继承父类后,在构造子类之前,就必须先帮父类进行构造

3.super 表示获取到父类实例的引用.,和this类似共有三种用法:

1).super.父类的成员变量
2).super.父类的成员方法
3).super():调用父类的构造方法

注意:super 和 this一样不能在静态方法里使用 !

如果一个类没有指定父类的时候,默认继承的就是Object类。

4.访问权限

5.final关键字

1.final修饰变量(常量,这个常量不能再被修改)
2.final修饰类,密封类:当前类不能再继承
3.final修饰方法,密封方法:该方法不能进行重写

三.多态

 1. 向上转型

(1) 概念

向上转型就是把一个子类引用给一个父类引用,也就是父类引用 引用了子类的对象

(2) 向上转型发生的几种时机

1.直接赋值

2.方法传参

3.方法返回

(3) 注意事项

注意:当发生向上转型的时候,通过父类引用只能调用父类的自己的方法和成员变量

 2. 向下转型

(1) 概念

向下转型就是父类对象转成子类对象。

(2) instanceof关键字

向下转型一般不建议使用,因为它非常不安全。

如果要让它安全就要加上一个关键字instanceof 来判断一下。

instanceof 可以判定一个引用是否是某个类的实例. 如果是, 则返回 true. 这时再进行向下转型就比较安全了

3.动态绑定(运行时绑定)

(1) 动态绑定概念

动态绑定发生的前提

1.先向上转型
2.通过父类引用来调用父类和子类同名的覆盖方法

    动态绑定也就叫运行时绑定,因为程序在编译的时候调用的其实是父类的方法,但是程序在运行时运行的则是子类的方法,运行期间发生了绑定。

(2) 重写(Override)

重写发生的条件

1.方法名相同
2.方法的参数列表相同(返回类型和数据类型)
3.方法的返回值相同

返回值构成父子类关系也是可以发生重写的,此时叫做:协变类型

注意:

1.子类的重写的这个方法,他的访问修饰符,一定要大于等于父类方法的访问修饰符
2.被final和static修饰的方法是不能发生重写的

(3) @Override注解

被@Override注解修饰的方法代表是要重写的方法,一但方法被这个注解修饰,只要方法的方法名、放回值、参数列表有一个地方不满足重写的要求,编译器就会报错。

4.多态

(1) 理解多态

多态其实就是一种思想,一个事物表现出不同的形态,就是多态。

(2) 多态的好处
1.类调用者对类的使用成本进一步降低.
封装是让类的调用者不需要知道类的实现细节.
多态能让类的调用者连这个类的类型是什么都不必知道, 只需要知道这个对象具有某个方法即可
2. 可扩展能力更强
如果要新增一种新的形状, 使用多态的方式代码改动成本也比较低
对于类的调用者来说(drawShapes方法), 只要创建一个新类的实例就可以了, 改动成本很低
 

总结:

1.封装:安全性
2.继承:为了代码的复用(java是单继承)
3.多态:一个事物表现出不同的形态
4.注意重载和重写的区别
5.注意this和super的区别

四.抽象类

抽象类
1.抽象类就是Java中没有方法体的方法。类中如果有抽象方法,该类就定义为抽象类。
2.抽象类和抽象方法必须有关键字abstract(抽象的)修饰。
3.抽象类的格式为:abstract class 类名 {}
4.抽象方法的格式为:public abstract void eat();
5.抽象类可以没有抽象方法,有抽象方法的一定是抽象类。
6.抽象类中可以有构造方法,是为了子类访问父类数据时初始化父类的。
7.如果想让抽象类实例化,就要以多态的方式由具体的子类实例化。
8.抽象类的子类必须是抽象类,或者重写所有方法的子类。

抽象类的成员特点
1.抽象类的成员变量既可以是变量,也可以是常量。
2.抽象类有用于子类访问父类数据初始化用的构造方法。
3.抽象类的成员方法既可以是抽象的,也可以是非抽象的。
4.关键字abstract不能和private、final、static关键字共存。
5.如果一个抽象类没有抽象方法,那就不能创建对象。

五.接口

接口
对象与生俱来的功能定义在类中很合理,但是局部对象的特性定义在类中就不合理了。不是天生具备的就不合适。如果有扩展功能,就要用接口来定义扩展功能。

接口的概念
1.接口:用来定义一些扩展功能,那些事物将来要用接个功能,就可以实现这个借口然后做出具体实现。
2.接口就是用来定义规范和规则的。
3.用关键字interface来定义接口。将class改成interface。格式: interface 接口名 {}。类实现接口用implements表示,格式:class 类名 implements 接口名{}。
4.接口中的功能没有具体实现。接口不能实例化,不能new对象。


接口的特点
1.接口中成员变量的特点:全是静态的公共变量。没有变量一说。接口中成员变量前面有默认的修饰符。
2.接口中没有构造方法,不能new对象。
3.接口中的方法全是抽象方法,内有非抽象方法。方法前存在默认修饰符。


接口和接口。类和类的关系
1.类和类的关系:单继承,支持多层继承。
2.类和接口的关系:实现关系,既可以单实现,也可以多实现。实现接口必须重写接口中所有方法。
3.接口和接口的关系:继承关系,并且可以多继承。单继承一个类的同时可以多继承多个接口。


抽象类和接口的区别
1.设计思想:抽取所有子类的共性,并强制子类对共性功能重写。接口定义的是整个继承体系当中的一些额外扩展功能,那些类想要具备扩展功能就可以具体实现某个接口。
2.抽象类中有构造方法,接口中没有。
3.抽象类中中既可以有抽象方法也可以由非抽象方法。接口中全是静态的公共变量。
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值