Java语言程序设计(基础篇) 第九章 对象和类

第九章 对象和类

  9.1 引言

  面向对象编程可以有效地帮助开发大规模的软件以及图形用户界面。

  

  9.2 为对象定义类

  1.类为对象定义属性和行为。

  2.面向对象程序设计(OOP)就是使用对象进行程序设计。对象(object)代表现实世界中可以明确标识的一个实体。比如:一个学生,一张桌子,一个圆甚至一笔贷款都可以看作是一个对象。每个对象都有自己独特的标识、状态和行为。

  • 一个对象的状态(state,也称为特征(property)和属性(attribute))是由具有当前值的数据域来表示的。
  • 一个对象的行为(behavior,也称为动作(action))是由方法定义的。调用对象的一个方法就是要求对象完成一个动作。

  3.使用一个通用类来定义同一类型的对象。类是一个模板、蓝本或者说是合约,用来定义对象的数据域是什么以及方法是做什么的。一个对象是类的一个实例。可以从一个类中创建多个实例。创建实例的过程称为实例化(instantiation)。对象(object)和实例(instance)经常是可以互换的。

  4.Java类使用变量定义数据域,使用方法定义动作。除此之外,类还提供了一种称为构造方法(constructor)的特殊类型的方法,调用它可以创建一个新对象。构造方法本身是可以完成任何动作的,但是设计构造方法是为了完成初始化动作,例如:初始化对象域的数据域。

  

  9.4 使用构造方法构造对象

  1.构造方法在使用new操作符创建对象的时候被调用

  2.构造方法是一种特殊的方法。它们有以下三个特殊性:

  • 构造方法必须具备和所在类相同的名字
  • 构造方法没有返回值类型,甚至连void也没有
  • 构造方法是在创建一个对象使用new操作符时调用的。构造方法的作用是初始化对象。

  3.通常,一个雷会提供一个没有参数的构造方法(例如:Circle())。这样的构造方法称为无参构造方法(no-arg或no-argument constructor)。

  4.一个类可以不定义构造方法。在这种情况下,类中隐含定义一个方法体为空的无参构造方法。这个构造方法称为默认构造方法(default constructor),当且仅当类中没有明确定义任何构造方法时才会自动提供它。

 

  9.5 通过引用变量访问对象

  要点提示:对象的数据和方法可以运用点操作符(.)通过对象的引用变量进行访问。

  9.5.1 引用变量和引用类型

  1.从表面上看,对象引用变量中似乎存放了一个对象,但事实上,它只是包含了对该对象的引用。严格地讲,对象引用变量和对象是不同的,但是太多情况下,这种差异是可以忽略的。因此,可以简单地说myCircle是一个Circle对象,而不用冗长地描述说,myCircle是一个包含对Circle对象引用的变量。

  2.在Java中,数组被看作是对象。数组是用new操作符创建的。一个数组变量实际上是一个包含数组引用的变量。

  9.5.2 访问对象的数据和方法

  1.在面向对象编程中,对象成员可以引用该对象的数据域和方法。在创建一个对象之后,它的数据和方法可以使用点操作符(.)来访问和调用,该操作符也称为对象成员访问操作符(object member access operator):

  • objectRefVar.dataField引用对象的数据域
  • objectRefVar.method(arguments)调用对象的方法
  9.5.3 引用数据域和null值

  ture和false是boolean类型直接量,而null是引用类型直接量。

  9.5.4 基本类型变量和引用类型变量的区别

  每个变量都代表一个存储值的内存位置。声明一个变量时,就是在告诉编译器这个变量可以存放什么类型的值。对基本类型变量来说,对应内存所存储的值是基本类型值。对引用类型变量来说,对应内存所存储的值是一个引用,是对象的存储地址。

  9.6 使用Java库中的类

  9.6.1 Date类

  可以使用Date类中的无惨构造方法为当前的日期和时间创建一个实例,它的getTime()方法返回自从GMT时间1970年1月1日算起至今流逝的时间,它的toString()方法返回日期和时间的字符串。

  9.6.2 Random类

  可以使用Math.random()获取一个0.0到1.0(不包括1.0)之间的随机double型值。

  

  9.7 静态变量、常量和方法

  1.静态变量被类中的所有对象所共享。静态方法不能访问类中的实例成员。

  2.如果想让一个类的所有实例共享数据,就要使用静态变量(static variable),也称为类变量(class variable)。

  3.实例方法可以调用实例方法和静态方法,以及访问实例数据域或者静态数据域。静态方法可以调用静态方法以及访问静态数据域。然而,静态方法不能调用实例方法或者访问实例数据域,因为静态方法和静态数据域不属于某个特定的对象。

  

  9.8 可见性修饰符

  1.可见性修饰符可以用于确定一个类以及它的成员的可见性。

  2.可以在类,方法和数据域前使用public修饰符,表示它们可以被其他的类访问。如果没有使用可见性修饰符,那么则默认类,方法和数据域可以被同一个包中的任何一个类访问的。这称作包私有(package-private)或包内访问(package-access)。

  3.private修饰符限定方法和数据域只能在它自己的类中被访问。

  4.修饰符private只能应用在类的成员上。修饰符public可以应用在类或类的成员上,在局部变量上使用修饰符和private都会导致编译错误。

 

  9.9 数据域封装

  1.将数据域设为私有保护数据,并且使类易于维护。

  2.为了避免对数据域的直接修改,应该使用private修饰符将数据域声明为私有的,这称为数据域封装(data field encapsulation)。

  3.在定义私有数据域的类外的对象是不能访问这个数据域的。但是经常会有客户端需要存取、修改数据域的情况。为了访问私有数据域,可以提供一个get方法返回数据域的值。为了能够更新一个数据域,可以提供一个set方法给数据域设置新值。get方法也被称为访问器(accessor),而set方法称为修改器(mutaor)。

 

  9.10 向方法传递对象参数

  1.给方法传递一个对象,是将对象的引用传递给方法的。

  2.Java只有一种参数传递方式:值传递(pass-by-value)。

  3.引用上的传值在语义上最好描述为传共享(pass-by-sharing),也就是说,在方法中引用的对象和传递的对象是一样的。

  

  9.11 对象数组

  数组既可以存储基本类型值,也可以存储对象。

 

  9.12 不可变对象和类

  1.可以定义不可变类来产生不可变对象。不可变对象的内容不能被改变。

  2.通常,创建一个对象后,它的内容是允许之后改变的。有时候也需要创建一个一旦创建其内容就不能再改变的对象。我们称这种对象为一个不可变对象(immutable object),而它的类就称为不可变类(immutable class)。

  3.要使一个类成为不可变的,它必须满足下面的要求:

  • 所有数据域都是私有的。
  • 没有修改器方法。
  • 没有一个返回指向可变数据域的引用的访问器方法。

  

  9.13 变量的作用域

  1.实例变量和静态变量的作用域是整个类,无论变量是在哪里声明的。

  2.一个类的实例变量和静态变量称为类变量(class's variable)数据域(data field)。在方法内部定义的变量称为局部变量。无论在何处声明,类变量的作用域都是整个类。类的变量和方法可以在类中以任意顺序出现。

  3.如果一个局部变量和一个类变量具有相同的名字,那么局部变量优先,而同名的类变量将被隐藏(hidden)。

 

  9.14 this引用

  1.关键字this引用对象自身。它可以在构造方法内部用于调用同一个类的其他构造方法。

  2.关键字this是指向调用对象本身的引用名。可以用this关键字引用对象的实例成员。然而,在引用数据隐藏数据域以及调用一个重载的构造方法的时候,this引用是必须的。

 

  9.14.1 使用this引用隐藏数据域

  this关键字可以用于引用类的隐藏数据域。例如,在数据域的set方法中,经常将数据域名用作参数名。在这种情况中,这个数据域在set方法中被隐藏。为了给它设置新值,需要在方法中引用隐藏的数据域名。隐藏的静态变量可以简单地通过"类名.静态变量"的方式引用。隐藏的实例变量就需要使用关键字this来引用。

 

  9.14.2 使用this调用构造方法

  1.Java要求在构造方法中,语句this(参数列表)应在任何其他可执行语句之前出现。

  2.如果一个类有多个构造方法,最好尽可能使用this(参数列表)实现他们。通常,无参数或参数少的构造方法可以用this(参数列表)调用参数多的构造方法。这样做通常可以简化代码,使类易于阅读和维护。

  

  

  

posted @ 2017-01-10 10:58  Young_Yang_Yang  阅读(1179)  评论(0编辑  收藏  举报