《继承和多态》PPT课件.ppt_第1页
《继承和多态》PPT课件.ppt_第2页
《继承和多态》PPT课件.ppt_第3页
《继承和多态》PPT课件.ppt_第4页
《继承和多态》PPT课件.ppt_第5页
已阅读5页,还剩35页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第09章 继承和多态,章节内容,9.1 引言 9.2父类和子类 9.3 使用super关键字 9.4 方法覆盖 9.5 覆盖和重载 9.6 对象类object和它的tostring方法 9.7 多态性、动态绑定和一般程序设计 9.8 对象转换和instanceof运算符 9.9 数组线性表ArrayList类 9.10自定义栈类 9.11 protected数据和方法 9.12 final类、方法和变量,9.1 引言,在面向对象中,从已有的类派生出新类,叫做继承。 超类=父类=基类 次类=子类=扩展类=派生类 Java中使用关键字extends来实现类的继承。例如: class Circle extends GeometricObject 类体; 创建了一个Circle类,它继承自GeometricObject类。 子类继承了父类所有的成员,还可以包含自己的数据成员和方法成员,9.2父类和子类,9.2父类和子类父类GeometricObject,public class GeometricObject private String color = “white“; private boolean filled; private java.util.Date dateCreated; public GeometricObject() dateCreated = new java.util.Date(); public String getColor() return color; public void setColor(String color) this.color = color; public boolean isFilled() return filled; ,public void setFilled(boolean filled) this.filled = filled; public java.util.Date getDateCreated() return dateCreated; public String toString() return “created on “ + dateCreated + “ncolor: “ + color + “ and filled: “ + filled; ,9.2父类和子类子类Circle,public class Circle extends GeometricObject private double radius; public Circle() public Circle(double radius) this.radius = radius; public double getRadius() return radius; public void setRadius(double radius) this.radius = radius; ,public double getArea() return radius * radius * Math.PI; public double getDiameter() return 2 * radius; public double getPerimeter() return 2 * radius * Math.PI; public void printCircle() System.out.println(“The circle is created “ + getDateCreated() + “ and the radius is “ + radius); ,9.2父类和子类 子类Rectangle,public class Rectangle extends GeometricObject private double width; private double height; public Rectangle() public Rectangle(double width, double height) this.width = width; this.height = height; public double getWidth() return width; public void setWidth(double width) this.width = width; ,public double getHeight() return height; public void setHeight(double height) this.height = height; public double getArea() return width * height; public double getPerimeter() return 2 * (width + height); ,9.2 父类和子类TestCircle测试类,/ TestCircle.java: Demonstrate private modifier public class TestCircle /* Main method */ public static void main(String args) / Create a Circle with radius 5.0 Circle myCircle = new Circle(5.0); System.out.println(“The area of the circle of radius “ + myCircle.getRadius() + “ is “ + myCircle.getArea(); / Increase myCircles radius by 10% myCircle.setRadius(myCircle.getRadius() * 1.1); System.out.println(“The area of the circle of radius “ + myCircle.getRadius() + “ is “ + myCircle.getArea(); ,9.3 使用super关键字,super关键字的功能 调用父类的构造方法: super( ); super( 参数 ); 必须出现在子类构造方法的第一行 调用父类的方法: super.方法名(参数); return 2*super.findArea()+(2*getRadius()*Math.PI)*length;,9.3 使用super关键字,9.3.2 构造方法链 创建派生类对象时,要首先创建其中包含的基类子对象,也就是说在派生类的构造方法中,要首先调用基类的构造方法。 通常,派生类构造方法中的第一条语句都是使用关键字super调用基类的构造方法;如果没有使用关键字super显式地调用基类的构造方法,则编译器将向派生类构造方法中添加一条语句super(),调用基类默认的构造方法,它是派生类构造方法的第一条语句。 在任何情况下,构造一个类的实例时,将会沿着继承链调用所有基类的构造方法,public class Faculty extends Employee public static void main(String args) new Faculty(); public Faculty() System.out.println(“(4) Facultys no-arg constructor is invoked“); class Employee extends Person public Employee() this(“(2) Invoke Employees overloaded constructor“); System.out.println(“(3) Employees no-arg constructor is invoked“); public Employee(String s) System.out.println(s); class Person public Person() System.out.println(“(1) Persons no-arg constructor is invoked“); ,Trace Execution,public class Faculty extends Employee public static void main(String args) new Faculty(); public Faculty() System.out.println(“(4) Facultys no-arg constructor is invoked“); class Employee extends Person public Employee() this(“(2) Invoke Employees overloaded constructor“); System.out.println(“(3) Employees no-arg constructor is invoked“); public Employee(String s) System.out.println(s); class Person public Person() System.out.println(“(1) Persons no-arg constructor is invoked“); ,1. Start from the main method,animation,Trace Execution,public class Faculty extends Employee public static void main(String args) new Faculty(); public Faculty() System.out.println(“(4) Facultys no-arg constructor is invoked“); class Employee extends Person public Employee() this(“(2) Invoke Employees overloaded constructor“); System.out.println(“(3) Employees no-arg constructor is invoked“); public Employee(String s) System.out.println(s); class Person public Person() System.out.println(“(1) Persons no-arg constructor is invoked“); ,2. Invoke Faculty constructor,animation,Trace Execution,public class Faculty extends Employee public static void main(String args) new Faculty(); public Faculty() System.out.println(“(4) Facultys no-arg constructor is invoked“); class Employee extends Person public Employee() this(“(2) Invoke Employees overloaded constructor“); System.out.println(“(3) Employees no-arg constructor is invoked“); public Employee(String s) System.out.println(s); class Person public Person() System.out.println(“(1) Persons no-arg constructor is invoked“); ,3. Invoke Employees no-arg constructor,animation,Trace Execution,public class Faculty extends Employee public static void main(String args) new Faculty(); public Faculty() System.out.println(“(4) Facultys no-arg constructor is invoked“); class Employee extends Person public Employee() this(“(2) Invoke Employees overloaded constructor“); System.out.println(“(3) Employees no-arg constructor is invoked“); public Employee(String s) System.out.println(s); class Person public Person() System.out.println(“(1) Persons no-arg constructor is invoked“); ,4. Invoke Employee(String) constructor,animation,Trace Execution,public class Faculty extends Employee public static void main(String args) new Faculty(); public Faculty() System.out.println(“(4) Facultys no-arg constructor is invoked“); class Employee extends Person public Employee() this(“(2) Invoke Employees overloaded constructor“); System.out.println(“(3) Employees no-arg constructor is invoked“); public Employee(String s) System.out.println(s); class Person public Person() System.out.println(“(1) Persons no-arg constructor is invoked“); ,5. Invoke Person() constructor,animation,Trace Execution,public class Faculty extends Employee public static void main(String args) new Faculty(); public Faculty() System.out.println(“(4) Facultys no-arg constructor is invoked“); class Employee extends Person public Employee() this(“(2) Invoke Employees overloaded constructor“); System.out.println(“(3) Employees no-arg constructor is invoked“); public Employee(String s) System.out.println(s); class Person public Person() System.out.println(“(1) Persons no-arg constructor is invoked“); ,6. Execute println,animation,Trace Execution,public class Faculty extends Employee public static void main(String args) new Faculty(); public Faculty() System.out.println(“(4) Facultys no-arg constructor is invoked“); class Employee extends Person public Employee() this(“(2) Invoke Employees overloaded constructor“); System.out.println(“(3) Employees no-arg constructor is invoked“); public Employee(String s) System.out.println(s); class Person public Person() System.out.println(“(1) Persons no-arg constructor is invoked“); ,7. Execute println,animation,Trace Execution,public class Faculty extends Employee public static void main(String args) new Faculty(); public Faculty() System.out.println(“(4) Facultys no-arg constructor is invoked“); class Employee extends Person public Employee() this(“(2) Invoke Employees overloaded constructor“); System.out.println(“(3) Employees no-arg constructor is invoked“); public Employee(String s) System.out.println(s); class Person public Person() System.out.println(“(1) Persons no-arg constructor is invoked“); ,8. Execute println,animation,Trace Execution,public class Faculty extends Employee public static void main(String args) new Faculty(); public Faculty() System.out.println(“(4) Facultys no-arg constructor is invoked“); class Employee extends Person public Employee() this(“(2) Invoke Employees overloaded constructor“); System.out.println(“(3) Employees no-arg constructor is invoked“); public Employee(String s) System.out.println(s); class Person public Person() System.out.println(“(1) Persons no-arg constructor is invoked“); ,9. Execute println,animation,9.4 方法覆盖,当子类 从父类中继承方法,子类必须修改父类中定义的方法,就叫做方法覆盖(methord overriding),public class Circle extends GeometricObject / Other methods are omitted /* Override the toString method defined in GeometricObject */ public String toString() return super.toString() + “nradius is “ + radius; ,9.5 覆盖和重载,9.6 对象类Object和它的toString()方法,如果定义一个类时,没有指明它的父类,则它的父类就是Object类。 Object中几个常用的实例方法: public String toString( ) public boolean equals(Object object) (见9.13) public Object clone( ) (见9.13) public int hashCode( ) (见9.13) public Class getClass( ) (见9.13) public String toString( ) 返回值代表一个该对象的字符串,默认情况下,返回一个由该对象所属的类名、和该对象十六进制的散列码组成的字符串 一般而言,每个类继承toString需要对该函数进行重载,如GeometricObject类中的toString 修改如下: public String toString() return “color:” + color + “and is filled:” + filled; ,9.7 多态性、动态绑定和一般程序设计,对于需要父类类型的参数,总可以传入子类的实例;实现的那一种实现由java虚拟机在运行时动态决定,称为动态绑定或者多态性。 绑定机制如下:假设对象o是类c1,c2,., Cn-1,Cn的实力,其中C1是C2的子类,C2是C3的子类,如果对象O调用一个方法p,JVM依次在类C1,C2,,Cn-1,Cn中查找方法P,直到找到为止。一旦找到,停止查找并调用这个第一次的实现。,9.7 多态性、动态绑定和一般程序设计(实例9-5),public class PolymorphismDemo public static void main(String args) m(new GraduateStudent(); m(new Student(); m(new Person(); m(new Object(); public static void m(Object x) System.out.println(x.toString(); class GraduateStudent extends Student class Student extends Person public String toString() return “Student“; class Person extends Object public String toString() return “Person“; ,9.8 对象转换和instanceof运算符,原则:派生类对象可以复制给基类对象(向上转换),基类对象赋值给派生类对象时必须显式转换(向下转化) Object o = new Student() /隐式转换 Student b = o /error Student b = (Student )o; 为了确保转换的安全,好的关是转换前确保该对象是另一个对象的实例,使用instanceof运算符,9.8 对象转换和instanceof运算符(举例),public class TestPolymorphismCasting public static void main(String args) Object object1 = new Circle(1); Object object2 = new Rectangle(1, 1); displayObject(object1); displayObject(object2); public static void displayObject(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).getArea(); ,9.9 数组线性表ArrayList类,ArrayList:存储不限个数的对象 9-7例要点:String是Object的子类,因此可以加入到ArrayList中,实例9-7,public class TestArrayList public static void main(String args) java.util.ArrayList cityList = new java.util.ArrayList(); cityList.add(“London“); cityList.add(“New York“); cityList.add(“Paris“); cityList.add(“Toronto“); cityList.add(“Hong Kong“); cityList.add(“Singapore“); System.out.println(“List size? “ + cityList.size(); System.out.println(“Is Toronto in the list? “ + cityList.contains(“Toronto“); System.out.println(“The location of New York in the list? “ + cityList.indexOf(“New York“); System.out.println(“Is the list empty? “ + cityList.isEmpty(); cityList.add(2, “Beijing“); cityList.remove(“Toronto“); cityList.remove(1); for (int i = 0; i cityList.size(); i+) System.out.print(cityList.get(i) + “ “); System.out.println(); java.util.ArrayList list = new java.util.ArrayList(); list.add(new Circle(2); list.add(new Circle(3); System.out.println(“The area of the circle? “ + (Circle)list.get(0).getArea(); ,9.10 自定义栈类(自学),public class MyStack private java.util.ArrayList list = new java.util.ArrayList(); public boolean isEmpty() return list.isEmpty(); public int getSi

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论