面向过程与面向对象
何谓“面向对象”的编程思想?
Java类及类的成员
对象的创建和使用
匿名对象
类的成员属性

面向过程
(POP)
与 面向对象
(OOP)
- 二者都是一种思想,面向对象是相对于面向过程而言的。面向过程,强调的是功能行为,以函数为最小单位,考虑怎么做。面向对象,将功能封装进对象,强调具备了功能的对象,以类/对象为最小单位,考虑谁来做。
- 面向对象更加强调运用人类在日常的思维逻辑中采用的思想方法与原则,如抽象、分类、继承、聚合、多态等。
面向对象的三大特征
- 封装 (Encapsulation)
- 继承 (Inheritance)
- 多态 (Polymorphism)
面向对象:
Object Oriented Programming
面向过程:
Procedure Oriented Programming
例子:人把大象装进冰箱

面向对象的思想概述
程序员从面向过程的
执行者
转化成了面向对象的
指挥者
面向对象分析方法分析问题的思路和步骤:
- 根据问题需要,选择问题所针对的现实世界中的实体。
- 从实体中寻找解决问题相关的属性和功能,这些属性和功能就形成了概念世界中的类。
- 把抽象的实体用计算机语言进行描述,形成计算机世界中类的定义。即借助某种程序语言,把类构造成计算机能够识别和处理的数据结构。
- 将类实例化成计算机世界中的对象。对象是计算机世界中解决问题的最终工具。
类
(Class)
和
对象
(Object)
是面向对象的核心概念。
- 类是对一类事物的描述,是抽象的、概念上的定义
- 对象是实际存在的该类事物的每个个体,因而也称为实例(instance)。
“万事万物皆对象”
- 可以理解为:类 = 抽象概念的人;对象 = 实实在在的某个人
- 面向对象程序设计的重点是类的设计
- 类的设计,其实就是类的成员的设计
常见的类的成员有:
属 性
:对应类中的成员变量
行 为
:对应类中的成员方法


类的语法格式
修饰符
class
类名
{
属性声明;
方法声明;
}
说明:
修饰符
public
:类可以被任意访问
类的正文要用{ }括起来
示例代码:
public class Person {
private int age; //声明私有变量 age
public void showAge(int i) { //声明方法showAge( )
age = i;
}
}
创建Java自定义类
步骤:
- 定义类(考虑修饰符、类名)
- 编写类的属性(考虑修饰符、属性类型、属性名、初始化值)
- 编写类的方法(考虑修饰符、返回值类型、方法名、形参等)
- 创建对象语法: 类名 对象名 = new 类名();
- 使用“对象名.对象成员”的方式访问对象成员(包括属性和方法)
示例代码:
public class Test {
public static void main(String[] args) {
//创建对象
Animal xb = new Animal();
xb.legs = 4;//访问属性
System.out.println(xb.legs);
xb.eat();//访问方法
xb.move();//访问方法
}
}
class Animal {
public int legs;
public void eat() {
System.out.println("Eating.");
}
public void move() {
System.out.println("Move.");
}
}
示例代码:
//说明:如果创建了一个类的多个对象,对于类中定义的属性,
//每个对象都拥有各自的一套副本,且互不干扰。
public class Test {
public static void main(String[] args) {
Animal xb = new Animal();
Animal xh = new Animal();
xb.legs = 4;
xh.legs = 0;
System.out.println(xb.legs); // 4
System.out.println(xh.legs); // 0
xb.legs = 2;
System.out.println(xb.legs); // 2
System.out.println(xh.legs); // 0
}
}
class Animal {
public int legs;
public void eat() {
System.out.println("Eating.");
}
public void move() {
System.out.println("Move.");
}
}
类的访问机制:
- 在一个类中的访问机制:类中的方法可以直接访问类中的成员变量。(例外:static方法访问非static,编译不通过。)
- 在不同类中的访问机制:先创建要访问类的对象,再用对象访问类中定义的成员。
对象的产生
Person p1 = new Person();
执行完后的内存状态。其中类定义如下:
class Person {
int age;
void shout() {
System.out.println("oh,my god! I am " + age);
}
}
对象的使用
public class Test {
public static void main(String[] args) {
Person p1 = new Person();
Person p2 = new Person();
p1.age = -30;
p1.shout();
p2.shout();
}
}
class Person {
int age;
void shout() {
System.out.println("oh,my god! I am " + age);
}
}
运行结果:
程序运行的内存布局如下图

对象的生命周期

- 我们也可以不定义对象的句柄,而直接调用这个对象的方法。这样的对象叫做匿名对象。 如:new Person().shout();
- 使用情况
如果对一个对象只需要进行一次方法调用,那么就可以使用匿名对象。
我们经常将匿名对象作为实参传递给一个方法调用。
语法格式:
修饰符
数据类型
属性名
=
初始化值
;
说明
1:
修饰符
- 常用的权限修饰符有:private、缺省、protected、public
- 其他修饰符:static、final (暂不考虑)
说明
2
:数据类型
- 任何基本数据类型(如int、Boolean) 或 任何引用数据类型。
说明
3
:属性名
- 属于标识符,符合命名规则和规范即可。
示例代码:
public class Person {
private int age; //声明private变量 age
public String name = "Lila"; //声明public变量 name
}
变量的分类:成员变量与局部变量
- 在方法体外,类体内声明的变量称为成员变量。
- 在方法体内部声明的变量称为局部变量。

注意:二者在初始化值方面的异同
:
- 同:都有生命周期
- 异:局部变量除形参外,均需显式初始化
成员变量(属性)和局部变量的区别?

成员变量vs局部变量的内存位置
示例代码:
public class Test {
public static void main(String[] args) {
Person p = new Person();
p.show("USA");
}
}
class Person {//人类
//1.属性
String name;//姓名
int age = 1;//年龄
boolean isMale;//是否是男性
public void show(String nation) {
//nation:局部变量
String color;//color:局部变量
color = "yellow";
}
}
对象属性的默认初始化赋值
当一个对象被创建时,会对其中各种类型的
成员变量
自动进行初始化赋值。除了基本数据类型之外的变量类型都是引用类型
。
