学习日记(面向对象编程 OOP)
九、instanceof 详解
-
简介:instanceof 是 Java 的关键字之一,左边是对象,右边是类,返回值为 Boolean 型(true or false)。
-
作用:测试左边的对象是否是右边类或者该类的子类创建的实例对象。
X instanceof Y
的结果判断方法:
- 先看 X 的引用类型和 Y 是否存在父子关系,若存在,则编译通过进行第二步;若不存在,则编译报错。
- 看 X 是否是 Y 或 Y 的子类创建的实例对象,若是,则结果为 true;若不是,则结果为 false。
举例:
十、类型转换
- 基本类型转换:高 -> 低 需要强制类型转换;
- 引用类型转换:父类 -> 子类,向下转型,需要强制类型转换;子类 -> 父类,向上转型,不需要强制转换,可能丢失自己本来的一些方法;
- 类型转换的意义:方便方法的调用,减少重复的代码,有效地提升代码的利用率,使代码变得更简洁。
十一、static 详解
-
用类调用静态成员变量和静态方法
-
同一类中:静态方法之间可以互相调用,非静态方法之间可以互相调用,非静态方法可以调用静态方法,静态方法不能调用非静态方法。
-
代码块和静态代码块:程序在执行时并不能主动调用匿名代码块,匿名代码块是在创建对象时自动创建的,在构造器之前;静态代码块是类一加载的时候就会执行,永久只执行一次。可以用代码块赋初值。
-
静态导入包
十二、抽象类(抽象的抽象)
Abstract 修饰符可以用来修饰方法,也可以用来修饰类。如果修饰方法,那么该方法就是抽象方法,如果修饰类,那么该类就是抽象类。
- 抽象类中可以没有抽象方法,但有抽象方法的类一定要声明为抽象类;
- 抽象类,不能用 new 关键字创建对象,它是用来让子类继承的;
- 抽象方法,只有方法的声明,没有方法的实现(不能有方法体),它是用来让子类实现的(因此抽象方法不能是 private);
- 子类继承抽象类,那么就必须要实现抽象类中没有实现的抽象方法,否则该子类也要声明为抽象类;
- 打开 class 文件可以发现:抽象类存在构造器;
- 抽象类存在的意义:被子类继承,抽象类体现的是模板思想,让子类使用模板(抽象类中的抽象方法)去重写抽象方法实现对应的需求(看注意 4)。
十三、接口的定义和实现
- 普通类:只有具体实现;
- 抽象类:具体实现和规范(抽象方法)都有;
- 接口:只有规范。可以实现约束和实现分离。
总结:
- 接口就是规范,定义的是一组规则,体现了现实世界中“如果你是…则必须能…”的思想。
- 接口的本质是契约,像法律一样,制定好后大家都遵守。
- 面向对象(OO)的精髓,就是对对象的抽象,最能体现这一点的就是接口。
- 声明类的关键字是 class,声明接口的关键字是 interface。
举例:
- 接口中定义的方法可以不写修饰符,默认为
public abstract
,接口中定义的属性可以不写修饰符,默认为静态的常量public static final
,一般不会在接口中定义属性; - 接口都需要有实现类,一般实现类结尾用
Impl
; - 类可以通过关键字
implements
实现多个接口,接口的实现类必须要重写接口中的所有方法; - 类里面可以有方法的实现,但是接口里面只有方法的定义;
- 接口不能被实例化,接口没有构造器。
十四、内部类
内部类就是在一个类的内部再定义一个类,如,A 类中定义一个 B 类,那么 B 类相当于 A 类来说称为内部类,A 类相当于 B 类来说就是外部类。内部类包括成员内部类、静态内部类、局部内部类、匿名内部类等。
-
成员内部类
-
静态内部类
-
局部内部类:注意:局部内部类不能声明为
public
类型,只能有一个public class
。
-
匿名内部类
注意:
-
instanceof 是一个比较转换的过程。
-
类被 final 修饰后不能被继承。
-
类只有单继承,接口可以多继承。
-
抽象类存在的意义简单理解:假如有一个动物的类,里面有一个 run 的方法,这时候需要继承他,小狗、小猫、小虎都会跑,这些每个子类都要继承他,但是这个 run 方法已经被父类实现了,所以每个子类都需要重写方法体,就比较麻烦。抽象类就是,父类定义了这个方法,但不去实现,由子类去继承,然后去实现(重写)方法,谁用谁实现。
-
理解
-
要学习抽象的思维,持续地学习。