一、什么是面向对象

1、面向过程:面向过程就是分析出解决问题所需要的步骤,然后用函数(方法)把这些步骤一一实现,使用的时候依次调用就可以了——寻求解决问题的方法和步骤。
2、面向对象:面向对象则是把构成问题的事务按照一定规则划分为多个独立的对象,然后通过调用对象的方法来解决问题,通过多个对象的相互配合来实现应用程序的功能——不需要知道怎么做,只需要让对象去做什么。
如:将大象装进冰箱。不需要知道怎么能装进去,只需要知道冰箱装东西共分为三步:打开冰箱门、装东西、关上冰箱门,也就是说把大象装进冰箱和把蚂蚁装进冰箱是一样的,只需要找一台足够大的冰箱就可以了。大象、蚂蚁、冰箱都可以看成是对象,通过它们之间的相互配合来实现装冰箱的功能。
如:乘出租车去机场,需要乘客告诉司机,哪里直行,哪里左转,哪里又有红绿灯吗?需要乘客记住每个城市的机场线路吗?都不需要。到任何城市只需要告诉司机去机场就可以了,由司机、线路和机场三个对象来完成。
面向对象是一种符合人类思维习惯的编程思想。

二、类和对象

从上面例子得知,面向对象编程的核心是对象。
1、对象:一切皆对象,对象用于描述现实中的个体:一本书、一台电脑、一个学生等。
2、类:类是对某一类事物的抽象描述,它用于描述一组对象的共同特征(属性)和行为(动作),就是我们讲的分类:书、电脑、学生等。
3、对象是类的实例:教室是一个类,506,509就是一个对象(个体),学生是一个类,王小明,李华,张大军就是对象。
4、类是对象的抽象(模板),如在教室里的人一定能分为2类:学生和老师。学生类和老师类是怎么来的呢?是因为教室有2种特征和行为不同的人抽象出来的。
image.png

三、面向对象编程步骤

【例3-1-1】王强老师在看到小华在看书,小敏在玩游戏后,说了一句“女生比男生学习用功。”
1、 发现对象
对象:王强,小华,小明。
2、抽象类
王强->教师类
小华、小明->学生类
3、找出类的属性和行为
教师类属性:姓名。行为:说话。
学生类属性:姓名,性别。行为:看书,玩游戏。
4、编写类
修饰符 class 类名{
属性;//就是java中的变量
行为;//就是java中的方法
}
(1)学生类
image.png
(2)教师类
image.png
5、实例化对象
类名 对象名=new 类名();
image.png
6、使用对象的属性和方法
对象名.属性;
对象名.方法();
image.png
【练习】
1、领养一只宠物狗,昵称叫小白,品种为拉不拉多,健康值为80,亲密度为50。
编写宠物狗类(Dog)
狗类属性:昵称(name)、品种(species)、亲密度(love,值为0-100)、健康值(health,值为0-100)
狗类方法:
玩(play):玩一次亲密度+20,健康值-10,健康值小于30,不能再玩了。
喂食(feed):喂食一次健康值+20。
表白(print):说出它的所有属性值,如昵称:小白,亲密度:80等。
2、领养一只企鹅,昵称叫笨笨,性别为Q仔(Q妹),健康值为80,亲密度为50。
编写宠企鹅类(Penguin)
企鹅类属性:昵称(name)、性别(sex)、亲密度(love,值为0-100)、健康值(health,值为0-100)
企鹅类方法:
玩(play):捕鱼一次亲密度-10,健康值-20,健康值小于50,不能再捕鱼了。
喂食(feed):喂食一次健康值+30,亲密度+20。
表白(print):说出它的所有属性值,如昵称:笨笨,亲密度:80等。
3、用面向对象方法实现:一位年青(或者年长)的老师在教授Java课程。

四、编程风格

程序不仅是被计算机读,也要被程序员读,程序除了能正常运行、执行效率高外,编程风格好的程序更容易阅读、修改。程序风格是在实际工程中得到的经验与总结,主要表现在代码简明、逻辑清晰、表达自然、标识能“见名知意”、注释有帮助性等。
1、变量命名
(1)变量名:采用驼峰命名法。变量名由英文单词组成,从第二个单词开始,首字母大写,不要使用拼音,少用下划线和美元符号。如:姓名-name,用户名-userName等。
(2)常量名:基本数据类型的常量名英文单词用全部大写,单词与单词之间用下划线分隔。如:车的颜色(CAR_RED,CAR_WHITE,CAR_BLACK),企鹅的性别(PENGUIN_SEX_MALE,PENGUIN_SEX_FEMALE)等。
(3)方法名:采用采用动宾短语形式和驼峰命名法。如:getName(),setName()。
(4)类(接口)名:由英文单词组成,每个单词的首字母都大写。如:Dog,Student,HelloWorld等。
2、注释
注释是一种帮助手段,帮助别人理解程序。
(1)行注释:// 对每行代码进行注释,但代码本身已讲明的事情不必要重复注释。
(2)段注释:
/
对一段代码注释
/
(3)文档注释
/**
类(接口)注释

  • @version:版本信息
    @date:日期
    @author:作者
    /
    /**
    方法功能描述注释
    @param:参数说明
    @return:返回值
    /
    *【例4-1-1】
    企鹅类。
    image.pngimage.png

    五、访问控制

    针对类、属性和方法,Java提供了4种访问控制权限:
    image.png
    【例5-1-1】学生类
    image.png
    image.png

    六、引用类型

    Java程序在运行时都要开辟空间,任何软件在运行时都要在内存中开辟空间,Java虚拟机运行时也是要开辟空间的,Java内存分为两种,一种是栈内存,另一种就是堆内存。
    1、栈内存:存储的都是局部变量,凡是定义在方法中的都是局部变量(方法外的是全局变量),for循环内部定义的也是局部变量,在{}内定义的变量也是局部变量,变量的作用域在定义的方法或{}内,一旦离开作用域,变量就会被释放,这也就是为什么不同方法内变量可以同名了。栈内存的更新速度很快,因为局部变量的生命周期都很短。
    image.png
    2、堆内存:存储的是数组和对象,凡是new建立的都是在堆中,堆中存放的都是实体(对象),实体用于封装数据,而且是封装多个(实体的多个属性),如果一个数据消失,这个实体不会消失,还可以用,所以堆是不会随时释放的,但是栈不一样,栈里存放的都是单个变量,变量被释放了,那就没有了。堆里的实体虽然不会被释放,但是会被当成垃圾,Java有垃圾回收机制不定时的收取。
    引用类型定义时在栈开辟了一空间,如:Student stu1,stu2;int[] a;
    当使用new 成对象时,在堆里开辟了实体空间如:
    stu1 = new Student();
    a = new int[5];
    内存在存储数据的时候都是通过地址(内存编号)来体现的,以上2句就是将堆内存的地址给了变量stu1和a。
    image.png
    如果执行 stu2=stu1,就是stu2和stu1指向同一个堆内存地址,即stu2和stu1是同一个对象。
    image.png
    大家就应该明白了,将引用类型作为方法的参数,为什么会将值通过参数带回给调用者了,因为引用类型传递给参数是堆内存地址,即数组a传给参数数组b是a数组的地址,或者对象a传给参数对象b是a对象的地址,a和b都指向同一个实体,当b的值发生变化时,就是a的值在改变。image.png
    栈内存存储的是局部变量,而堆内存存储的是实体;
    栈内存的更新速度要快于堆内存,因为局部变量的生命周期很短;
    栈内存存放的变量生命周期一旦结束就会被释放,而堆内存存放的实体会被垃圾回收机制不定时的回收。
    [练习]
    4、编写一个程序,实现银行存、取款和转账功能。
    (1)创建1个账户
    (2)向账户存入1000元
    (3)从账户取出100元
    (4)再创建一个账户,向新账户转账500元
    (5)查看2个账户的余额
    5、小刘双11在淘宝购买了以下商品,请为小刘生成一份订单:
订单号 商品名称 类别 单价 数量 合计
1001 三国演义 书籍 200 4 800
1002 华为手机 电子 7000 1 7000
1003 联想笔记本 电子 5000 3 12000
总计 22800

6、实现将大象装进冰箱程序。
(1)创建大象类:属性有昵称,身长、身高、身宽。
(2)创建冰箱类:属性有型号,长、高、宽。
方法:
开门:输出“打开冰箱门”
装箱:能装进大象返回true,否则返回false。
关门:根据装箱的结果,如果结果为true,输出:“装箱成功,关闭冰箱门”,否则,输出:“装箱失败”。