第9章继承和多态课件

上传人:风*** 文档编号:241972858 上传时间:2024-08-08 格式:PPT 页数:47 大小:296.36KB
返回 下载 相关 举报
第9章继承和多态课件_第1页
第1页 / 共47页
第9章继承和多态课件_第2页
第2页 / 共47页
第9章继承和多态课件_第3页
第3页 / 共47页
点击查看更多>>
资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,1,1,1,*,*,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,Liang,Introduction to Java Programming,Fifth Edition,(c)2005 Pearson Education,Inc.All rights reserved.0-13-148952-6,*,第,9,章 继承和多态,第,II,篇 的必备基础,第,6,章 对象和类,第,7,章 字符串,第,8,章 继承和多态,第,5,章 数组,第,9,章抽象类和接口,第,10,章 面向对象建模,-,第,11,章图形界面程序编程,第,12,章,事件,驱动程序,-,第,15,章 异常和断言,第,16,章 简单输入输出,第,9,章后可涉及图形界面,第9章 继承和多态第 II篇 的必备基础 第6章 对象和类,学习目标,利用继承性由父类创建子类,(9.2).,使用,super,关键字调用父类的构造方法和方法,(9.3).,在子类中覆盖方法,(9.4).,熟悉,Object,类中的几个有用的方法,(,equals(Object),hashCode(),toString(),finalize(),clone(),and,getClass(),)(9.5,9.11 Optional).,学习目标利用继承性由父类创建子类(9.2).,9.2,父类和子类,UML,图,Circle,Circle Methods,Circle Data,父类,继承,Cylinder,Circle Methods,Cylinder Methods,Circle Data,Cylinder Data,子类,9.2 父类和子类UML 图CircleCircle Met,/,Cylinder.java:Cylinder,类的定义描述,public class Cylinder,extends,Circle,private double length=1;,/*Return length*/,public double getLength(),return length;,/*Set length*/,public void setLength(double length),this.length=length;,/*,计算体积*,/,public double findVolume(),return findArea()*length;,supertype,subtype,Cylinder,是由,Circle,派生而来,/Cylinder.java:Cylinder类的定义,Cylinder cylinder=new Cylinder();,System.out.println(The length is +,cylinder.getLength();,System.out.println(The radius is +,cylinder.getRadius();,System.out.println(The volume of the cylinder is +,cylinder.findVolume();,System.out.println(The area of the circle is +,cylinder.findArea();,The length is 1.0,The radius is 1.0,The volume of the cylinder is 3.14159,The area of the circle is 3.14159,输出结果是:,Cylinder cylinder=new Cylind,9.3,使用关键字,super,调用父类的构造方法,调用父类的方法,关键字,super,指向使用它的类的父类,可以用于,2,种途径,:,注意,:调用父类的构造方法必须使用,super,,并且这个调用必须放在 构造方法的第一行。,在子类中使用父类的构造方法的名字会引起语法错误。,9.3使用关键字 super调用父类的构造方法关键字supe,注意,构造方法用来构造类的实例。,与属性和方法不同,父类的构造方法不直接传给子类,它们只能从子类的构造方法中用关键字,super,调用。,注意构造方法用来构造类的实例。,9.3.2,构造方法链,构造方法可以调用重载的构造方法或父类的构造方法。,如果他们没有被显示的调用,编译器将把,super(),当作构造方法的第一条语句。,public Cylinder(),等价于,public Cylinder(),super();,public A(double d),/some statements,等价于,public A(double d),super();,/some statements,9.3.2 构造方法链构造方法可以调用重载的构造方法或父类的,9.3.2,构造方法链,在任何情况下,构造一个类的实例,将会沿着继承链调用所有父类的构造方法,这叫,构造方法链,。,举例,:p244,9.3.2 构造方法链在任何情况下,构造一个类的实例,将会沿,追踪执行过程,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.,从,main,方法开始,追踪执行过程public class Faculty ext,追踪执行过程,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.,调用,Faculty,构造方法,追踪执行过程public class Faculty ext,追踪执行过程,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.,调用,Employee,的无参构造方法,追踪执行过程public class Faculty ext,追踪执行过程,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.,调用,Employee(String),构造方法,追踪执行过程public class Faculty ext,追踪执行过程,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.,调用,Person(),构造方法,追踪执行过程public class Faculty ext,追踪执行过程,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.,执行,println,追踪执行过程public class Faculty ext,追踪执行过程,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.,执行,println,追踪执行过程public class Faculty ext,追踪执行过程,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.,执行,println,追踪执行过程public class Faculty ext,追踪执行过程,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.,执行,println,追踪执行过程public class Faculty ext,没有无参构造方法的示例,public class Apple extends Fruit,class Fruit,public Fruit(String name),System.out.println(Fruits constructor is invoked);,找出错误,:,如果一个类要扩展,最好提供一个无参构造方法以避免编程错误,!,没有无参构造方法的示例public class Apple,声明一个子类,子类可以扩展父类的方法和属性,所以可以在子类中,:,添加新的属性,添加新的方法,重写父类的方法,声明一个子类子类可以扩展父类的方法和属性,所以可以在子类中:,9.4,方法覆盖,子类从父类中继承方法。有时,子类必须修改父类中定义的方法,这叫方法覆盖。,/Cylinder.java:cylinder,类中覆盖,findArea(),public class Cylinder,extends Circle,public double findArea(),return 2*super.findArea()+2*getRadius()*Math.PI*length;,/Other methods are omitted,9.4 方法覆盖子类从父类中继承方法。有时,子类必须修改父类,注意,子类定义的方法必须与父类方法具有相同的头标志和相同的返回类型。,实例方法仅当可访问时才能被覆盖。,私有方法,不能在定义它的类外访问,所以,不能被覆盖,。,如果子类中定义的方法在父类中是私有的,那个这,2,个方法完全没有关系。,静态方法也可以继承,但不能被覆盖。如果,静态方法被重新定义,则父类的方法将被隐藏,。,注意子类定义的方法必须与父类方法具有相同的头标志和相同的返回,对象类,Object,Java,中的每一个类都源于,java.lang.Object,class.,如果没有指定一个类继承谁,它的父类就是,Object,.,对象类 ObjectJava中的每一个类都源于 java.l,equals(),和,hashCode()Methods,equals(),方法检查,2,个对象是否,.,equals(),和,=,比较,hashCode(),返回该对象的哈希码,返回对象在计算机内部存储的十六进制内存地址,.,equals()和 hashCode()Methodse,toString(),方法,toString(),方法返回一个代表该对象的字符串:类名,+,+,哈希码,.,Cylinder myCylinder=new Cylinder(5.0,2.0);,System.out.println(myCylinder.toString();,显示结果类似:,Cylinder15037e5.,通常情况下要重写,toString(),方法。,toString()方法toString()方法返回一个,学习目标,理解多态、动态绑定和一般程序设计,(9.6).,描述转换并理解显示向下转换的必要性,(9.7).,理解隐藏数据域和静态方法的作用,(9.9 Optional).,使用修饰符,protected,限制对数据和方法的访问,(9.9).,使用修饰符,final,声明常量、不可修改的方法和不可扩展的类,(9.10).,学习目标理解多态、动态绑定和一般程序设计(9.6).,class GraduateStudent extends Student,class Student extends Person,public String toString(),return Student;,class Person extends Object,public String toString(),return Person;,多态性、动态绑定和一般程序设计,class GraduateStudent extends,多态性、动态绑定和一般程序设计,public class Test,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();,方法,m(),采用,Object,型参数,所以可以用任何对象。,同名的不同方法可以在程序中共存,称为多态,以覆盖和重载,2,种形式体现。,GraduateStudent,Student,Person,and,Object,每个类都有自己的,toString(),方法,采用哪一种实现有,JVM,在运行时动态决定,这种能力成为动态绑定。,多态性、动态绑定和一般程序设计public class Te,动态绑定的工作机制,多态性、动态绑定和一般程序设计,最一般的类,最特殊的类,如果对象,o,调用一个方法,p,,,Java,虚拟机依次在类,C1,、,C2,Cn-1,Cn,中,查找方法,p,的实现,直到找到为止。,一旦找到一个实现,停止查找并调用这个第一次找到的实现。,动态绑定的工作机制多态性、动态绑定和一般程序设计最一般的类最,一般程序设计,多态性一般允许方法,使用范围更广的对象参数,,这称为,一般程序设计,。,如果一个方法的参数类型是父类,可以向该方法传递这个参数子类的任何对象。,public static void m(Object x),System.out.println(x.toString();,一般程序设计多态性一般允许方法使用范围更广的对象参数,这称为,9.7,对象类型转换,语句,m(new Student();,将对象,new Student(),传递给了,Object,类型参数,.,该语句等价于,:,Object o=new Student();,/Implicit casting,m(o);,隐式类型转换,9.7 对象类型转换语句 隐式类型转换,为什要转换,假设,:,Student b=o;,因为,Student,对象的总是,Object,对象的实例,但是,Object,对象的实例不一定是,Student,对象的实例。,使用显示类型转换,:,Student b=(Student)o;/Explicit casting,错误?,为什要转换假设:错误?,父类和子类之间的转换,将一个子类的实例转换为一个父类的变量总是可行的,称为,向上转换,;,将一个父类的实例转换为一个子类的变量称为,向下转换,;,向下转换不一定总能成功。?,Cylinder myCylinder=(Cylinder)myCircle;,Apple x=(Apple)fruit;,Orange x=(Orange)fruit;,父类和子类之间的转换将一个子类的实例转换为一个父类的变量总是,instanceof,运算符,为确保转换的对象是子类的一个实例,使用,instanceof,运算符:,Circle myCircle=new Circle();,if(myCircle instanceof Cylinder),Cylinder myCylinder=(Cylinder)myCircle;,.,instanceof 运算符为确保转换的对象是子类的一个实例,Example 9.1,演示多态和对象转换,创建,2,个对象,一个圆和一个圆柱,并调用,displayObject,方法显示它们。,TestPolymorphismCasting,Run,Example 9.1演示多态和对象转换 创建2个对,9.9,隐藏数据,可以覆盖一个实例方法,但是不能覆盖一个数据域(实例或静态的)或静态方法。,如果在子类中声明的数据域或静态方法与父类中的名字相同,父类中的将被隐藏,但是它依旧存在。,在子类中可以使用,super,关键字调用隐藏的数据域或静态方法。,9.9隐藏数据可以覆盖一个实例方法,但是不能覆盖一个数据域(,protected,数据和方法,protected,修饰符可以应用于类中的数据和方法。,公用类中保护的数据或方法可以被它的子类或同一包中的任何类访问,即使子类在不同的包中也可以。,private,default,protected,public,private,none(,如果没有使用修饰符,),protected,public,可见性逐渐增加,protected 数据和方法protected 修饰符可以,访问性汇总,Modifier,on members,in a class,Accessed,from the,same class,Accessed,from the,sam,e package,Accessed,from a,subclass,Accessed,from a different,package,public,protected,-,default,-,-,private,-,-,-,访问性汇总 Modifier on members in,可见性修饰符,可见性修饰符,注,一个子类可以覆盖父类的,protected,方法并把它的可见性改为,public,。,但是子类不能降低父类中定义的方法的可访问性。,注一个子类可以覆盖父类的protected方法并把它的可见性,final,修饰符,final,类不能被继承,:,final class Math,.,final,变量是常量,:,final static double PI=3.14159;,final,方法不能被重写,.,final 修饰符final 类不能被继承:,finalize,clone,和,getClass,Methods,finalize,方法会被该对象的垃圾回收程序调用,.,clone(),方法创建一个有单独内存空间的新对象,返回类型是,object.,int targetArray=(int)sourceArray.clone(),getClass(),描述类的信息,称为元对象。,Optional,finalize,clone,和 getClass Me,初始化块,初始化模块是一个用大括号括住的语句块,它位于类的声明中,但是不在构造方法或方法内。,初始化块初始化模块是一个用大括号括住的语句块,它位于类的声明,实例初始化块,public class Book,numOfObjects+;,实例初始化块public class Book,静态初始化块,class A extends B,static,System.out.println(As static initialization block +,is invoked);,class B,static,System.out.println(Bs static initialization block +,“is invoked);,静态初始化块class A extends B,类的执行顺序(P261),第一次使用类时,装入类,1.,装入父类,2.,初始化静态数据域,顺序执行类的静态初始化模块。,调用类的构造方法,1.,调用父类的构造方法,2.,初始化实例数据,3.,执行构造方法的方法体,类的执行顺序(P261)第一次使用类时,装入类,作业,P269 9.1,9.3,作业P269 9.1,9.3,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 教学培训


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!