面向对象编程

1.面相对象:
(1)抽象
(2)类和对象
(3)封装:降低使用者的成本,软件开发本质上就是要管理代码的复杂程度。
(4)继承:代码写起来更简单,起到了代码重用的效果。
(5)组合:代码写起来更简单,起到代码重用的效果。
(6)多态:本质上是封装的更进一步
(7)自省(反射):对象在运行时获取到自身的一些信息。

2.包:包是组织类的一种方式
(1)如果代码复杂,就需要创建很多的类,包就是把一些具有一定关联关系的类放到同一个目录中。
(2)把同名的类放到不同的包中,包就起到了命名空间的作用。谈到某个名字,就可以通过包来具体区分是哪一个了。

如果某个类没有用到package声明,相当于就存放于一个匿名包里面,匿名包其实就是同一个。

静态导入:使用 import static 可以导入包中的静态方法和字段可以使代码更方便。

3.Java访问权限控制:
在这里插入图片描述
4.继承的目的是为了代码的重写,把公共代码放到一个单独的类中,让其他的类继承这个单独的类,单独的这个类里面的属性和方法都自动的被新类支持进去。此外,新的类还可以增加新的方法,也可以对父类的方法重新编写(即复写)。
继承中父类和子类的关系,称为:is - a;而组合的含义是: has - a
考虑使用继承还是组合时:
(1)根据实际场景看看要表示的类到底是哪种语义
(2)优先考虑组合。

5.向上转型:类型转换,类和类之间(父类与子类),一个子类的对象可以使用父类的引用去表示。
向上转型的三种常见体现形式:
(1)直接赋值:
在这里插入图片描述
(2)作为方法的参数:
在这里插入图片描述
在这里插入图片描述
(3)作为方法的返回值
在这里插入图片描述
在这里插入图片描述
6.动态绑定: 在父类和子类中可能会包含名字相同,但是逻辑不同的方法,调用这个方法的时候,到底执行的是父类的方法还是子类的方法是在程序运行过程中确定的(而不是编译过程中)。
“动态”指的是运行期,而不是编译期。具体执行那个方法要看后面的对象而不是前面的引用。

在这里插入图片描述
在这里插入图片描述

7.重写/复写/覆盖:在子类中重新编写父类中的方法,但是有一定的条件。
构成重写的条件:
(1)方法名相同
(2)参数必须完全相同
(3)返回值没啥要求,但是一般情况下也设为相同
(4)子类的访问权限不应该比父类小(一般设为一样)
(5)普通的方法可以冲写,但是static修饰的静态方法不能重写。

注意区分重载与重写:
重载:方法名相同,参数不同(参数的数量、参数的类型),与返回值无关
在这里插入图片描述在这里插入图片描述在这里插入图片描述
8.多态:是一种思想,多态落实到代码上具体的体现形式就是通过以下三种形式体现的:
(1)向上转型
(2)动态绑定
(3)方法重写
多态是封装的更进一步。前面讲的封装是为了让类的调用者不需要知道类的具体实现细节(还得知道这个类是什么类);
多态这里调用者都不需要这个类是什么类型,只需要知道这个类有某个方法就可以了。

多态的好处:
(1)类的使用者对类的使用成本进一步降低
(2)能够降低代码的“圈复杂度”,避免使用大量的 if - else
(3)可扩展能力更强

圈复杂度指的是一段代码的复杂程度(有多少个分支/循环)
降低圈复杂度的方法:
(1)拆分函数
(2)转移表
(3)多态

对象比较:
(1)比较值:
(2)比较身份(地址)java中用 == 比较身份
(3)比较类型(常见的情况是向下转型)if (animal instanceof Bird)
Animal animal = new Bird(“圆圆”);
if (animal instanceof Bird) {
Bird bird3 = (Bird)animal;
bird3.fly();
}

9.向下转型就是把父类的引用强转成子类的引用(前提是这个父类的引用就真指向了子类的对象,否则就抛出异常)。
向上转型就是父类的引用指向子类的对象。

通过一个引用调用某个方法的时候
Animal animal = new Bird();
animal.fly();
(这个调用会抛出异常)
(1)编译过程中,检查fly这个方法是否是 Animal 类型的合法方法。
(2)运行过程中检查 Animal 本质上到底是哪个子类的实例来决定调用哪个子类的方法。
所以为了规避向下转型的风险,在转型之前作出判定,看看这个父类的引用到底是不是指向子类的实例(用 instanceof 这个关键字)

super是获取到父类对象的引用,如果需要在子类中需要调用父类的方法,就可以使用super(如果不用这个,就可能由于方法重写,就导致调用到了子类的方法)。

10.注意在创建子类的时候,构造方法形成的先后顺序
创建一个子类的实例同时会创建出一个父类的实例,父类的构造方法先调用,然后再调用子类的构造方法。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
要注意下列的情况,以防出现翻车:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
因此,构造方法要尽可能的简单,尽量不要去调用其他方法,防止这个被调用的方法被子类复写,出现不可预期的情况。

11.抽象类:在类的前面加上 abstract 关键字,表示这是一个抽象类;在抽象类里面的方法前面加上 abstract 表示这个方法是一个抽象方法,抽象方法没有方法体,不能执行具体的代码。
对于包含抽象方法的类前面必须加上 abstract 关键字表示这是一个抽象类。

注意事项:
(1)抽象类不能直接实例化(不能创建引用new一个对象)
(2)抽象方法不能是 private 的(非法的修饰组合 abstract + private)
(3)抽象类中可以包含其他的非抽象方法,也可以包含字段。这个非抽象方法和普通方法的规则是一样的,可以被重写,也可以被子类直接调用。

抽象类的作用:
抽象类存在的最大意义在于:被继承。
抽象类本身不能被实例化,要先使用只能创建该抽象类的子类,然后让子类重写抽象类中的抽象方法。

12.接口:接口是抽象类的更进一步。抽象类中还可以包含字段和非抽象的方法,而接口中包含的方法都是抽象方法,字段只能包含静态常量(只能由 public static final 同时修饰)
使用 interface 定义一个接口,接口的方法一定是抽象方法,因此可以省略 abstract ;接口中的方法一定是 public ,因此可以省略 public 。
接口不能被实例化。
在这里插入图片描述
Java中只支持单继承,一个类只能 extends 一个父类,但可以同时实现多个接口,也能达到多继承的效果。

接口间的继承:
接口可以承接接口达到服用的效果,使用 extends 关键字。

接口与抽象类的比较:
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值