10.31
面向对象 & 面向过程
-
面向过程:
- 步骤简单,第一步做什么,第二步做什么······
- 适合处理一些简单的问题
-
面向对象
- 物以类聚,分类 的思想,对于一个问题从整体上合理分析,需要哪些分类
- 适合处理复杂的问题,处理多人协作问题
具体到微观操作,需要面向对象——>面向过程
面向对象
- 本质:以类的方式组织代码,以对象的形式封装数据
- 三大特性:封装,继承,多态
实例化
调用类有两个方法
- 给被调用类加static,使它成为静态方法(类方法),可以直接被调用
- 实例化这个类 new
构造器/构造方法/构造函数
作用:创建对象的时候,给成员变量赋值
//如果我们没有写任何构造方法,那么虚拟机会自动给我们加一个空参的构造方法
//空参构造方法格式如下
/*
注意事项:构造方法的方法名与类名一致
没有返回值类型,连void也没有
创建对象的时候虚拟机调用,不能手动调用构造方法
每创建一次对象(new),就会调用一次构造方法
public Student(){
}
属性的默认初始化
数字:0
char:u0000
boolean:false
其他引用类型:null
封装
- 程序设计要追求:“高内聚,低耦合”。高内聚就是类的内部数据操作细节自己完成,不允许外部干涉;低耦合就是仅暴露少量方法给外部用
- 作用:
- 提高程序的安全性,保护数据
- 隐藏代码的实现细节
- 统一接口(get(),set())
- 提高系统可维护性
继承
super注意点
- super调用父类的构造方法,必须在构造方法的第一行
- super只能出现在子类的方法中
- super和this不能同时使用
重写
-
方法名必须相同,参数列表必须相同,方法体不同
-
父类方法修饰符是private,子类重写方法不能是public
public>protected>default>private
-
抛出的异常,可以缩小,不能扩大
ClassNotFoungException(小) Exception(大)
-
子类重写父类方法,相当于覆盖 了父类方法,当调用父类方法时,输出结果是子类的方法体
-
为什么要重写:父类的功能,子类不一定需要,或者不够用
-
无法重写:static,final,private修饰的
多态
定义:同一方法可以根据发送对象的不同而采用多种不同的行为方式;一个对象的实际类型是确定的,但是引用类型可以有很多
-
父类的引用指向子类 Person s2=new Student();
-
父类不能调用子类独有的方法
-
多态是方法的多态,属性无多态
-
多态的存在条件:继承关系,方法重写(如果不重写,则各自调用各自方法,就没必要多态),父类的引用指向子类
-
多态调用成员的特点:
- 调用成员变量的特点:编译看左边,运行看左边
- 调用成员方法的特点,编译看左边,运行看右边(子类重写后会覆盖父类方法)
-
多态的好处
- 在多态形式下,右边对象可以实现解耦合(模块间的耦合度是指模块之间的依赖关系,依赖越高,耦合度越低),即减少模块之间的依赖性,提高程序的独立性。便于扩展和维护
- 定义方法的时候,使用父类型作为参数,可以接收所有子类对象,便利(教务系统登录类,参数填Person,则可以传Student,Teacher,)
-
多态弊端:
static
- 静态方法中只能访问静态变量或者静态方法(想要访问非静态,则需要用this指出哪一个,而静态方法中没有this)
- 非静态(与对象有关)方法可以访问所有
- 静态方法中没有this关键字(静态方法是共享的,与某个对象无关,不需要this关键字)
抽象类和抽象方法
抽象类的作用是什么
抽取共性的时候,无法确定方法体,就把方法定义为抽象的
强制子类按照这种方法重写
- 抽象类不能创建对象(实例化)
- 抽象类中不一定有抽象方法,有抽象方法的类一定是抽象类
- 可以有构造方法
- 抽象类的子类
- 要么重写抽象类中的所有抽象方法
- 要么也是抽象类(则由子子类重写)
接口
接口中成员的特点
- 成员变量:只能是常量,默认修饰符:public static final。(接口就是规则,不需要变化)
- 构造方法:没有
- 成员方法:只能是抽象方法,默认修饰符:public abstract
接口和类的关系
- 类与类:继承关系,只能单继承
- 类与接口:实现关系,可以多实现,还可以在继承一个类的同时实现多个接口
- 接口和接口:继承关系,可以单继承也可以多继承
- 如果实现类实现了最下面的子接口,那么就需要重写所有的抽象方法(inter3继承了inter2和inter1,则inter3的实现类就需要重写所有的抽象方法)
内部类
- 写在一个类里面的类就是内部类
- B类表示的事物是A类的一部分,且B类单独存在无意义,比如,汽车类的发动机类