面向对象程序设计简称OOP(Object Oriented Programming)
面向对象思想概述
面向对象是基于面向过程的编程思想
面向对象思想特点
是一种更符合我们思想习惯的思想
可以将复杂的事情简单化
举例:
面向过程
吃饭:去菜市场 --> 挑菜 --> 讨价还价 --> 洗菜 --> 切菜 --> 炒菜 --> 盛菜 --> 吃饭
面向对象:
吃饭:下馆子 --> 服务员(点单) --> 厨师(炒菜) --> 服务员(上次) --> 吃饭
面向过程:
洗衣服: 把脏衣服放进桶里面 --> 加上洗衣液 --> 泡上10分钟 --> 搓上半小时 --> 漂洗衣服 --> 拧干 --> 晾衣服
面向对象:
洗衣服: 把脏衣服放进洗衣机 --> 洗衣机(洗衣服) --> 晾衣服
面向过程:
自己亲力亲为
面向对象:
把专业的事情交给专业的人做
客观世界的组成 (Object)
对象;
对象之间的相互关系;
对象:对象是系统中用来描述客观事物的一个实体,它是构成系统的一个基本单位。
对象:
属性
功能
举例:
小花猫:
属性:颜色,大小,四条腿,两只眼睛,一张嘴 (静态, 名词)
功能:能抓老鼠,能撒娇卖萌 (动态, 动词)
汽车:
属性:品牌, 颜色, 价格, 油耗,排量...
功能:载人, 启动, 转向, 加速, 减速, 刹车, 打开车灯, 关闭车灯...
类:
是同种对象的集合与抽象
类与对象的关系
类:(抽象) 对象设计的蓝图
对象:根据蓝图设计的一个具体的对象
面向过程:
经典语言:c
关注:操作(动词)
程序 = 算法 + 数据结构
面向对象:
经典语言:java
关注:对象(名词)
程序 = 对象 + 消息
现实中的事物:学生
属性 学生的身高,体重等
行为 学生可以学习,吃饭等
Java中用class描述事物也是如此
成员变量 就是事物的属性
成员方法 就是事物的行为
a:成员变量 和以前定义变量是一样的,只不过位置发生了改变。在类中,方法外。
b:成员方法 和以前定义方法是一样的,只不过把static去掉,后面在详细讲解static的作用。
学生:
属性: 学号, 姓名, 性别, 年龄...
行为:学习, 吃饭, 睡觉...
Student:
成员变量:id, name, gender, age...
成员方法:study(), eat(), sleep()...
如何根据类去创建对象?
类名 对象名 = new 类名();
对象名.成员变量 // 访问该对象的某个属性
对象名.成员方法 // 要某个对象帮你做什么事情
成员变量和局部变量的区别
1. 类中位置不同
局部变量:在方法内或者方法声明上
成员变量:类中方法外
2. 内存中位置不一样
局部变量:栈
成员变量:堆
3. 生命周期不同
局部变量:随着方法的入栈而开始,随着方法的出栈而消亡
成员变量:随着对象的创建而开始,随着对象的消亡而消亡
4. 初始值不同
局部变量:没有默认初始值,必须声明赋值才能使用
成员变量:有初始值
参数传递问题:
1. 基本类型作为形式参数, 只要传递值就可以了
2. 引用数据类型作为形式参数, 需要传递对象
匿名对象的两种使用情况
1. 对象只使用一次
2. 作为实际参数传递
封装(encapsulation)
面向对象三大特性:封装,继承,多态
封装:
a. 封装是一种信息隐藏技术。
b. 是指将数据和基于数据的操作封装在一起(类),数据被保护在内部,
系统的其他部分只有通过在数据外面的被授权的操作才能够进行交互,
目的在于将类使用者class user和类设计者class creator分开。
c. 在面向对象的编程中,用类来封装相关的数据和方法,保证了数据的安全和系统的严密性。
封装的优点:
a. 隐藏类的实现细节,实现了信息的隐藏及安全性;
b. 提高了程序的模块化,且易于维护;
c. 具体实现是编写该类的人控制的,让使用者只能通过事先定制好的方法来访问数据,
实现者可以方便地加入控制逻辑,限制对属性的不合理操作
private 就是封装技术的一种
包, 类也是封装技术的一种
数据验证问题:
private关键字:
是一个权限修饰符。
可以修饰成员(成员变量和成员方法)
被private修饰的成员只在本类中才能访问。
private最常见的应用:
把成员变量用private修饰
提供对应的getXxx()/setXxx()方法 // getter, setter
一个标准的案例的使用
this:代表所在类的对象引用
this: 方法被哪个对象调用,this就代表那个对象
什么时候使用this呢?
局部变量隐藏成员变量
其他用法后面和super一起讲解
类的使用者:普通程序员
类的设计者:Sun公司的员工
构造方法:
(1)作用:
给对象的数据进行初始化
(2)格式:
a. 方法名与类名相同
b. 没有返回值类型,连void都没有
c. 没有具体的返回值
(3)构造方法的注意事项
a. 没有构造构造方法,系统会提供一个无参构造方法
b. 如果自己写了构造方法,系统将不再提供无参的构造方法
(推荐永远自己写一个无参的构造方法)
(4)给成员变量赋值的方式
a. 无参构造 + setter()
b. 有参构造
标准案例:
1. 将成员变量私有化
2. 提供一个无参和所有参数的构造方法
3. 提供getter & setter
4. 成员方法
代码:Student s = new Student();做了哪些事情?
a. 加载字节码文件到内存
b. 在栈上为引用变量s开辟空间
c. 在堆上为对象开辟空间
d. 默认初始化
e. 显示初始换
f. 执行构造方法
g. 把对象的地址赋值给引用变量
面向对象的练习题
(1)Demo类有求和方法,Test类进行测试。
什么时候定义成员变量?
当该变量是用来描述一个类的时候。
(2)长方形案例
(3)员工案例
(4) MyMath 案例(自己提供加减乘除并测试)
如何阻止创建对象?
把构造方法私有化,private MyMath() { }
static关键字
(1)静态的意思。可以修饰成员变量和成员方法。
(2)静态的特点:
a. 随着类的加载而嘉爱
b. 优先于对象存在
c. 被所有对象共享
d. 可以通过类名调用
(3)静态的内存图
静态的内容在方法区的静态区
(4)静态的注意事项;
静态方法不能使用this关键字
静态方法只能访问静态的东西
(5)静态变量和成员变量的区别
a. 所属不同
静态变量:类
成员变量:对象
b. 内存不同
静态变量:方法区的静态区
成员变量:堆
c. 声明周期不同
静态变量:随着类的加载而开始,随着的类的消亡而消亡
成员变量:随着对象的创建而开始, 随着对象的消亡而消亡
d. 调用方式不同
静态变量:静态变量可以通过类名和对象调用,推荐使用类名调用
成员变量:只能通过对象名调用
main方法详解
public: main()是被JVM调用,所有访问权限得最大
static: main()方法是程序的入口, 在调用之前还没有对象存在
void:把值返回给JVM没有什么意义,所以是void
main: 只是一个约定俗成的名字
String[] args: 在JDK1.5之前用来接收键盘录入的数据的
java HelloWorld hello world java