抽象封装继承多态-2

1.回顾

1.类
代码:.java文件,Java中代码的存放位置
创建类是有原则的:具有相同(相似)属性/行为的代码放在一个类中
类中有两类成员:
1)属性:成员变量,私有的
在方法的外部,类的内部

private String name;

2)行为:方法 特定功能的代码块,可以复用.

public int sum(int num1, int num2){
    int count= 0;
    count=num1+num2;
    return count;
}

2.类中的代码,不能自动运行的.(不是放在内存中的)
对象:内存中存放代码的空间(地址)
需要将类中的的代码加载到内存中,才可以被执行.—>创建对象的过程
类名 变量(对象)=new 类();

3.面对对象的3大特征
封装:属性私有,通过公共的setxxx,getxxx方法对属性进行操作,在赋值过程中,对值得有效性进行判断,从而保证数据的合理性.
继承:描述的是类和类之间的一种关系,通过继承关系,子类可以使用父类中可以允许使用的那些成员
好处:代码复用–重复的代码放在父类中即可,
子类中仅存放自己独有的代码即可.
有利于程序的变更及维护
Java中继承的特点:
1.单根性(只允许有一个父类),基类(父类)单继承
2.传递性(孙子类可以用爷爷类的东西)

2.多态的概念及实现

目前编程会出现的问题:
案例:电子宠物系统
dog:Strain品种 eat()
cat:play()
pet:name,age,sex

问题:当程序业务有变更时,增加代码的同时,还需要修改原有代码,带来大量的工作量
解决办法:使用多态

多态的使用步骤:
1.在父类中编写共同的方法,有方法体{}但是方法体是空的,称为虚方法.
2.在子类中重写父类的虚方法
重写:在子类中,方法头和父类中被重写的方法的头相同,也成为方法覆盖
3.在使用时,用父类做类型,具体使用子类对象.在调用时方法的参数是父类类型,传递实参时,可以传递其子类类型
里氏替换原则LSP:任何父类出现的位置,都可以使用其子类对象进行替换

什么是多态?同一父类类型,调用其同一方法后,表现出不同的状态,成为多态
//就是父类写一个空方法(虚方法),子类根据各自不同的特性重写该方法,在使用时形参写父类类型,调用时可以写子类类型.

多态特点:
父类:方法(虚方法)
子类:重写父类中的虚方法
多态的实现方式,区别:
1)方法重载实现:静态方式实现多态,在程序编译的过程中,重载的方法就已经确定了,重载的若干个方式同时都加载到内存中.在执行时,根据参数的情况决定调用哪一个方法.
2)方法重写/方法覆盖:在编译时,及在内存加载时,子类的方法并没有覆盖掉父类中被重写的方法.只有在调用过程中,判断是哪个子类调用的,然后用这个子类的方法来覆盖父类的方法.
由于参数的类型是父类类型,所以调用的是父类空间中的方法,根据具体传递的参数,判断参数是哪个子类类型,就使用这个子类中的方法体去滴覆盖掉父类的虚方法.

3.多态的应用:对象数组

变量 数组 集合框架
数组特点:
1)数据类型相同
2)内存空间连续
3)长度固定

new一个父类数组,存入子类对象;由于数组是父类类型,存入数组的元素都由原类型隐式转换为了父类类型.转换为父类类型后,就只能访问父类中的成员,不能访问子类中独有的成员.
根据LSP,数据类型是Pet,数组中的元素可以是Pet的子类
需要判断数组中元素的原始类型,然后强制转换为原始类型后,就可以访问子类的独有属性.
1)判断数组元素的原始类型
语法:
对象 instanceof 类 —-返回Boolean值,true:是这个类型;false:不是这个类型

if(p instanceof Pig){
    Pig pig = (Pig)p;
}

父类的类型指向子类的引用;通过p只能访问Pet类中的成员,Cat的独有成员不能访问:

//Pet 是Cat和Dog的父类
Pet p = new Cat();
//考虑多态,程序的拓展,更灵活
p = new Dog();

说明:局部变量不能重名(声明在方法内部或方法中语句块内部的变量

4.多态应用:设计模式

模式:做一件事情的比较好的方法
设计模式:开发中完成一个功能的比较好的实现方式.共有23种设计模式

4.1工厂设计模式

1.创建对象的方式:自行new来创建对象,哪里需要就在哪里new.
new对象的代码分布在各个类中

声明一个工厂,生产对象,在需要对象时,找工厂生产即可.解决集中创建对象的问题就称为简单工厂模式.
1)各个类中添加构造函数
2)创建一个工厂类
3)在工厂类中,编写创建对象的方法:
-1方法的返回值是父类类型;
-2方法的参数,包括所有子类需要的所有参数,额外 char
type:创建哪个子类对象
-3判断类型,创建对象
-4返回父类类型
-5创建对象时,无需自己new 而是调用工厂方法即可
好处:当子类没有确定:类名、参数频繁变化的时候,只需要修改工厂类一处即可.
整个改动是最少的

由于工厂方式是static修饰的,所以访问时语法:类名.静态方法名

public class PetFact {
    public static Pet createPet(String name, int age, String sex, String strain, String color, char type) {
        Pet pet = null;
        switch (type) {
        case 'c': {
            pet = new Cat(name, age, sex);
            break;
        }
        case 'd': {
            pet = new Dog(name, age, sex, strain);
            break;
        }
        case 'p': {
            pet = new Pig(name, age, sex, color);
            break;
        }
        }
        return pet;
    }
}

5. static

static 静态的
修饰的成员:
1、属性–静态变量
2、方法–静态方法
3、内部类–静态内部类
4、代码块
static{
}

内存划分:
1.堆 存放new出的内容:属性,方法代码
2.栈 存放局部变量
3.常量 存放常量
4.静态区域 存放static修饰的内容
static作用:Java的jvm在运行程序时,检测程序中所有使用static修饰的成员,把static修饰的内容直接存放到内存的静态区域中
static的访问方式:类名.成员
本质:静态成员属于类,不属于对象,是公共的
静态成员的生命周期:当程序运行时,在内存的静态区域;当程序关闭后,静态成员在内存大静态区域中销毁
使用场合:对于所有对象都可以共同使用

总结:
1.多态
好处:当程序有业务拓展时,使用多态,代码的改动量最小
概念:同一类型,调用同一方法,表现出不同的状态.
2.实现方法:
方法重载:静态方式实现多态;
方法重写:动态方式实现多态
实现步骤:
3、多态的应用
数组/变量是父类类型 ,赋值是子类对象
instanceof
简单工厂的应用
4、static