第3章 Java类和对象
class Manager extends Employee { private double bonus;
public void setBonus(double b) { bonus = b; } public double getSalary(){ return salary + bonus; }
类是对象创建的模板。
任何一个对象都是属于某一个类的。
使用对象之前必须先创建对象。即,先进行声明, 再实例化对象,之后就可以通过对象去调用成员变 量或方法了。
要获得一个类的对象需要两步:
第一步,对象的声明。
第二步,为对象分配内存。通过new运算符调用构造方法创 建对象实体,并把该对象的引用赋给该变量。
}
47
需要强调的是,在子类中可以增加变量,增加方法 或者覆盖方法,但是绝对不会删除继承的任何变量 和方法。 也就是说,上面虽然覆盖了原来的方法,只是调用 时调用的新方法,原来继承过来的旧方法还是有的。
48
多态(polymorphism)提高了程序可扩充性,调用 多态性行为的软件传送给对象的消息(即方法调用) 与对象的类型无关,因此能响应已有信息的新类型, 可以直接加入系统而不用修改基本系统。 在运行时自动选择正确的方法进行调用称为“动态绑 定”(dynamic binding)。
20
成员变量含有自带的初值,根据不同类型有所不同, int为0,double为0.0,bealoon为false,复合数 据类型为null。
成员变量在整个类内都有效,其有效性与它在类体 中书写的先后位置无关。
代码清单3-2
22
代码清单3-3
23
实例变量属于对象,它描述了对象的属性 局部变量只在方法内有效。
17
在定义和使用方法时,需要注意以下几点:
方法是一个功能模块,类似C中的函数; 方法和实例变量都必须定义在类内,方法是类的功能接 口; 定义方法的原则:方法应当只执行单一的任务,并且方
法名能有效地表达该任务;
方法的返回值类型、方法名和参数表共同称之为方法的
特征。
18
调用方法的格式为: 对象引用.方法名(参数表);
◦ 形参在整个方法内有效; ◦ 方法内的局部变量从声明它的位置开始有效。
局部变量在使用前必须赋初值(没有默认值)。 如果局部变量与实例变量同名,则实例变量在该方 法内被隐藏,用this来引用。
类方法不仅可以被该类创建的任何对象调用执行, 也可以直接通过类名调用。
JAVA规定:
类方法中出现的成员变量必须是类变量。
[public] class 类名
{ [成员变量] [构造方法] [方法]
成员变量反映类的状态、属 性和特征,成员方法 Point { int x, y; void init(int a, int b) { x = a; y = b; } }
10
其中,访问控制符可以是public 、protected、 private、默认(不写)。
30
注意: 1.构造方法无返回类型。 2.构造方法只能被new运算符调用。
new 构造方法名( [参数列表] );
默认的构造方法无参数, 方法体当中也不执行具 体操作,形式如下, 构造方法名() { }
注意,仅仅返回类型的不同或访问控制权限不同, 不能构成重载。
代码清单3-9
38
构造函数也能够重载。 代码清单3-12
39
重载是编译时多态性,即在编译时就能够确定对象 调用的是同名方法中哪一个。依据正是实参的类型 与个数。 但要避免重载出现歧义。
继承是一种由已有的类创建新类的机制。利用继承, 可以使子类得到父类的某些成员。 继承是实现软件可重用性的一种重要方式,继承增 强了软件的可扩充性,提高了软件的可维护性。 JAVA中类的继承是单重继承,即每个子类只有一个 直接父类。
15
JAVA的类中可以包括两种成员:实例成员和类成员。
通过对象去访问实例成员变量和调用实例方法。 通过类名可以直接访问类成员变量和调用类成员方法。
3.2.1 方法 方法定义的一般格式如下: [修饰符] 返回类型 方法名( [形参列表] ) { //方法体,由若干的语句组成 } 其中的修饰符可以是public 、protected、 private、默认(不写),用于定义它的访问控制 权限,还可以是static 、final等。
JAVA中定义,Object类是所有类的父类。
子类定义的格式: [访问权限控制符] class 子类名 extends 父类名 [implements 接口列表] { //类体部分 }
继承的原则: ①子类继承父类的除private以外的成员,包括实例 成员和static成员。 ②子类继承不了父类的构造方法。 ③子类可以创建自己的成员。 ④子类可以重定义继承得到的成员。
例如,
◦ Point mypoint = new Point(); ◦ mypoint.init(10, 20);
19
成员变量,即我们所说的属性。它的定义的一般格 式如下: [修饰符] 类型 变量名; 其中:
◦ 类型可以是基本数据类型(primitive types),也可以是 复合数据类型(reference types)。 ◦ 修饰符可以是:public 、protected、private、默认(不 写),static,final。
如果类中没有构造方法, 系统会提供默认的构造 方法 ;
如果类中定义了一个或 多个构造方法,那么 Java不再提供默认构造 方法。
32
33
见代码清单3-8
34
强调两点:
一旦定义了构造函数,Java就不能再调用系统缺省构造函 数; 当有多个构造函数时,通过构造函数参数的类型和个数来 决定调用哪个。
这就引出了一个概念——上转型对象。Mammals 类的对象doudou是子类Cat的上转型对象, Mammals类的对象yinuo是子类Dog的上转型对象。 上转型对象由父类声明,实体由子类创建。
程序的运行结果应该是怎样的?
那么这样做有什么意义呢?因为子类是对父类的一 个改进和扩充,所以一般子类在功能上较父类更强 大,属性较父类更独特,定义一个父类类型的引用 指向一个子类的对象既可以使用子类强大的功能, 又可以抽取父类的共性。 如代码清单3-14所示
6
类与类之间最常见的关联有:
依赖(“use-a”)
聚合(“has-a”) 继承(“is-a”)
7
类是组成JAVA程序的基本要素。一个java程序由 若干个类组成。 类的定义包括两部分:类声明和类体。基本格式 如下:
class 类名 { 类体部分; }
8
在基本格式的基础之上,一般情况下,类的定义 格式如下:
对象名=new 构造方法名( [参数列表] );
类型 对象名;
Point mypoint = new Point(); 或 Point mypoint; // 声明对象的引用 mypoint = new Point(); // 创建Point类的对象
12
如声明Point类型的对象:
13
14
◦ 所以类方法中不能操作实例成员变量这是因为:
在类创建对象之前,实例成员变量还没有分配内存; 类方法中可不能直接调用其它实例方法,这是因为在类创建 对象前,实例方法还没有分配入口地址。
当声明一个成员变量时,有static标识的是类成 员变量,没有的是实例成员变量。例如, class Takecare { static int x; //类成员变量 int y; //实例成员变量 }
35
多态性提供了类中方法执行的多样性,它有两种 表现形式:重载(overload)和重写 (override)。
36
一个类中,如果有许多同名的方法带有不同的参数列表, 称为方法的重载(overload)。
方法的重载必须满足以下条件:
(1)在同一个类当中定义的方法; (2)方法名必须相同; (3)参数列表必须不同(参数类型、参数个数)。
1
类和对象
对象的成员
类的成员 构造函数
重载
类的继承 方法覆盖
多态性与动态绑定
Java访问权限
2
3.1.1 面向对象程序设计概述
◦ Java作为90年代新出现的面向对象的编程语言,其语言 特点充分体现出面向对象的思想。
◦ 面向对象程序设计(简称OOP)是当今主流的程序设计 范型,它已经取代了70年代的“结构化”过程化程序设计 开发技术。
先看一个Employee类及其子类Manager :
class Employee { class Manager extends Employee { private String name; public void setBonus(double b) private double salary; { private int id; bonus = b; public String getName() { } return name; private double bonus; } } public double getSalary() { return salary; 从表面上看,Manager类只有一个方法 } public int getId() { 和一个变量,但是,它已经继承了 return id; Employee类的所有变量和方法。现在的 } Manager类包含4个变量:name, }