Java入门(九)——OO(面对对象)
目录
面向对象(OO)
面向过程与面向对象的区别
* 面向过程:
- 实现具体过程,因果关系
- 优点:业务逻辑比较简单的程序可以快速开发,前期投入成本较低
- 缺点:难以解决复杂的业务逻辑,元素之间“耦合度”(对象之间的依赖性)非常高,扩展力差,难以独立,无法达到组件复合。
* 面向对象:
- 主要关注对象【独立体】能完成哪些功能,更符合人的思维方式
- 优点:耦合度低,扩展能力强,容易解决复杂业务,组件复用性强
- 缺点:前期投入成本高,需要进行独立体的抽取,大量的系统分析与设计
- C语言纯面向过程、C++半面向对象、Java纯面向对象
面对对象的三大特征
- 封装
- 继承
- 多态
生命周期
- 面向对象的分析:OOA
- 面向对象的设计:OOD
- 面向对象的编程:OOP
类与对象
- 类:模板、概念,大脑抽象的结果。代表一类事物。对共同特征进行总结。
- 对象:实际存在的个体。目前在使用new运算符在堆内存中开辟内存空间。
- 引用:是一个变量,不一定是局部变量,还可能是成员变量。引用保存了内存地址,指向堆内存当中的对象。
开发过程
- 观察现实世界,寻找对象
- 寻找共同特征
- 形成一个模板(类)
- java表达类
- 类的定义
- 创建对象
- 对象协作形成系统
类的定义
- 语法结构:
[修饰符列表] class 类名 {
属性;//描述对象的状态信息
方法;//描述对象的动作信息
}
- 当状态和动作具体到某一个对象之后,可能存在数据差异
- 所有访问实例相关的数据,都需要通过“引用.”的方式访问,因为只有通过引用才能找到对象
- 只有一个空的引用,访问对象的实例相关的数据会出现空指针异常
范例代码
//定义一个公开的类
//Student是一个类,代表所有的学生
//访问类中的属性或方法,需要建立对象进行访问
class Student {
//属性通常采用变量的方式来定义
//状态【属性】
//不创建对象,变量的内存空间是不存在的
int no;//学号
String name;//姓名
boolean sex;//性别
int age;//年龄
String address;//地址
//动作【方法】
public static void a() {
System.out.println("永远18岁!!!");
}
}
public class OO {
public static void main(String[] args) {
int i =10;//局部变量
//通过一个类可以实例化N个对象
//实例化对象语法:new 类名();
//new运算符作用是创建对象,在JVM堆内存当中开辟新的内存空间
/*
* 方法区内存:在类加载的时候,class字节码代码片段被加载到该内存空间中
* 栈内存(局部变量):方法代码片段执行的时候,会给方法分配内存空间,在栈内存中压栈
* 堆内存:new的对象在堆内存中储存
*/
Student s = new Student();
//Student是一个引用类型
//new Student() 是一个学生变量
//Student s 是一个局部变量
/*
* 访问实际变量的语法格式:
读取数据:引用.变量名
修改数据:引用.变量名 = 值
*/
int stuNo=s.no;
String stuName=s.name;
int stuAge=s.age;
boolean stuSex=s.sex;
String stuAddress=s.address;
System.out.println("学号(未赋值):"+stuNo);
System.out.println("名字(未赋值):"+s.name);
System.out.println("------------------------------");
stuNo=29;
stuName="PDD";
stuAge=18;
stuSex=true;
stuAddress="福建";
System.out.println("学号:"+stuNo);
System.out.println("姓名:"+stuName);
System.out.println("年龄:"+stuAge);
System.out.println("性别:"+stuSex);
System.out.println("地址:"+stuAddress);
Student.a();//方法调用
}
}
/*
- 局部变量在栈内存中储存
- 成员变量中实例变量在堆内存的java对象内存内部存储
*/
//分析图见笔记中 JVM内存结构.jpg