5、面向对象的设计思想
一 面向对象设计思想
1.1 面向过程的设计思想与面向对象的设计思想
例如:我要去*
- 面向过程:
-
- 我开车,我挂挡,我踩油门,我过河北,我过陕西...
- 面向对象:
-
- 我命令车去*
- 车怎么去不关我事
-
- 信息封装在这这个类的内部
- 我不用去了解车整个开动的过程
面向对象可以对代码重复的使用,比如上面我要去*,先造一个车的类,稍后在去*的时候直接调用车的类,或者需要使用车的是时候,直接调用这个类。这样实现了代码的重用
1.1.1 面向对象的设计思想
- 面向对象的基本思想是,从现实世界中客观存在的事物出发来构造软件系统,并在系统的构造中尽可能运用人类的自然思维方式
- 面向对象更加强调人类在日常的思维逻辑中经常采用的思想方法与原则,如抽象、分类、继承、聚合、多态等
1.1.2 对象和类的概念
- 对象用计算机语言对问题域中事物的描述,对象通过“属性(attribute)”和“方法(method)”来分别对应事物所具有的静态属性和动态属性。属性即成员变量
- 类是用于描述同一类型的对象的一个抽象的概念,类中定义了这一类对象所因具有的静态和动态属性
- 类可以看成一类对象的模板,对象可以看成该类的一个具体实例
1.1.3 继承关系
继承关系表示:XX是一种XX
如下图所示:
1.1.4 聚合关系
聚合表示一个整个和一个个体之间的关系。
可以理解为:XX是XX的一部分
如下所示:
1.1.5 实现关系
如下图所示,稍后详细介绍
1.1.6 多态
如下图所示,稍后学习的时候详细介绍
1.2 面向对象总结
面向对象不应该考虑第一步做什么,第二部做什么,而是应该考虑:
- 作为这个问题来说,在这个问题里面应该有哪些类、哪些对象
- 再考虑这些类、对象应该有哪些属性和方法
- 在考虑类和类之间有什么关系
1.2.1 练习
如下图所示,简单总结方法与类(对象)、属性
- 类(对象):旅行社、旅客、机票等
- 属性:
-
- 机票:时间、班次、价格等
- 方法:预定机票、记账等
可以方法即动态的东西,类、对象、属性等属于静态的东西,名词
1.3 Java与面向对象
必须首先定义类,才会有对象
- 对象是Java程序的核心,在Java程序中“万事万物皆对象”
- 对象可以看成是静态属性(成员变量)和动态属性(方法)的封装体
- 类是用来创建同一类型的对象的“模板”,在一个类中定义了该类对象所应具有的成员变量以及方法
- JDK提供了很多类供编程人员使用,编程人员也可以定义自己的类
二 Java中面向对象与内存分析
2.1 Java类的定义
使用class关键字定义类,例如
class Person {
private int id;
private int age = 20;
//方法定义
public int getAge() {return age;}
public void setAge(int i) {age = i;}
public int getId() {return id;}
}
- 类的定义主要有两方面组成:成员变量(属性)和方法
- 声明成员变量的格式为:
-
- [<modifiers>] type <attr_name> [=defaultValue]。例如
-
- private int id; private int age = 20;
- 声明方法是格式为:
-
- <modifiers> <modifiers> <return_type> <name>([<argu_list>]){<statements>}。例如:
-
- public int getAge() {return age;}
2.1.1 成员变量
- 成员变量可以是Java语言中任何一种数据类型(包括基本类型和引用类型)
- 在定义成员变量时可以对其初始化。如果不对其初始化,Java使用默认的值对其初始化
- 成员变量的取值范围为整个类体
成员变量类型及其默认取值表
2.1.2 Java面向对象基本概念:引用
- Java语言中除基本类型之外的变量类型都称为引用类型
- Java中的对象是通过引用对其操作的
例如:
/*
* 声明了一个String类型的引用变量,
* 但并没有使它指向一个对象
*/
String s;
/*
* 使用new语句创建了一个String
* 类型的对象并用s指向它
* 以后可以通过s完成对其的操作
*/
s = new String("hello world!");
如何在内存中区分类和对象?
类是静态的概念,代码区对象是new出来的,位于对内存,类的每个成员变量在不同的对象中都有不同的值(除了静态变量),而方法只有一份,执行的时候才占用内存。
如下图所示
首先引用一个变量,String s;s没有任何值,默认为null
将s指向new出来的String类型的对象
2.1.2.1 对象的创建和使用
- 必须使用new关键字创建对象
- 使用对象(引用).成员变量或引用对象的成员变量
- 使用对象(引用).方法(参数列表)来调用对象的方法
- 同一类的每个对象有不同的成员变量存储空间
- 同一类的每个对象共享该类的方法
类和对象的关系
有一个类,名字为C;其中i和j为其属性(成员变量)
C c1定义了一个局部变量,局部变量存放在stack中,而局部变量c1指向一个被引用的对象C,而被引用(new)出来的部分是在heap内存中。通过c1可以找到C对象的内容
2.2 构造方法
- 使用new + 构造方法创建一个新的对象
- 构造函数是定义在Java类中的一个用来初始化对象的函数
- 构造函数与类同名且没有返回值
- 例如:
public class Person {
int id;
int age;
Person(int _id, int _age) {
id = _id;
age = _age;
}
public static void main(String[] args) {
Person tom = new Person(1,25);
}
}
在内存中,如下图所示:
程序找到入口(main()方法),首先由一个局部变量tom,局部变量存在于栈(Stack)内存中,而tom引用(new)一个对象Person,Person中有一个构造函数,函数有形参_id和_age,在main()方法调用的时候传递的值为_id为1,_age为25
引用的Person在堆(Heap)内存中,形参_id赋值给对象id,_age赋值给对象age,此时Stack中的形参被回收。tom指向了对象id和age
- 当没有指定构造函数的时候,编译器为类自动添加形如
-
- 类名() {}的构造函数
约定俗成的命名规则
- 类名的首字母大写
- 变量名和方法名的首字母小写
- 运用驼峰标识