方法重写
一般记住以下的重写规则
方法名相同,参数列表相同,返回值类型相同或者是其子类,访问权限比父类宽,异常不比父类多
满足以上的条件即构成了方法重写
为什么要用方法重写?
子类具有自己个性个性化的内容,例如父类有一个动物叫的方法,但是每个动物的叫声是不一样的,而且动物也没有明确的叫声,因此,通常把父类里动物叫的这个方法定义为抽象方法,即不需要方法体,有抽象方法的类需要被定义为抽象类,因此父类常常是抽象类,抽象类中也可以有被实现的方法 使用方法重载是利用动态绑定机制实现多态
Animal dog=new Dog() 方法 编译看左边,执行看右边
变量 编译看左边 执行看左边
dog.shot() 会调用狗类中被重写的方法
多态
多态:同一个引用类型,使用不同的实例而执行不同操作
系统的扩展性和维护性好,添加新功能,不修改原有的代码
写代码需要注意:对修改封闭,对拓展开放
对修改封闭指不能修改,对拓展开放指的是能拓展, 利用多态来实现
主人类中cure的方法形参是Pet类型的 因此在测试类中用Pet pet=new Dog(),形式上是Pet类型,实际实例化的是Dog类型的,因此在调用cure方法时执行的还是Dog类中的cure方法
这样做的好处是如果新增一个猪类继承Pet,主人类中不需要再为猪新增一个cure的重写方法
抽象类和抽象方法
用abstract修饰的类和方法 有抽象方法的类一定是抽象类,但是抽象类中不一定有抽象方法
抽象方法的特点:没有代码块 public abstract void shout();之所以定义为抽象类就是这个方法每个子类都有其个性化的内容,所以这个方法想要是想要子类去将其重写
抽象类的特点 抽象类不能被实例化 即不能被new
单例模式
只能创建一个对象
懒汉模式
User要设置成静态私有因为我们只要创建一个User 所以想到static在内存中只有一个拷贝,getUser也要设置成静态的,原因是在测试类中我们没有对象去调用这个get方法,因此我们只能通过类名来访问
饿汉模式
饿汉模式是在第一步的时候直接new一个user对象,并用static来修饰 第三步的时候就不需要判断条件了
在测试类中每次get都是return这个对象
使用static修饰的原因是让其变为静态属性,在加载类的时候就能new出一个对象
工厂模式
快速生成对象
这种方法当有新对象则要重新修改代码
工厂方法模式
一个宠物一个宠物工厂的类,宠物工厂将接口的get方法实现,宠物类中只要投对应的宠物工厂类就能获得对应的宠物
这种写法为了如果新增宠物类时就不需要对原代码进行修改,只需要新增两个类就行
接口
接口:一种公共的规范标准,行为的抽象
关键字 Interface 类用implem实现接口
接口中的方法默认是 public abstract
接口无法被实例化即 new 接口 需要通过实现类对其实例 接口 成员变量=new 实现对象
接口多态
接口中的成员变量默认被static final修饰 只能是静态常量 int num=3; 无法再进行修改,能通过接口名直接访问
接口没有构造方法
接口中的普通方法是抽象的 如果要实现需要用default修饰
接口代表一种功能,规范,标准
一个类只能继承一个直接父类,但是可以实现多个接口,理解为java多继承
接口的语法规定: