第三章 面向对象基础
? 对象、消息和类
? 控制和使用对象
? 数组
3.1 对象、消息和类
抽象的计算机世界
class Car {
int color_number;
int door_number;
int speed;
void brake() { … }
void speedUp() {…};
void slowDown() { … }
}
计算机中
的对象的原型
现实生活
中的对象
? 数据抽象 (ADT)
对象的基本组成
? 实例变量:对象拥有什么
样的性质和特征?代表了
对象的状态。
? 方法:对象能做什么事?
是对象的功能单元。
对象 B
对象 A
message
什么是消息?
软件对象通过相互间传递消息来相互作用和
通信
一个消息由三部分组成,
1,接受消息的对象
2,要完成方法的名字
3,方法需要的参数
System.out.println(…..);
1 2 3
? 对象的例子
购物车
contents
addToCart()
remove()
checkOut()
Dog
size
breed
name
bark()
eat()
instance
variable
(state)
methods
(behavior)
instance
variables
methods
对象的类型 ----类
? 什么是类?
? 类不是对象,类是用于创建对象的 。
? 类是描述对象的“基本原型”,它定义一种对象所能拥有的
数据和能完成的操作,在面向对象的程序设计中,类是程序的
基本单元 。 variables
methods
从一个类可以产生
很多对象,这些对
象都属于这个类,
所有对象也称为 该
类的实例。
建立、使用第一个对象
? 需要两个类,
? 实际的类,用来创建具体对象
? 测试类( tester),拥有 main()方法,在这里创建
并访问对象。
1 编写实际的类
class Dog {
int size;
String breed;
String name;
void bark() {
System.out.println(“Ruff!”);
}
}
instance variables
a method
2 编写测试类
class DogTestDrive {
public static void main(String[] args) {
//Dog class test code
}
}
只有一个 main
方法
3 在测试类内,创建一个对象,并访问该对象的变量和方法。
class DogTestDrive {
public static void main(String[] args) {
Dog d=new Dog();
d.size=40;
d.bark();
}
}
创建一个 Dog对象
使用点运算符设置 Dog的大小
并调用它的 bark()方法 点运算符
3.2 控制和使用对象
? 与基本类型的变量不同,并不存在“对象变量”。

int a=20;

a++;
a(20)
内存

a(21)
内存
通过名字 a直接控制
变量(它所处的内
存)。
Dog d= new Dog();
d.bark();
变量 d是一个对象引用变量
堆内存
Dog
。。
d
?通过“对象引用”变量 (reference)可
以操纵对象。
byte
8
short
16
int
32
long
64
reference
引用本身也是值,它是可以访问对象
的方式的位码。
?一个对象引用变量存储“一种访问该对象的方式”的位
码。
对象创建的步骤
Dog myDog = new Dog();
1 2 3
1 声明一个引用变量
Dog myDog = new Dog();
告诉虚拟机为该变量分配空间,并命名为
myDog。该变量始终是 Dog类型的。
2 创建一个对象
Dog myDog=new Dog();
告诉虚拟机在堆中为新的 Dog对象分配空间
3 将该对象与引用连接起来。
Dog myDog=new Dog();
现在可以通过这个引用 myDog远程控制该 Dog对象
在堆中的对象
Book b= new Book();
Book c= new Book();
b
1
2
Book 对象
Book 对象
c
垃圾回收的

1
References,2
Objects,2
b
1
2
Book 对象
Book 对象
c
垃圾回收的

1
d
Book d= c ;
d并不引入任何新的对
象,只是把 c的值复制给
d,使得 c,d同时控制
同一个 book对象。
References,3
Objects,2
b
1
2
Book 对象
Book 对象
c
1
d
c = b;
同上,变量 b的值复制给 c,
现在 c与 b都指向了同一个
对象。
References,3
Objects,2
对象的存活和消亡
b
1
2
Book 对象
Book 对象
c
垃圾回收的

1 Book b= new Book();
Book c= new Book();
现在两个 Book对象在堆中
开始各自的生命期。
Active References,2
Reachable Objects,2
b
1
2
Book 对象
Book 对象
c
垃圾回收的

1
b = c;
现在对象 1被废弃,不
再有任何它的引用存在,
它将被回收。
Active References,2
Reachable Objects,1
b
1
2
Book 对象
Book 对象
c
垃圾回收的

1
c = null ;
null引用
null引用不再引用任何对
象。
当然 c仍然是引用变量,
仍然可以通过被赋值,
继续引用其他对象。
3.3 数组
? 在 Java里,数组也是对象
int[] nums;
nums=new int[7];
nums[0]=6;
nums[1]=22;
…,
1 声明一个 int数组变量,它是对数组对象的引用
2 创建一个数组对象,长度为 7,将控制赋值给变量 nums
3 为数组中的每个元素赋值
? 数组的元素由变量组成。
nums
int[]
6 22
整型数组可以存放整型的元素
? 对象数组--元素不是简单数据类型
Dog[] pets;
pets= new Dog[7];
pets[0]= new Dog();
pets[1]= new Dog();

1 声明一个 Dog数组变量
2 创建一个数组对象,长度为 7,将控制赋值给变量 pets
3 注意!每个元素只是一个 Dog引用变量,它的对象还没有创建
? 数组初始化
在数组定义时,可以进行初始化;也可以不进行
int [] a;
char[] b;
double[] c;
- a
- b
- c
表示值未定义
? 也可以不使用 new运算符进行初始化,方法是列举出数组的
元素,称为静态初始化(或显式初始化)。
int [] smallPrimes={2,3,5,7,11,13};
System.out.println(smallPrimes.length);
? 可以对数组进行重新初始化,而不必创建一个新的变量。
smallPrimes=new int[] {17,19,23,29,31,37};
相当于
int[] temp=new int[] {17,19,23,29,31,37};
smallPrimes=temp;
? 数组初始化 — 例
int[] number=new int[3];//变量 number引用了一个 int类型的数组。
double [] value=new double[3];//…
String[] str=new String[3];//…,数组元素是字符串对象
0 0 0 number
0.0 value 0.0 0.0
null null null str
在初始化时,如果没有指定数组元素的值,则所有的元素采用 默认值 初始化




访问数组元素
? 引用单个数组元素的方式是下标法或索引法。
? 在数组中每个元素都有自己的下标,首下标
从 0开始。
? 访问方式,
a[0]=0;
a[1]=1;

a[i+3]=4; 下标可以是非负整数,或者非负整数表达 式。
? 与其它语言不同,Java自动检查下标是否合法,如果认为某
下标非法,将生成一个 IndexOutOfBoundsException的异常,
阻止程序继续执行。
int [] a=new int[100];
a[-1]=0;//illegal
a[100]=0;//illegal
元素访问 ----为所有元素赋值
? 一旦创建了数组,其大小是不可以改变的。
利用”数组名,length”可以知道数组的大小。
? 利用循环语句为数组元素赋值,注意数组下
标从 0开始。
for(int i=0; i<a.length; i++)
a[i]=i;
? 数组的复制
如果把一个数组变量赋值给另外一个数组
变量,将使双方都指向同一组数据。
int[] d={1,2,3};
int [] e={4,5,6};
d=e;//d is {4,5,6}
问题,下面的程序有错吗
class Books {
String title;
}
class BooksTest{
public static void main(String[] args){
Books[] myBooks=new Books[2];
myBooks[0].title=,Java Cookbook”;
myBooks[1].title=,Thinking in Java”;
int i=0;
while(i<myBooks.length){
System.out.println(myBooks[i].title);
i++;
}
}
1
2
class Books {
String name;
public static void main(String[] args){
Books[] b=new Books[3];
int z=0;
while(z<4){
z=z+1;
b[z]=new Books();
b[z].name=“bile”;
if(z==1) b[z].name=“ff”;
if(z==2) b[z].name=“kk”;
System.out.println(b[z].name);
}
}
}
class Books {
int id=0;
public static void main(String[] args){
Books[] b=new Books[5];
int z=0;
while(z<3){
b[z]=new Books();
b[z].id=z;
z=z+1;
}
b[3]=b[1];
b[4]=b[1];
b[3]=null;
b[4]=b[0];
b[0]=b[3];
b[3]=b[2];
b[2]=b[0];
}
}
3 画出程序中元素与对
象之间的对应关系,
有的引用是空的,有
的对象被多个引用关
联。