Java基础:
三种基本语句(选择,循环,顺序)
If 条件,switch条件,for循环,while循环中
Println输出 Scanner输入设备
结合于java基本类型的变量(有一些问题用函数)
数组(定长,相同数据类型)
注意:数组是引用对象,赋值赋值的是地址
索引从0开始,获取长度length属性
读/(修改) for循环,或者增强for,简易方法: Arrays.toString()
之前开发特点:思路一条线
缺点:项目主导 不利于团队开发
面向对象的设计
大程序:分模块(分工协作)
电商: 商品 订单 支付 用户 购物车(子功能)
面向对象的开发
做项目之前: 有抽象的描述(想法) ---à规划
后面开发 抽象的描述具体化---à对抽象的描述改进,功能实现
Java 引入概念: 类 对象
类: 对一些事物的抽象描述 ,统称,
对象,是实现抽象的具体化
Class 就是类
当我们把写好的class使用new 把class具体使用时,就是对象,把类转成对象的new过程,就是一个实例化的过程.
new ---à实例(对象实现类)
面向对象编程----à定义类,程序员实现类中的方法
有利于项目中管理,有利于分工协作开发,有利于项目中模块分离
编程:变量定义(变量往往代表值) 功能(算法)――>函数
变量:代表编程中某个值
函数:代表编程中某个功能(通过循环,条件,顺序写逻辑)
商品
维度:
ISBN编号:9787515222585书名:伤寒论 白话彩图典藏版作者:辛丽静
是否是套装:否出版社名称:中医古籍出版社
操作:
对购买和加入购物车所有的商品都有功能
淘宝搜药(出来的有药方面的书,有药)
药类属性:
型号:圣艾元云南本草痔立消品牌:圣艾元(医药)产地:湖北
颜色分类:5盒装【重度痔疮适用】 3盒装【较重痔疮适用】 2盒装【中度痔疮适用】 1只装【轻度痔疮适用】生产企业:湖北林源堂医药有限公司增值服务:正品保障
适用人群:内外痔疮/大便出血/肛周湿疹症状:内外痔疮/大便出血/肛周湿疹注册证号:鄂襄阳械备20190153号
选购热点:痔疮膏医疗器械产品名称:伤口护理软膏伤口敷料种类:其他
剂型:乳膏
相同的特征:
有相同的特征,也有不同的特征,都在商品模块,操作都是大同小异
在商品模块中,属性有共性的内容,又有个性的内容,操作是大同小异(秒杀)
采用面向对象的思维
把共性的内容定义成类,个性的东西相当于具体的实例
把商品用面向对象的方法来进行思考问题,商品模块中就有一个类是商品
Java建立类的时候,类名需要大写,对象的名字就小写,小写相当于实例化的类
与之前编程不一样的地方,在于之前编程有一个main函数,这里main是java的执行程序,所有程序都要有一个程序去做主管,其它模块只是程序执行过程中的调用.
淘宝是主程序,main函数只显示taobao首页就ok了.
其它模块程序都是用户交互(点击)进去,触发了某个函数,函数调用模块.
面向对象编程:(1)分模块,写模块,不要写main方法,只有变量和函数
(2)最终分析逻辑,哪个模块是主函数,模块和模块之间如何调用.(调用流程就是用户操作逻辑,把操作逻辑中共性的内容提取成类)
商品改成类
变量:
配送(地址,就是值) java分析类型 String
数量(1或2,就是值)java 分析类型 int
价格(值)有小数 java分析类型 double
函数:立即购买(用户点击立即购买),加入购物车(用户点击加入购物车)
注意: 这里没有main
这样,商品类的代码
public class Goods {
//把变量定义完成,peisong 配送的变量 num 数量的变量 price 价格的变量
String peison;
int num;
double price;
//有两个方法 buy是立即购买 addcar加入购物车
public static void buy(){
System.out.println("你购买了这个商品");
}
public static void addcar(){
System.out.println("你已经把商品加入购物车");
}
}
首页模块中模拟用户操作,实现触发商品
/*
首页模块
是最终执行的模块
*/
public class SouYe {
//这里有main函数
public static void main(String[] args) {
//用户点击商品,把这个商品具体化了,对商品具体化就是把商品的类实例化,实例化过程就是new
Goods goods = new Goods();
//具体化,把属性赋值,首页告诉商品名称,商品价格
goods.name="伤寒论张仲景正版原著中医书籍大全白话彩图典藏版";
goods.price=9.8;
//模拟用户点击,当前步骤省略了从商品列表页到详情页
//相当于在首页中选中这个商品,进入到商品具体页面,
//看到商品的其它属性,变量值直接赋值就可以
goods.peison="江苏南京至北京市昌平区";
goods.num=1;
//触发"立即购买",函数是要用()
goods.buy();
}
}
因为有主函数,主函数就是面向对象开发程序的入口,执行首页模块即可.
使用this时出现
报错原因:this不能用在静态中。写面向对象的方法时,把static的静态去掉。
注意:在写对象的方法函数时,不用加static.
面向对象的思想中,变量专业名称:属性 函数专业名称:方法
对于类,编写类中的属性和类中的方法
按照面向对象思维完成基本电商逻辑图
首页:整个程序的组织者,调度者,用户参与都是通过首页来参与的
功能:
首页模块: 功能:显示平台中的所有商品(商品列表:名称,价格)
商品模块:选择商品--à商品模块--à显示商品的详细 (名称,价格,配送,数量)
订单模块: 功能:订单号(属性) 商品的全部信息 方法: 去支付
支付:功能:帐户名称,帐户余额 方法:支付
购物车模块:订单号 商品全部信息的数组(定长,要求用户购买商品不能超过5个)
首页:显示所有商品,必须有main函数,main函数中是所有商品的显示,商品是具体的实例,原来商品是抽象的概念,在首页上知道内容,首页上是商品实例对象的显示.首页代码,new商品类的对象,让用户选择浏览哪一个商品.
商品模块:
显示商品详情因为变换页面,显示商品详情属性商品模块, 在商品模块多一个方法,显示商品详情,并且触发立即购买或者触发加入购物车.
用户选择立即购买,网站出现变换页面,触发订单模块.
生成订单是功能,生成订单后才能支付,还要计算用户的钱,有商品价格,商品的数量,商品的名称
这里的订单,需要继承goods的类,把类中所有内容取出来,用到订单中.继承后就是子类和父类,子类具备父类的所有属性和方法.继承的关键字是extends,
在订单中总价,最终生成定单就是把总价,商品名称,地址打包放在一起,形成订单编号,然后去支付。
凡是面向对象(属性,方法)
属性: 总价(商品模块没有总价,只有生成订单才会有总价,总价是一个值)
方法:生成订单功能(形成订单号,包含相关信息,实现去支付)
包含相关信息,通过继承extends Goods获取的
支付模块:
支付类(属性,方法)
支付帐户信息,名称,余额,
方法:支付逻辑(余额正确,支付,支付完把余额减掉)
在方法中对比用户余额和最终订单的总价格,对比需要订单里面的总价信息,获取订单中的信息,采用继承。
继承后,如果发了new,所有信息清空,解决。
2.面向对象的思想:
- 只有一个主程序入口,入口在首页模块,入口是main函数,其它模块没有main方法,在其它模块中有方法。
- 模块理解成类,在实际的代码中,用户调用类,实例化,实例化后的就是对象。
- 编写代码中,需求,订单类需要用商品类中的相关信息,采用extends继承。
在代码中
New 类()
在内存中存放的是类的地址,指示的执行在哪里找(通关文谍)
后面跟这个地址有关的代码,到这个地址中找
理解new 实例化的过程,实际底层就是获取内存中的栈地址.相关属性和方法的具体内容需要地址去找。
在完成的代码中,运行时会出现。
根据下面的原理图分析
1、如果把第一个地址中有数据的属性传递给第二个地址,第二个地址就有数据,第二个地址传递时,也把数据传递给第三个地址,保证数据依次传送
2、使整个extends只有一个地址存在。
第二种方法就是只有一个地址,简单,但是代码不一定可读。
需要找一个属性名最多的类实例化,也就是实例化继承链最底端的类,保证只有一个地址,这个实例在整个程序中有效,需要在main当中进行实例化。
3、在面向对象概念中,有一个重写
重写:父类定义方法,子类实现这个方法,子类继承了父类的方法,但父类方法满足不了子类的需求,需要重写。重写的关键字Override
4、系统自动产生构造函数
在类里右键
选择“Generate。。”后出现菜单,选择”constructor”选择“构造器”。
在出现的菜单中,按住shift键,把这两个变量都选中变蓝底。
然后点击下面的确定(ok)
最后看函数的效果
public Pay(String myname,double mymoney){
//传进来的参数myname,mymoney就是局部变量,只在这个函数有效
//整个类中的全局变量username money
this.username=myname;
this.money=mymoney;
}
这个函数不需要写返回值。
如果类中构造函数时,在实例化类变成对象时不写参数是报错的。
把构造函数的两个参数传入即可
用一个地址指向实现重点:
- new 一个地址就是一个地址指向,一个地址把new 逻辑放在main函数中
- 在调用模块中可能出现某个子类在父类中没有的方法 ,父类中定义这个方法,不实现方法中的代码,由子类去重写,重写的关键字是Override
- 在调用模块中可能出现某个子类在父类中没有的属性,直接把父类的属性去掉,在子类中构建构造函数,构造函数没有返回值,可以自己实现,可以使用编辑工具自动产生。这里代码只是实现属性的初始化。
- 如果实例化的类中有构造函数,构造函数中还有参数存在,在实例化时就需要指明参数的具体的值。
- 因为要使用一个地址,相当于实例化一次,在整个逻辑继承链中有实例化的代码都把实例化代码去掉,用this当前实例指向其调用的方法。
功能上,如果帐户和钱可以用户输入,这个username和money改成Scanner
在构造函数中,同一个函数名,出现传参和不传参两种形式,这种技术叫重构。
注意:在函数处理方面
父类有函数,子类实现,这种方法是重写。
函数具有同一个函数名,不同的函数的参数,这种方法是重构。
构造器不般采用重构的方式,实例化就是执行构造器,也可以带参数进行实例化,也可以不带参数实例化。
总结:输出对应的商品信息,只进行new格式化一次。
代码写完,剩下安全性的问题
注意:
关键字
Public关键字,意味着只要类实例化,每一个开发者都可以调用,不安全,make_order()方法只有子类去重写父类,只有继承后才可能发生重写。不继承调用不了,public 改成protected, 如果你的调用到某个类就截止了,后面不允许再调用,绝代方法。可以使用final.
再继承,后面的子类不能再使用final定义的方法了。
这时Pay支付没有下订单的权限了。
主类中调用时只要符合继承链的都可以调用。
除了public,protected外,还有一个关键字是private私有的,作用子类继承父类后,这个属性或者方法不允许子类使用。
final 继承过程中不再传承.
项目管理:
变量名或者方法的定义
后面开发的程序继承(规范变量名和方法名)
总结:
面向对象编程注意点:
- 凡是调用模块中的方法,都是实例化对象 : new 类
- 感兴趣的可以在git上查看具体内容:Lazying/Java (gitee.com)