面向对象
1. 面向对象三大特征:
-
封装
-
封装把对象的所有组成部分组合在一起,封装定义程序如何引用对象的数据,封装实际上使用方法将类的数据隐藏起来,控制用户对类的修改和访问数据的程度。
- 封装的步骤 :
- 所有属性私有化,使用private关键字修饰,只能在本类中访问;
- 对外提供简单的操作入口,以后的外部程序想要访问age属性,必须通过这些入口访问:set 和 get ;
- 封装的步骤 :
-
继承
-
继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。
- 继承的基本作用是:代码复用;
- 继承的重要作用是:有了继承以后有了方法的覆盖和方法的多态
- Java中的继承只支持单继承,一个类只能继承一个类,但一个类也可以间接继承其他类;
- B类继承A类
- A类称为父类,基类,超类,superclass;
- B类称为子类,派生类,subclass;
- 私有的不支持继承, 构造方法不支持继承, 其他数据都可以被继承;
- Java中假设一个类没有显式的继承任何类,该类默认继承Javase库中提供的java.lang.object类,Java语言中任何一个类都有object类的特征 ;
- 方法的重载 :
- overload:
-
- 在同一个类当中
-
- 方法名相同
-
- 参数列表不同
- 当同一个类中,方法的完成功能是相似的,建议方法名相同,方便程序员编程;
- 方法的覆盖(重写) :
- override:什么时候使用?
- 当父类中的方法已经无法满足当前子类的业务需求,
- 子类有必要将父类继承过来的方法进行重新编写,
- 这个重新编写的过程称为方法的覆盖;
- 方法覆盖发生在有继承关系的父类和子类之间;
- 返回值类型相同,方法名相同,形参列表相同;
- 访问权限不能更低,可以更高;
- 抛出异常不能更多,可以更少;
- 注意:
- 覆盖只针对方法,不针对属性;
- 私有方法不能继承,所以不能覆盖
- 构造方法不能继承,所以不能覆盖
- 静态方法不存在覆盖
- override:什么时候使用?
-
多态
- 向上转型(upcasting)
- 子类型----->父类型 【自动类型转换】
- 向下转型(downcasting)
- 父类型------->子类型【强制类型转换】 (当调用的方法是子类型特有的,在父类型中不存在,必须进行强制转换)
- eg:
- 向上转型(upcasting)
Animal a1=new Cat();//子类Cat转换为父类Animal
a1.move();//编译时检查Animal中是否有move方法,
//运行时调用Cat的move()方法
Cat c1=(Cat)a1;//强制类型转换,
c1.catchMouse();//编译运行通过
Animal a2=new Bird();
Cat c2=(Cat)a2;//Bird和Cat之间不存在继承关系,出现Java.lang.ClassCastException类型转换异常,
// 该异常在向下转型时会发生;
/**
*ClassCastException使用instanceof运算符判断数据类型来避免
*/
if(a2 instanceof Cat){
Cat c2=(Cat)a2;
c2.catchMouse();
}
if(a2 instanceof Bird){
Bird b1=(Bird)a2;
b1.fly();
}
- 父类引用指向子类型对象这种机制导致程序存在编译阶段和运行阶段绑定两种不同的形态/状态,这种机制可以成为一种多态语法机制;
- 多态的作用:
- 降低程序耦合度,提高程序拓展力
- 能使用多态尽量使用
- 核心:面向抽象编程,而不是面向具体编程(主人喂宠物例子)
2. 关于java类中的构造方法(构造器):
- 无返回值类型,但构造方法执行结束后又返回值,但return语句不需要写,并且返回值类型是构造器所在类的类型;
- 构造方法必须和类名方法一致;
- 使用new关键字调用构造方法创建对象,同时给实例变量赋值;
- 在同一个类当中,构造方法支持重载机制;
3.对象和引用:
- 对象:目前在new运算符在堆内存中开辟的内存空间称为对象;
- 引用:是一个变量,保存了内存地址,指向了堆内存中的对象;