Java面向对象的程序设计

 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.面向对象的思想:

  1. 只有一个主程序入口,入口在首页模块,入口是main函数,其它模块没有main方法,在其它模块中有方法。
  2. 模块理解成类,在实际的代码中,用户调用类,实例化,实例化后的就是对象。
  3. 编写代码中,需求,订单类需要用商品类中的相关信息,采用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;
}

这个函数不需要写返回值。

如果类中构造函数时,在实例化类变成对象时不写参数是报错的。

把构造函数的两个参数传入即可

用一个地址指向实现重点:

  1. new 一个地址就是一个地址指向,一个地址把new 逻辑放在main函数中
  2. 在调用模块中可能出现某个子类在父类中没有的方法 ,父类中定义这个方法,不实现方法中的代码,由子类去重写,重写的关键字是Override
  3. 在调用模块中可能出现某个子类在父类中没有的属性,直接把父类的属性去掉,在子类中构建构造函数,构造函数没有返回值,可以自己实现,可以使用编辑工具自动产生。这里代码只是实现属性的初始化。
  4. 如果实例化的类中有构造函数,构造函数中还有参数存在,在实例化时就需要指明参数的具体的值。
  5. 因为要使用一个地址,相当于实例化一次,在整个逻辑继承链中有实例化的代码都把实例化代码去掉,用this当前实例指向其调用的方法。

 功能上,如果帐户和钱可以用户输入,这个username和money改成Scanner

在构造函数中,同一个函数名,出现传参和不传参两种形式,这种技术叫重构。

 

注意:在函数处理方面

父类有函数,子类实现,这种方法是重写。

函数具有同一个函数名,不同的函数的参数,这种方法是重构。

构造器不般采用重构的方式,实例化就是执行构造器,也可以带参数进行实例化,也可以不带参数实例化。

总结:输出对应的商品信息,只进行new格式化一次。

代码写完,剩下安全性的问题

 注意:

关键字

Public关键字,意味着只要类实例化,每一个开发者都可以调用,不安全,make_order()方法只有子类去重写父类,只有继承后才可能发生重写。不继承调用不了,public 改成protected, 如果你的调用到某个类就截止了,后面不允许再调用,绝代方法。可以使用final.

再继承,后面的子类不能再使用final定义的方法了。

这时Pay支付没有下订单的权限了。

主类中调用时只要符合继承链的都可以调用。

除了public,protected外,还有一个关键字是private私有的,作用子类继承父类后,这个属性或者方法不允许子类使用。

final 继承过程中不再传承.

 

项目管理:

变量名或者方法的定义

后面开发的程序继承(规范变量名和方法名)

总结:

面向对象编程注意点:

  • 凡是调用模块中的方法,都是实例化对象 : new 类
  • 感兴趣的可以在git上查看具体内容:Lazying/Java (gitee.com)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值