版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Java程序设计,第8章 继承和多态,楚雄师范学院计算机科学系 java程序设计课程,2/138,学习目标,1.理解类继承的基本概念,掌握由父类创建子类的方法;(重) 2.理解关键字super的作用,能正确识别其意义; 3.理解覆盖的概念,理解其与重载的区别;(重) 4.理解多态性、动态绑定和一般程序设计;(重、难) 5.理解转换的必要性和方法;,楚雄师范学院计算机科学系 java程序设计课程,3/138,学习目标,6.能用ArrayList实现Stack类;(重) 7.理解可见性修饰符protected和修饰符final的作用,掌握其使用方法;(重) 8.理解隐藏数据域和静态方法的作用; 9
2、.理解用初始化模块初始化数据的方法。,楚雄师范学院计算机科学系 java程序设计课程,4/138,内容摘要,8.1 引言 8.2 父类和子类 8.3 关键字super 8.4 方法覆盖 8.5 覆盖和重载,楚雄师范学院计算机科学系 java程序设计课程,5/138,内容摘要,8.6 对象类Object 8.7 多态性、动态绑定和一般程序设计 8.8 对象转换和instanceof运算符 8.9 数组线性表ArrayList,楚雄师范学院计算机科学系 java程序设计课程,6/138,内容摘要,8.10 自定义栈类 8.11 protected数据和方法 8.12 final类、方法和变量 8.
3、13 对象类Object中的方法 8.14 数据域和静态方法的隐藏 8.15 初始化模块,楚雄师范学院计算机科学系 java程序设计课程,7/138,内容摘要,8.1 引言 8.2 父类和子类 8.3 关键字super 8.4 方法覆盖 8.5 覆盖和重载,楚雄师范学院计算机科学系 java程序设计课程,8/138,8.1 引言,在面向对象程序设计中,可以从已有的类派生出新类,这就叫继承(inheritance). 继承是Java中一个重要而强大的概念,在Java中定义的每个类都有来自于一个已存在的类,或显式地,或隐含地. 在前面几章中创建的类,都是隐含地由java. lang.Object类
4、派生出来的. 本章介绍继承的概念.特别讨论父类和子、关键字super的用法以及Object类,探讨多,楚雄师范学院计算机科学系 java程序设计课程,9/138,8.1 引言,态和动态绑定、一般程序设计以及对象转换,介绍修饰符protected和final。,楚雄师范学院计算机科学系 java程序设计课程,10/138,内容摘要,8.1 引言 8.2 父类和子类 8.3 关键字super 8.4 方法覆盖 8.5 覆盖和重载,楚雄师范学院计算机科学系 java程序设计课程,11/138,8.2 父类和子类,所谓继承就是从一个类派生出另一个类的过程,派生出的类称为子类(subclass),用来派
5、生子类的类称父类(superclass). 子类也称为扩展类(extend class).或派生类(derived class),父类也称为超类或基类。 从哲学上讲,子类是一种(is a)特殊形态的父类,子类的实例(外延)包含在父类实例(外延)中. 例如,几何图形与圆、矩形和三角形就是父类与子类的关系,楚雄师范学院计算机科学系 java程序设计课程,12/138,8.2 父类和子类,所谓继承就是从一个类派生出另一个类的过程,派生出的类称为子类(subclass),用来派生子类的类称父类(superclass). 子类也称为扩展类(extend class).或生派类(derived class
6、),父类也称为超类或基类。 从哲学上讲,子类是一种(is a)特殊形态的父类,子类的实例(外延)包含在父类实例(外延)中. 例如,几何图形与圆、矩形和三角形就是父类与子类的关系,圆、矩形和三角形都是一,楚雄师范学院计算机科学系 java程序设计课程,13/138,8.2 父类和子类,一种(is a)特殊的几何图形. 子类具有父类的性质,而父类包含了所有子类的共同性质.这种特征使得我们在针对父类来描述子类时,可以只涉及子类的特殊性质,而不用明言父类所包含的性质,它们已自然地继承了父类的性质。 例如,几何图形具有“颜色”、“是否已填充颜色”、“产生日期”以及“计算面积”等性质,这些性质都是圆、矩形
7、和三角形具有的,但除此之外,圆还具有“半径”性质,矩形还具,楚雄师范学院计算机科学系 java程序设计课程,14/138,8.2 父类和子类,有“长”和“宽”性质,三角形还具有“边长1”、“边长2”及其“夹角”的性质。并且 圆、矩形和三角形还有互不相同的“计算面积”的性质。这一点说明,子类在继承父类性质时,可以部分地修改所继承的性质. 从Java语言角度上讲,子类是按如下语法格式从父类派生出来的:,楚雄师范学院计算机科学系 java程序设计课程,15/138,8.2 父类和子类, class extend 其中和是子类特有的性质,此外,它还继承了的所有性质。 例子:,楚雄师范学院计算机科学系
8、java程序设计课程,16/138,8.2 父类和子类,由前面讨论可知:矩形、圆和三角形是一种特殊的几何图形,使用UML图符表示如下:,楚雄师范学院计算机科学系 java程序设计课程,17/138,8.2 父类和子类,“几何图形”的描述如下:,楚雄师范学院计算机科学系 java程序设计课程,18/138,8.2 父类和子类,“圆”的描述如下:,楚雄师范学院计算机科学系 java程序设计课程,19/138,8.2 父类和子类,“矩形”的描述如下:,楚雄师范学院计算机科学系 java程序设计课程,20/138,8.2 父类和子类,“三角形”的描述如下:,楚雄师范学院计算机科学系 java程序设计课
9、程,21/138,8.2 父类和子类,程序代码: class GeometricObject private String color = white; private boolean filled; private java.util.Date dateCreated; /* 构造一个默认几何图形 */ public GeometricObject() dateCreated = new java.util.Date(); ,楚雄师范学院计算机科学系 java程序设计课程,22/138,8.2 父类和子类,/* 返回颜色 */ public String getColor() return
10、color; /* 设置颜色 */ public void setColor(String color) this.color = color; /* 填充过颜色吗? */ public boolean isFilled() return filled; ,楚雄师范学院计算机科学系 java程序设计课程,23/138,8.2 父类和子类,/* 设置一个新的填充 */ public void setFilled(boolean filled) this.filled = filled; /* 获得创建日期 */ public java.util.Date getDateCreated() ret
11、urn dateCreated; ,楚雄师范学院计算机科学系 java程序设计课程,24/138,8.2 父类和子类,/* 返回本对象的描述 */ public String toString() return created on + dateCreated + ncolor: + color + and filled: + filled; ,楚雄师范学院计算机科学系 java程序设计课程,25/138,8.2 父类和子类,圆: class Circle extends GeometricObject private double radius; public Circle() public
12、 Circle(double radius) this.radius = radius; ,楚雄师范学院计算机科学系 java程序设计课程,26/138,8.2 父类和子类,/* 返回半径 */ public double getRadius() return radius; /* 重新设置半径 */ public void setRadius(double radius) this.radius = radius; /* 返回面积 */ public double getArea() return radius * radius * Math.PI; ,楚雄师范学院计算机科学系 java程序
13、设计课程,27/138,8.2 父类和子类,/* 返回直径 */ public double getDiameter() return 2 * radius; /* 返回周长 */ public double getPerimeter() return 2 * radius * Math.PI; ,楚雄师范学院计算机科学系 java程序设计课程,28/138,8.2 父类和子类,/* 输出圆的信息 */ public void printCircle() System.out.println(The circle is created + getDateCreated() + and the
14、radius is + radius); ,楚雄师范学院计算机科学系 java程序设计课程,29/138,8.2 父类和子类,矩形: class Rectangle extends GeometricObject private double width; private double height; public Rectangle() public Rectangle(double width, double height) this.width = width; this.height = height; ,楚雄师范学院计算机科学系 java程序设计课程,30/138,8.2 父类和子类
15、,/* 返回宽 */ public double getWidth() return width; /* 设置宽 */ public void setWidth(double width) this.width = width; ,楚雄师范学院计算机科学系 java程序设计课程,31/138,8.2 父类和子类,/* 返回长 */ public double getHeight() return height; /* 设置长 */ public void setHeight(double height) this.height = height; ,楚雄师范学院计算机科学系 java程序设计课
16、程,32/138,8.2 父类和子类,/* 返回面积 */ public double getArea() return width * height; /* 返回周长 */ public double getPerimeter() return 2 * (width + height); ,楚雄师范学院计算机科学系 java程序设计课程,33/138,8.2 父类和子类,测试代码: public class TestCircleRectangle public static void main(String args) Circle circle = new Circle(1); Syste
17、m.out.println(A circle + circle.toString(); System.out.println(circle.getRadius(); System.out.println(The radius is + circle.getRadius(); System.out.println(The area is + circle.getArea(); System.out.println(The diameter is + circle.getDiameter();,楚雄师范学院计算机科学系 java程序设计课程,34/138,8.2 父类和子类,Rectangle r
18、ectangle = new Rectangle(2, 4); System.out.println(nA rectanlge + rectangle.toString(); System.out.println(The area is + rectangle.getArea(); System.out.println(The perimeter is + rectangle.getPerimeter(); ,楚雄师范学院计算机科学系 java程序设计课程,35/138,内容摘要,8.1 引言 8.2 父类和子类 8.3 关键字super 8.4 方法覆盖 8.5 覆盖和重载,楚雄师范学院计算
19、机科学系 java程序设计课程,36/138,8.3 关键字super,问题: 子类从父类中继承了所有可访问的数据域和方法,那么它能继承构造方法吗?父类的构造方法能够从子类中调用吗? 本节将解决这些问题及与它们相关的问题. 而super正能解决这些问题,它指向使用它的类的父类. 关键字super可以用于两种途径: 调用父类的构造方法与调用父类的方法,楚雄师范学院计算机科学系 java程序设计课程,37/138,8.3.1 调用父类的构造方法,语法格式: super( ); 或 super(); 其中语句super( )调用父类的无参构造方法,语句super()调用与匹配的父类构造方法。 语句s
20、uper( )和super()必须出现在子类构造方法的第一行,而且这是调用父类构造方法的唯一方式。,楚雄师范学院计算机科学系 java程序设计课程,38/138,8.3.1 调用父类的构造方法,注意1:在子类中使用父类构造方法的名字会引起语法错误; 注意2:构造方法用来构造类的实例,它与属性和方法不同,父类的构造方法不能传给子类,它们只能从子类的构造方法中用关键字super调用。,楚雄师范学院计算机科学系 java程序设计课程,39/138,8.3.2 构造方法链,前一节,我们讲到构造方法通过关键字super可以调用父类的构造方法。 事实上,如果构造方法中没有调用父类构造方法的语句,则编译器将
21、把super()当做该构造方法的第一条语句。例如,,楚雄师范学院计算机科学系 java程序设计课程,40/138,8.3.2 构造方法链,楚雄师范学院计算机科学系 java程序设计课程,41/138,8.3.2 构造方法链,在任何情况下,构造一个类的实例时,将会沿着继承链调用所有父类的构造方法,并且父类的构造方法在子类的构造方法之前调用,这叫着构造方法链,考虑如下代码: public class Faculty extends Employee public static void main(String args) new Faculty(); ,楚雄师范学院计算机科学系 java程序设计课
22、程,42/138,8.3.2 构造方法链,public Faculty() System.out.println(4)Faculty的无参构造方法被激活); class Employee extends Person public Employee() this(2)Employee的带参构造方法被激活); System.out.println(3)Employee的无参构造方法被激活); ,楚雄师范学院计算机科学系 java程序设计课程,43/138,8.3.2 构造方法链,public Employee(String s) System.out.println(s); class Pers
23、on public Person() System.out.println(1)Person的无参构造方法被激活); ,楚雄师范学院计算机科学系 java程序设计课程,44/138,8.3.2 构造方法链,注意:如果一个类要扩展,最好提供一个无参构造方法以避免编程错误,考虑如下代码: public class Apple extends Fruit class Fruit public Fruit(String nqme) System.out.println(“Fruit的构造方法”); ,楚雄师范学院计算机科学系 java程序设计课程,45/138,8.3.2 构造方法链,错误分析:,楚雄
24、师范学院计算机科学系 java程序设计课程,46/138,8.3.3 调用父类的方法,关键字super不仅可以调用父类的构造方法,也可以引用父类的方法。其语法格式如下: super.(); 如,可以将Circle类中的printCircle()方法改写如下: public void printCircle() System.out.println(“The circle is created ”+super.getDateCreate()+ “and the radius is ”+ radius); ,楚雄师范学院计算机科学系 java程序设计课程,47/138,8.3.3 调用父类的方法,
25、然而,这里没有必要在getDateCreate()前写上关键字super,因为getDateCreate()是GeometricObject的一个方法,可以由Circle类继承。 可是在有些情况下,如下一节所示,关键字是super是必不可少的。 注意:在Java中super链,如super.super.p()是不允许的。,楚雄师范学院计算机科学系 java程序设计课程,48/138,内容摘要,8.1 引言 8.2 父类和子类 8.3 关键字super 8.4 方法覆盖 8.5 覆盖和重载,楚雄师范学院计算机科学系 java程序设计课程,49/138,8.4 方法覆盖,如前所述,子类从父类中继承
26、方法。然而,有时子类必须修改父类中的方法,这叫方法覆盖(method overriding)。 例如:toString方法在GeometricObject类中返回表示几何对象的字符串,这个方法可以被覆盖,返回表示圆的字符串。这需要在Circle类的定义中加下列新方法: public class Circle extends GeometricObject /其它方法 /*覆盖GeometricObject中的toString方法*/,楚雄师范学院计算机科学系 java程序设计课程,50/138,8.4 方法覆盖,public String toString() return super.toS
27、tring()+”nradius is”+radius 注意1:父类中的私有数据域和方法在该类的外面不能引用,所以它们不能被子类继承; 注意2:实例方法仅当可访问时才能被覆盖。因为私有方法不能在定义它的类之外访问,所以它不能被覆盖。如果子类中定义的方法在父类中私有的,那么这两个方法完全没有关系; 注意3:与实例方法一样,静态方法也能继承。但是,静态方法不能被覆盖。如果父类中的静态方法在子类中被重新定义,父类的方法将被隐藏。,楚雄师范学院计算机科学系 java程序设计课程,51/138,内容摘要,8.1 引言 8.2 父类和子类 8.3 关键字super 8.4 方法覆盖 8.5 覆盖和重载,楚
28、雄师范学院计算机科学系 java程序设计课程,52/138,8.5 覆盖和重载,前面章节我们讲过重载方法。重载方法就是提供多于一个方法,这些方法有相同的名字但签名不同。 而覆盖方法就是在子类中定义一个方法,该方法与父类中方法使用相同签名,并且返回值类型也相同。 下面的例子说明了覆盖与重载的不同。,楚雄师范学院计算机科学系 java程序设计课程,53/138,8.5 覆盖和重载,A类中的方法p(int i)覆盖了B类中的同一个方法; 当执行Test时,a.p(10)调用A类中的p(int i)方法。,楚雄师范学院计算机科学系 java程序设计课程,54/138,8.5 覆盖和重载,A类中的方法p
29、(double i)和B类中的方法p(int i)是两个重载方法; 当执行Test时,a.p(10)调用B类中的p(int i)方法,所以,什么也不显示。,楚雄师范学院计算机科学系 java程序设计课程,55/138,内容摘要,8.6 对象类Object 8.7多态性、动态绑定和一般程序设计 8.8 对象转换和instanceof运算符 8.9 数组线性表ArrayList,楚雄师范学院计算机科学系 java程序设计课程,56/138,8.6 对象类Object,Java中的每个类都有源于java.lang.Object。 如果一个类在定义时没有指定继承,它的父类默认是Object。 所以,O
30、bject中方法可以被所有类继承或覆盖。我们来看它的toString()方法,其签名是 public String toString() 调用对象的toString()返回一个代表该对象的字符串,默认情况返回一个由该对象所属类名、at符号()和该对象十六进制的散列码组成的字符串。,楚雄师范学院计算机科学系 java程序设计课程,57/138,内容摘要,8.6 对象类Object 8.7多态性、动态绑定和一般程序设计 8.8 对象转换和instanceof运算符 8.9 数组线性表ArrayList,楚雄师范学院计算机科学系 java程序设计课程,58/138,8.7 多态性、动态绑定和一般程序
31、设计,继承关系使一个子类继承父类的特征,并附加新的特征。子类是父类的某种专门化,每个子类的实例都是父类的实例,但是反过来不行。 因此,对于需要父类类型的参数,总可以传入子类的实例。 考虑如下程序:,楚雄师范学院计算机科学系 java程序设计课程,59/138,8.7 多态性、动态绑定和一般程序设计,package ch8; public class PolymorphismDemo public static void main(String args) m(new GraduateStudent(); m(new Student(); m(new Person(); m(new Object
32、(); ,楚雄师范学院计算机科学系 java程序设计课程,60/138,8.7 多态性、动态绑定和一般程序设计,public static void m(Object x) System.out.println(x.toString(); class GraduateStudent extends Student ,楚雄师范学院计算机科学系 java程序设计课程,61/138,8.7 多态性、动态绑定和一般程序设计,class Student extends Person public String toString() return Student; class Person extends
33、 Object public String toString() return Person; ,楚雄师范学院计算机科学系 java程序设计课程,62/138,8.7 多态性、动态绑定和一般程序设计,楚雄师范学院计算机科学系 java程序设计课程,63/138,8.7 多态性、动态绑定和一般程序设计,分析: 当方法m(Object x)执行时,调用了x的toString方法,x可能是GraduateStudent、Student、Person或Object类的实例。 GraduateStudent、Student、Person和Object类都有自己对toString方法的实现,采用哪一种实现
34、方法由Java虚拟机在运行时动态决定,这种能力称为动态绑定(dynamic binding),也称为多态性(polymorphism)。 动态绑定工作机制如下:,楚雄师范学院计算机科学系 java程序设计课程,64/138,8.7 多态性、动态绑定和一般程序设计,假设对象o是类C1, C2, Cn-1, Cn的实例,其中C1是C2的子类,C2是C3的子类,, Cn-1是Cn的子类,如下图所示:,楚雄师范学院计算机科学系 java程序设计课程,65/138,8.7 多态性、动态绑定和一般程序设计,也就是说Cn是最一般的类,C1是最特殊的类。在Java中Cn是Object类。 如果对象o调用一个方
35、法p,Java虚拟机依次在类C1, C2, Cn-1, Cn中查找方法p的实现,直到找到为止。 一旦找到一个实现,停止查找并调用这个第一次找到的实现。,楚雄师范学院计算机科学系 java程序设计课程,66/138,8.7 多态性、动态绑定和一般程序设计,多态性一般允许方法使用范围更广的对象参数,这称为一般程序设计。如果一个方法的参数类型是父类,可以向该方法传递这个参数子类的任何对象。当在一个方法中使用一个对象时,动态地决定调用该对象方法的具体实现。,楚雄师范学院计算机科学系 java程序设计课程,67/138,内容摘要,8.6 对象类Object 8.7多态性、动态绑定和一般程序设计 8.8
36、对象转换和instanceof运算符 8.9 数组线性表ArrayList,楚雄师范学院计算机科学系 java程序设计课程,68/138,8.8 对象转换和instanceof运算符,在2.5节中,我们介绍过转换运算符,它把一种基本类型转换为另一种基本类型。 转换也可以用来把一种类的对象转换为继承层中的另一个对象。在上一节中 m(new Student(); 把对象new Student()赋值给一个Object类型的参数。这条语句等价于 Object o=new Student(); m(o);,楚雄师范学院计算机科学系 java程序设计课程,69/138,8.8 对象转换和instance
37、of运算符,由于Student的实例自动为Object的实例,所以,语句Object o=new Student()是合法的。这称为隐式类型转换(implicit casting)。 问题: 能不能把上述Object类型的实例o赋值给Student类型的变量s呢?,楚雄师范学院计算机科学系 java程序设计课程,70/138,8.8 对象转换和instanceof运算符,这个问题分两种情形回答: 第一种情形: Object o=new Object; Student s; 此时,Object类型的实例o不能转换为Student类型的实例,因而它不能赋值给s变量。,楚雄师范学院计算机科学系 ja
38、va程序设计课程,71/138,8.8 对象转换和instanceof运算符,第二种情形: Object o=new Student; Student s; 此时,Object类型的实例o实际是一个Student实例,它能转换为Student类型的实例,因而它能赋值给s变量。但此时,我们必须明确地告诉编译器o就是一个Student对象,即使用显式类型转换(explicit casting)。,楚雄师范学院计算机科学系 java程序设计课程,72/138,8.8 对象转换和instanceof运算符,其语法和基本数据类型转换的语法一致: =(); 所以,上述转换的语句为 Object o=new
39、 Student; Student s; s = (Student) o;,楚雄师范学院计算机科学系 java程序设计课程,73/138,8.8 对象转换和instanceof运算符,把一个子类的实例转换为一个父类类型并赋值给相应变量总是可行的,称为向上转换(upcasting),因为子类的实例永远是父类的实例. 把父类的实例转换为它子类类型并赋值给相应变量,称向下转换(downcasting),必须使用转换记号()进行显式转换,向编译器指明转换目的.为使转换,楚雄师范学院计算机科学系 java程序设计课程,74/138,8.8 对象转换和instanceof运算符,成功,必须确保转换的对象是
40、子类的一个实例. 如果父类对象不是子类的一个实例,会发生实时异常ClassCastException. 所以,一个好的习惯是,在进行转换时确保该对象是另一个对象的实例.这可以使用运算符instanceof来完成,例如:,楚雄师范学院计算机科学系 java程序设计课程,75/138,8.8 对象转换和instanceof运算符,Object myObject=new Circle(); /一些语句 if(myObject instanceof Circle) System.out.println(“圆的直径是”+ (Circle)myObject).getDiameter(); ,楚雄师范学院计
41、算机科学系 java程序设计课程,76/138,8.8 对象转换和instanceof运算符,这段代码在实施类型转换前,首先判断myObject是不是Circle类的实例, 如果是,才进行转换;否则不转换. 针对该段代码,也许你会觉得奇怪: 为什么要进行类型转换? 变量的声明类型是编译时确定的.假设变量myObject声明为Object类型,使用myObject.getDiameter()会引起编,楚雄师范学院计算机科学系 java程序设计课程,77/138,8.8 对象转换和instanceof运算符,译错误,因为Object类中没有方法getDiameter(),编译器无法找到它. 所以,
42、必须把变量myObject转换为Circle类,告诉编译器myObject也是一个Circle类的实例. 可能又产生一个问题: 为什么一开始不把myObject声明为Circle类呢?,楚雄师范学院计算机科学系 java程序设计课程,78/138,8.8 对象转换和instanceof运算符,回答: 为了能进行一般程序设计,一个好的做法是把变量声明为父类类型,这样它可以接收任何子类类型的值. 例子:演示多态和类型转换,楚雄师范学院计算机科学系 java程序设计课程,79/138,8.8 对象转换和instanceof运算符,public class TestPolymorphismCastin
43、g /* 主方法 */ public static void main(String args) / 声明并初始化两个对象 Object object1 = new Circle(1); Object object2 = new Rectangle(1, 1); / 显示 circle 和 rectanlge displayObject(object1); displayObject(object2); ,楚雄师范学院计算机科学系 java程序设计课程,80/138,8.8 对象转换和instanceof运算符,/* 显示对象的一个方法 */ public static void displa
44、yObject(Object object) if (object instanceof Circle) System.out.println(The circle area is + (Circle)object).getArea(); System.out.println(The circle diameter is + (Circle)object).getDiameter(); else if (object instanceof Rectangle) System.out.println(The rectangle area is + (Rectangle)object).getAr
45、ea(); ,楚雄师范学院计算机科学系 java程序设计课程,81/138,8.8 对象转换和instanceof运算符, 注意: 对于成员访问运算符(.)优先于类型转换运算符.所以要使用括号保证在点(.)运算符之前转换.,楚雄师范学院计算机科学系 java程序设计课程,82/138,内容摘要,8.6 对象类Object 8.7多态性、动态绑定和一般程序设计 8.8 对象转换和instanceof运算符 8.9 数组线性表ArrayList 8.10 自定义栈类 8.11 protected数据和方法 8.12 final类、方法和变量,楚雄师范学院计算机科学系 java程序设计课程,83/1
46、38,8.9 数组线性表ArrayList,第5章我们讲了如何创建数组对象,但是,一旦数组创建后,它的大小就固定了. 那么,能不能创建不限个数的数组对象呢? 回答是可以. Java提供了ArrayList类,它用于存储不限个数的对象.下图给出了ArrayList中的一些方法:,楚雄师范学院计算机科学系 java程序设计课程,84/138,8.9 数组线性表ArrayList,楚雄师范学院计算机科学系 java程序设计课程,85/138,8.9 数组线性表ArrayList,下面例子说明了ArrayList的使用: import java.util.ArrayList; public class
47、 TestArrayList public static void main(String args) /创建一个存储城市名的数组(线性表) ArrayList cityList=new ArrayList(); /添加一些城市名(元素)到线性表中 cityList.add(London); /现在,cityList线性表中包含London,楚雄师范学院计算机科学系 java程序设计课程,86/138,8.9 数组线性表ArrayList,cityList.add(New York); /现在,cityList线性表中包含London,New York cityList.add(Paris);
48、 /现在,cityList线性表中包含London,New York,Paris cityList.add(Toronto); /现在,cityList线性表中包含London,New York,Paris,Toronto,楚雄师范学院计算机科学系 java程序设计课程,87/138,8.9 数组线性表ArrayList,cityList.add(Hong Kong); /现在,cityList线性表中包含London,New York,Paris,Toronto,Hong Kong cityList.add(Singapore); /现在,cityList线性表中包含London,New Y
49、ork,Paris,Toronto,Hong Kong,Singapore System.out.println(线性表长度:“+cityList. Size() ); System.out.println(Toronto在线性表中吗? + cityList.contains(Toronto) );,楚雄师范学院计算机科学系 java程序设计课程,88/138,8.9 数组线性表ArrayList,System.out.println(New York在线性表中的下标是 + cityList.indexOf(New York) ); System.out.println(该线性表为空吗?+ci
50、tyList.isEmpty() ); /在线性表下标2处插入一个新的城市 cityList.add(2,Beijing); /现在,cityList线性表中包含London,New York, Beijing,Paris,Toronto,Hong Kong, Singapore,楚雄师范学院计算机科学系 java程序设计课程,89/138,8.9 数组线性表ArrayList,/从线性表中删除一个元素(一个城市) cityList.remove(Toronto); /现在,cityList线性表中包含London, New York,Beijing,Paris,Hong Kong,Singa
51、pore cityList.remove(1); /现在,cityList线性表中包含London,Beijing, Paris,Hong Kong,Singapore,楚雄师范学院计算机科学系 java程序设计课程,90/138,8.9 数组线性表ArrayList,/显示线性表中所有元素(城市) for (int i=0; i cityList.size(); i+) System.out.println(cityList.get(i)+ ); System.out.println(); /创建一个线性表以存储两个圆 ArrayList list=new ArrayList(); /添加两
52、个圆 list.add(new Circle(2); list.add(new Circle(3);,楚雄师范学院计算机科学系 java程序设计课程,91/138,8.9 数组线性表ArrayList,/显示线性表中第一个圆的面积 System.out.println(“第1个圆面积为+ (Circle)list.get(0).getArea); /主方法定义结束 /类TestArrayList定义结束,楚雄师范学院计算机科学系 java程序设计课程,92/138,8.9 数组线性表ArrayList,注意1: 在JDK1.5中编译该程序时,会产生”unchecked operation”这样
53、的编译警告.忽略它并用-Xlink选项重新编译: javac Xlink:uncheked nowarn TestArrayList.java 这个警告可以使用通用类型来解决. 可以像使用数组一样使用ArrayList对象,但是也有很多不同,如下表所示:,楚雄师范学院计算机科学系 java程序设计课程,93/138,8.9 数组线性表ArrayList,楚雄师范学院计算机科学系 java程序设计课程,94/138,8.9 数组线性表ArrayList,注意2: java.util.Vector也是存储对象的一个类,它与ArrayList类非常相似 ArrayList中的所有方法Vector都有
54、 Vector类是在JDK1.1中介绍的,而ArrayList是在JDK1.2中介绍的,它将代替Vector类.,楚雄师范学院计算机科学系 java程序设计课程,95/138,内容摘要,8.6 对象类Object 8.7多态性、动态绑定和一般程序设计 8.8 对象转换和instanceof运算符 8.9 数组线性表ArrayList 8.10 自定义栈类 8.11 protected数据和方法 8.12 final类、方法和变量,楚雄师范学院计算机科学系 java程序设计课程,96/138,8.10 自定义栈类,所谓栈是以先进后出的特点存储对象的一种数据结构. 我们可以使用ArrayList类
55、实现栈Stack,如下列UML图和程序代码所示:,楚雄师范学院计算机科学系 java程序设计课程,97/138,8.10 自定义栈类,楚雄师范学院计算机科学系 java程序设计课程,98/138,8.10 自定义栈类,public class MyStack private java.util.ArrayList list = new java.util.ArrayList(); public boolean isEmpty() return list.isEmpty(); ,楚雄师范学院计算机科学系 java程序设计课程,99/138,8.10 自定义栈类,public int getSiz
56、e() return list.size(); public Object peek() return list.get(getSize() - 1); ,楚雄师范学院计算机科学系 java程序设计课程,100/138,8.10 自定义栈类,public Object pop() Object o = list.get(getSize() - 1); list.remove(getSize() - 1); return o; public Object push(Object o) list.add(o); return o; ,楚雄师范学院计算机科学系 java程序设计课程,101/138,
57、8.10 自定义栈类,public int search(Object o) return list.lastIndexOf(o); /*覆盖Object类中的toString()方法*/ public String toString() return stack: + list.toString(); ,楚雄师范学院计算机科学系 java程序设计课程,102/138,8.10 自定义栈类,注意1: MyStack包含ArrayList.这种关系称为组合; 注意2: 也可以把MyStack作为ArrayList的子类实现.,楚雄师范学院计算机科学系 java程序设计课程,103/138,内容摘
58、要,8.6 对象类Object 8.7多态性、动态绑定和一般程序设计 8.8 对象转换和instanceof运算符 8.9 数组线性表ArrayList 8.10 自定义栈类 8.11 protected数据和方法 8.12 final类、方法和变量,楚雄师范学院计算机科学系 java程序设计课程,104/138,8.11 protected数据和方法,在6.6节,我们介绍过可见性修饰符:public、private和默认修饰符: public:使得类、方法和数据域可以在任何类中访问; private:使得方法和数据域只能从它自己所在的类中访问; 默认修饰符:使得类、方法和数据域可以从同一个包
59、里的任何类中访问。,楚雄师范学院计算机科学系 java程序设计课程,105/138,8.11 protected数据和方法,本节介绍保护的(protected)修饰符. 它可以应用于类中的数据和方法。公用类中保护的数据或方法可以被它的子类或同一包中的任何类访问,即使子类在不同包中也可以。 即,protected的可见性处于private(或默认修饰符)和public之间。 例:,楚雄师范学院计算机科学系 java程序设计课程,106/138,8.11 protected数据和方法,楚雄师范学院计算机科学系 java程序设计课程,107/138,8.11 protected数据和方法,注意: 子类可以覆盖父类的protected方法,并把的可见性修改为public。但是,子类不能降低父类中定义的方法的可访问性。例如,如果一个方法在父类定义为public,在子类中也
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025 奇妙的水的溶解现象实验作文课件
- 数字化转型下EG物流大连分公司客户服务优化策略探究
- 数字化转型下A集装箱运输公司商务结算信息化管理的探索与实践
- 数字化赋能:矿山风机状态监测与故障诊断的深度剖析与实践探索
- 数字化赋能:塘厦镇中心幼儿园规划建设与实践探索
- 数字化浪潮下广西YJ茶业公司网络营销策略的转型与突破
- 绿色橙色小清新工作总结计划模板
- 超大尺寸显示模组生产线项目实施方案
- 施工现场应急预案与响应方案
- 汽车车灯电子总成生产线项目投资计划书
- DB15∕T 2394-2021 黑土区秸秆有机肥分层堆垛发酵技术规程
- 骨关节疾病的pt康复教案
- 公安信访条例培训
- 房屋市政工程施工现场安全风险分级管控与防范措施清单
- (13)普通高中艺术课程标准日常修订版(2017年版2025年修订)
- 海绵城市施工方案
- GB/T 46454-2025临床实验室检测和体外诊断系统感染性疾病相关酵母样真菌抗微生物药物的体外活性检测微量肉汤稀释参考方法
- 2026年高考作文备考训练之作文讲评:如何处理情绪是每个人都必须面对的问题
- 2025至2030嵌入式单板计算机(SBC)行业发展趋势分析与未来投资战略咨询研究报告
- 社区415国家安全教育日
- 印刷厂安全教育培训计划
评论
0/150
提交评论