资源预览内容
第1页 / 共25页
第2页 / 共25页
第3页 / 共25页
第4页 / 共25页
第5页 / 共25页
第6页 / 共25页
第7页 / 共25页
第8页 / 共25页
第9页 / 共25页
第10页 / 共25页
亲,该文档总共25页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
1 第 7 章 深入理解类和对象引用 在上一节,学习了如何定义类和使用对象引用,以及“点”运算符。这一节深入讨论类和对象更多 的方面:方法的返回值、this 关键字、类成员和实例成员、访问控制以及变量作用域。 7.1 方法的返回值 方法实际上是一段单独执行的代码段。 当方法执行完毕以后就会返回主程序。 不管哪种情况先发生, 方法都会返回。当以下情况发生时,方法返回到调用它的代码处: 完成方法中所有语句; 遇到 return 语句; 抛出一个异常(后续章节解释)。 7.1.1 返回值 在方法声明中声明方法的返回类型。在方法体内,使用 return 语句来返回一个值。任何声明 void 的 方法都不返回任何值。 在声明为 void 的方法中, 不需要包含一个 return 语句。 当然也可以包含一个 return, 在这种情况下,一个 return 语句通常被用于终止一个控制流程块并退出方法。如下代码所示。 return; 如果一个方法已经声明为 void,但是在方法内还试图返回一个值的话,编译器将报错。如果一个方 法没有声明为 void,那么就必须包含一个 return 语句,后跟相应的返回值。例如: return 返回值; 返回值的数据类型必须与方法所声明的返回类型一致。例如,在一个方法声明中返回类型为 int,而 方法体内 return 语句返回一个小数,那么将通不过编译。例如: public int getHeight( ) return 15.6; 因为返回值类型与方法声明中的返回类型不一致,这将导致编译错误。在上一节的 Rectangle 类中, 声明了一个 getArea( )方法,它返回一个整数: public int getArea( ) return width * height; 这个方法返回表达式 width*height 计算以后的整数值, 这是一个原始数据类型。 请看下面这个程序: public class Circle private double radius = 0; /代表圆的半径 private double area = 0; /代表圆的面积 /* 2 * 下面这个方法设置圆半径的值。方法声明返回类型为 void, * 所以在代码中可以没有 return 语句,也可以有不带返回值的 return 语句 */ public void setRadius(double newRadius) radius = newRadius; return; /* * 下面这个方法返回经过计算后圆的面积。方法声明返回类型为 double, * 所以在代码中一定要有 return 语句,并返回一个 double 类型的值 */ public double getArea() return 3.14 * radius * radius; 除了可以返回原始数据类型之外,方法还可以返回一个构造(引用)类型。例如: public Point getPoint(int x, int y) return new Point(x,y); 在上面的代码中,返回一个新创建的 Point 对象,该对象使用调用 getPoint(int x,int y)方法时传递的 实参值初始化实例对象。返回类型 Point 指明此方法一定要返回一个 Point 对象。 7.1.2 返回类或接口 当一个方法使用一个类名作为其返回类型的话,如 Point,那么返回对象的类型类必须是返回类型 本身,或其子类。在下面的代码中,方法 getPoint()返回一个 Point 类型的对象: class Point private int x; /点的 x 坐标 private int y; /点的 y 坐标 public Point(int coordinateX, int coordinateY) x = coordinateX; y = coordinateY; public String toString() return “x:“ + x + “, y:“ + y; public class PointExample /该方法的返回类型为 Point 类型对象 public Point getPoint(int x, int y) return new Point(x, y); 3 public static void main(String args) PointExample pointExample = new PointExample(); Point point = pointExample.getPoint(3, 5); /将返回值赋给同类型的变量 System.out.println(point.toString(); 假设有一个类层次结构,其中 ImaginaryNumber 类是 java.lang.Number 类的子类,而 Number 类又 是 Object 的子类,如下图所示。 图 ImaginaryNumber 类的层次结构 现在声明一个方法,该方法声明返回一个 Number 类型的引用,如下代码所示。 public Number returnANumber() . 方法 returnANumber()可以返回一个 ImaginaryNumber,但是不能返回一个 Object,也就是说,该方 法可以返回声明的返回类型 Number 的子类,但是不能返回其超类。 可以重写一个方法并定义它返回一个子类,如下面代码所示。 public ImaginaryNumber returnANumber() . 这个技术,称为“协变返回类型”,它的意思是在返回类型上允许在子类方向上进行变化(这是在 JDK1.5 中加入的新特性, 即在面向对象的编程中, 子类在重写父类的方法时可以改变这个方法的返回值 的类型,但前提是子类的返回值是父类那个返回值的子类)。 还可以使用接口名称作为返回类型。在这种情况下,返回的对象必须实现指定的接口。 7.2 使用 this 关键字 在一个实例方法或一个构造器中,关键字 this 是对当前对象的引用。所谓当前对象,指的是其方法 或构造器正在被调用的对象,也就是正在调用的方法或构造器所在的对象。可以通过 this 在一个实例方 法或构造器中引用当前对象的任何成员。 7.2.1 对字段使用 this 最经常使用 this 关键字的情况,是在对象的一个字段被方法或构造器的参数屏蔽时,需要调用这个 被屏蔽的字段。例如,象下面的代码一样定义 Point 类。 public class Point private int x = 0; /声明字段 x 4 private int y = 0; /声明字段 y /构造器 public Point(int a, int b) x = a; /初始化字段 x 的值 y = b; /初始化字段 y 的值 /设置字段 x 的值 public void setX(int val) x = val; /设置字段 y 的值 public void setY(int val) y = val; 也可以象下面这样来写。 public class Point public int x = 0; /声明公共字段 x public int y = 0; /声明公共字段 y /构造器 public Point(int x, int y) this.x = x; /初始化字段 x 的值,this 代表当前的对象实例 this.y = y; /初始化字段 y 的值,this 代表当前的对象实例 /设置字段 x 的值,this 代表当前的对象实例 public void setX(int x) this.x = x; /设置字段 y 的值,this 代表当前的对象实例 public void setY(int y) this.y = y; 在第二个构造器中,每一个参数 x 和 y 都屏蔽了对象的字段 x 和 y。在构造器中,x 是构造器的第 一个参数的一个本地副本。要引用 Point 的字段 x,构造器必须使用 this.x。按惯例,在使用构造器对成 员变量(字段)进行初始化时,或者使用 setXXX()方法设置字段的值时,通常取参数名与字段名相同。 7.2.2 对构造器使用 this 在一个构造器中,还可以使用 this 关键字来调用同一个类中的另外的构造器。这种做法称之为“显 式构造器调用”。下面是另外一种实现形式的 Rectangle 类。 public class Rectangle 5 private int x, y; /声明两个私有类型的成员变量,代表矩形左上角的点 private int width, height; /声明两个私有类型的成员变量,代表矩形的宽和高 public Rectangle() /默认构造器 this(0, 0, 0, 0); /调用当前对象实例的带有 4 个参数的构造器 public Rectangle(int width, int height) /带有两个参数的构造器 this(0, 0, width, height); /调用当前对象实例的带有 4 个参数的构造器 public Rectangle(int x, int y, int width, int height) /带有四个参数的构造器 this.x = x; /初始化当前对象实例的字段 x this.y = y; /初始化当前对象实例的字段 y this.width = width; /初始化当前对象实例的字段 width this.height = height; /初始化当前对象实例的字段 height . 这个类包含一系列的构造器。每个构造器或者初始化部分 Rectangle 的成员变量,或者初始化全部 的 Rectangle 的成员变量。如果没有提供初始值,构造器为任一成员变量提供一个默认值。例如: public Rectangle() this(0, 0, 0, 0); 这里的无参构造器调用带有四个参数的构造器,并提供四个 0 作为初始值;而两个参数的构造器调 用四个参数的构造器,并提供两个 0 作为初始值。例如: public Rectangle(int width, int height) this(0, 0, width, height); 和前面几节描述一样,编译器基于参数的数量和类型决定调用哪一个构造器。需要注意的是,在使 用 this 关键字调用另一个构造器时,调用代码必须是当前构造器的第一行代码。 7.3 控制对类的成员的访问 访问级别修饰符用来决定其它类是否能访问当前类一个特定的字段或调用一个特定的方法。有两种 级别的访问控制: 最高级别:public,或包级私有(package-private,没有指定修饰符),用于修饰类。 成员级别:public、private、protected,或者包级私有(package-private,没有指定修饰符),用于 修饰类中的成员。 一个类可能会使用 public 修饰符声明,在这种情况下,类对在任何地方的其它类都是可见的。如果 一个类没有修饰符(这是访问级别是默
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号