面向对象的程序设计
- 类和对象
类:事物的抽象,对象:事物的具体化
- 面向对象的三大特性
封装 继承 多态
- 封装
- 把所有的属性私有化private
- 对需要开放读取或者修改的属性使用getter或者setter方法
- 本类中某个方法调用,使用当前类实例this, 在其它类中调用,一般需要实例化,使用实例化后的对象名称,使用get方法获取私有属性,或者使用set方法对属性赋值
- extends
继承,分访问控制符,public,protected修饰的方法可以继承下来,对于private修饰的属性和方法是无法继承的。
注意:
1、构造函数继承不了的。需要继承使用super
2、Java的类继承是一个单继承,不是多继承
实现继承时需要一个继承的链,在类中extends后面只可以一个类
- 多态
多种状态
向上转化,向下转化
- 构造函数
- 与类同名
- 有不同的参数,也可以无参
- 类中没有构造函数,调用时也可以实例化。
- 重载和重写
重载:同一个函数名,不同的参数(类型,数目)
重写:发生在extends,当某个方法满足不了子类要求,进行Override关键字的重写。
- 属性和方法
属性:类中的变量,叫成员变量
方法:类中的函数
- 面向对象的编程思想:
- 封装成几个类,如何封装(private变量,getter,setter,无参构造,有参构造)
- 根据逻辑确定类中的方法
- 在主类中进行类的实例化,进行实例化的属性和方法的调用.
先完善程序:加入购物车
逻辑:
1\进入商品模块,点击”加入购物车”
需要多个商品,这里只限定5个(数组:定长)
这里多次输入商品和商品数量(限定最多只能买5个)
经过分析,一个类只能定义一个地址,不能执行addcar放在一个购物车中,因为不同地址的addcar没有统一的对象存放。
解决方法:
- 主类定义一个购物车的数组,存放每一个用户输入的内容。最后主类给订单结算,再调用订单。
注意画逻辑图:
在这个逻辑图中,多个商品模块的addcar都要放在一个购物车中。主类定义一个数组代替购物车,相当于把购物车的逻辑送给主类中,购物车没有划分出来,不满足面向对象的思想。 经过分析,在电商模块,一定存在购物车模块。
- 把购物车分离出来,由另外一个类去完成购物车。
重新定义一个类MyCart
实现封装,需要属性和方法,
属性:购物车存放多个商品,存放多个数据的只能是数组,数组是定长,规定只放5个商品,属性类型是数组,数组中存放的是每一个商品,数组中每个元素的类型就是商品类。变量名就是cart
根据逻辑,getter获取购物车数据是需要的,setter修改成加入购物车。
加入购物车的按钮在商品模块中。
注意:
- 数组的打印使用Arrays.toString()
如果这个数组是对象数组,是一个商品数组,商品是一个类,所以是对象数组,写Arrays.toString()时报错
不能转化的原因是mycart是一个购物车的类,类中有数组,需要调用类中的数组。
调用类中的数组,因为对象是一个地址,打印的还是一个地址。
如果想去打印数据,每个对象都有一个toString方法,需要重写toString()方法
第一步:右键:generator
在出现的菜单上选择“to String”
在出现的对话框中直接ok即可。
就可以要打印字符中信息了,但是这里放了5个
其实操作中只放了一个,结果打印了五个。证明在加入购物车中有代码bug
注意:
这里有一个多态的转化,定义时实例化MyPay,在购物车中放的MyGoods.最后可以显示MyGoods的内容。
清楚:
这里加入购物车需要用到while(true)一直购买。就需要一个标志用户购买行为结束。
订单结束,用户购买行为结束,(一般行为,形成订单后,不付款,在一定时间内订单关闭,订单可以不支付)
支付结束,用户购买行为结束。(支付行为不一定是最后的行为)
总结:
一个用户购买行为的结束,应该是由订单决定的,只要订单结算,这个订单就关闭了,要么就是后面的支付,要么就是取消定单.
注意:订单(淘宝:买家付款,卖家发货,买家收货,评论,订单关闭)
在自己的订单中,少了这个状态,少这个状态没有办法做定单关闭.解决立即购买和加入购物车之间的切换问题,理解订单的状态.需要订单类中多加一个属性status.
加入购物车后,最终生成订单的按钮在购物车中,生成订单的按钮的功能应该是在购物车类中.
购物车:
1\多加一个购物车类
2\订单的状态位,确定立即购买还是加入购物车
3\到支付订单,根据总价的值来进行立即购买和加入购物车的判定
对实际操作代码感兴趣的话可以跳转git:Lazying/Java