收藏 分享(赏)

8.抽象类.ppt

上传人:hyngb9260 文档编号:8315109 上传时间:2019-06-20 格式:PPT 页数:23 大小:314.50KB
下载 相关 举报
8.抽象类.ppt_第1页
第1页 / 共23页
8.抽象类.ppt_第2页
第2页 / 共23页
8.抽象类.ppt_第3页
第3页 / 共23页
8.抽象类.ppt_第4页
第4页 / 共23页
8.抽象类.ppt_第5页
第5页 / 共23页
点击查看更多>>
资源描述

1、第八课,抽 象 类,1、Java中使用哪个关键字完成一个类对另一个类的继承? 2、子类在被实例化时其构造方法的调用顺序是怎样的? 3、在静态方法中能使用this和super关键字么? 4、this与super在调用实例方法时与调用构造方法时的用法有什么不同? 5、如果父类只有一个带参数的构造方法,那么子类中的构造方法可以被编译系统自动生成么,为什么? 6、Java中允许一个类继承多个父类么(class A extends B,C.)? 7、main方法可以被继承到子类中吗? 8、Java中没有加任何访问权限修饰符的成员提供的访问权限是怎样的? 9、private的方法可以被继承到子类中吗,构造

2、方法可以被继承到子类中吗? 10、子类与父类处在不同的包中,子类可以访问到父类中protected的成员吗? 11、在Java中,所有类的超类是什么类?,回 顾,本课案例,定义一个抽象类国家,类中有一个抽象方法,名曰教育。定义两个子类:中国和美国,此两个子类都继承于国家,中国的教育是应试教育,美国的教育是素质教育定义一个测试类,在测试类中调用国家类的引用分别输出不同国度的教育方式,本章目标,方法覆盖(重写)理解多态的概念掌握多态的使用理解抽象类的概念掌握抽象类的使用,方法覆盖(重写),Java编译器如何区分一个类中的两个方法是否为同一方法?答:当一个类中存在两个方法名和参数列表完全一致(数量、

3、类型、顺序)的方法时被Java编译器认为是同一方法,一个类中不允许出现两个相同的方法 在继承关系中,父类的方法被继承到子类中,如果子类中存在一个方法名和参数列表与从父类中继承下来的方法名和参数列表完全一致的方法则称为子类覆盖父类的方法或称为子类重写父类的方法,在此,父类中final修饰的方法不能被重写 子类重写父类的方法之后子类的实例对象将调用到子类中重写后的方法而不是从父类继承下来的方法 子类重写超类或接口中的方法不能够降低访问权限,但可以扩大访问权限,即:子类重写方法的访问权限必须大于或等于超类或接口中该方法的访问权限,1、方法重写与方法重载的区别?答:方法重写是在继承关系中,子类重写父类

4、中方法名和参数列表完全相同的方法,因此,继承是构成方法重写的必要条件,方法重载是指在同一个类中存在方法名相同而参数列表不同(数量、类型、顺序)的各个方法 2、Java中哪些情况会构成方法重写?答:有以下两种情况会构成方法重写:A、在继承(extends)关系中,子类重写父类中的方法B、在实现(implements)关系中,子类重写接口(后面章节会讲述)中的方法 3、不论是类继承还是接口的实现,都体现了”父与子”的关系,方法覆盖(重写),不能被继承的类,final关键字表示”终极、不可变”的含义,由它修饰的变量表示该变量是一个不可以被改变值的变量,由它修饰的方法表示该方法在子类中不可以被改变,即

5、不能被重写,由它修饰的类表示该类是一个不可以改变类中成员的类,即不可以被继承(因为继承意味着可能增加新的成员属性或成员方法) 小结如下:final修饰的类不可以被继承final修饰的方法不可以被重写final修饰的变量(包括类中成员属性和方法内局部变量)就是常量,多态的概念,为了生存,我们都有一个广义上的动作,叫”挣钱”, 要完成这个动作,不同社会阶层的人有不同的实施方案, 煤矿工人以每天不辞辛苦的从矿窑中拉煤来实现;服装店铺中的店老板以每天苦口婆心的招揽顾客来实现;医院主治医生则是每天忙忙碌碌的从暗中收取病人家属的包裹、钱财等灰色收入来实现;政府部门官员则是每天咬尽脑汁的坐在办公桌前设计各种

6、地方税务费用来实现从上面挣钱的这个动作来看,它是一个泛化的动作,不同阶层的人有着不同的实现方式和方法,这就是面向对象领域的多态特征更理论性的说法是:由继承产生相关的不同子类,其子类对继承父类中的同一行为动作(方法)会做出不同的响应(方法重写),著名的“父类引用指向子类对象”,多态的3个必要条件: 要有继承 要有重写 父类引用指向子类对象继承、重写大家都理解,那么什么是“父类引用指向子类对象”呢? 若要理解“父类引用指向子类对象”,我们就必须先看看一般声明引用和创建对象的步骤,一般声明引用和创建对象的步骤,对象声明、创建与赋值的3个步骤: 1 3 2 Dog myDog = new Dog();

7、 1、声明一个引用变量 Dog myDog = new Dog(); 要求Java虚拟机分配空间给引用变量,并将此变量命名为myDog,此引用变 量将永远被固定为Dog类型。 2、创建对象 Dog myDog = new Dog(); 要求Java虚拟机分配堆空间给新创建的Dog对象。 3、连接对象和引用 Dog myDog = new Dog(); 将新的Dog对象赋值给myDog这个引用变量,换言之就是设定遥控器。,一般声明引用和创建对象的步骤,myDog引用变量(Dog类型) Dog对象,这两者都是相同的类型,引用变量类型是Dog,而对象也是 Dog。,著名的“父类引用指向子类对象”,m

8、yDog引用变量(Animal类型) Dog对象,这两者的类型不同,引用变量类型被声明为Animal,但对象是Dog,也就 是说我们可以说成”狗是一种动物”,满足”is a”的关系,但在多态下,引用和对象可以是不同的类型。 Animal myDog = new Dog();,这就是著名的“父类引用指向子类对象”,又称为上转型或动态绑定,即将狗说成是一种动物,上转型与动态绑定,父类(或接口)引用指向子类(实现类)的对象时被称为上转型或动态绑定,上转型过程是自动发生的,不需要在类型之间使用强制转换,上转型之后将丢失子类特有的成员,假设,B是A的父类(或接口)或超类(或超接口),即:B b=new

9、A(),则b能调用的成员包括:A、除了被A类重写的实例方法以外的所有B类成员B、B类的非private实例方法中被A类重写之后的实例方法 如果要重新获取子类中特有的成员则需要下转型,下转型过程需要在类型之间使用强制转换: A a=(A)b;请注意:一个对象能够被强制转换为另一种类型说明该对象的类型与强制转换的目标类型之间一定存在继承(extends)或实现(implements)兼容关系,反之,如果不具备这种关系,那么对象类型的强制转换是失败的,为什么需要抽象类和抽象方法?,myDog引用变量(Animal类型) Animal对象,这两者都是相同的类型,但是哪有一种叫做Animal的动物呢,也

10、就是我 们不可能说成”动物是一种动物”,因为动物本身并不是一种动物,动 物名词是对所有动物的抽象,并不是一个具体化的实例对象,但是这样会很奇怪:Animal myDog = new Animal();,哪有一种叫做Animal的动物,?,抽象类,从面向对象的角度看,有些类不应该被实例化! 幸好Java提供了一种方法能够防止类被实例化,换句话说,就是让这个类的对象不能被“new”出来,这就是抽象类 声明抽象类很简单在class关键字前面加上抽象类关键字abstract就OK了:,abstract关键字修饰,编译器不会让你实例化抽象类,抽象类代表没有人能够创建出该类的实例,你可以使用抽象类来声明为

11、引用类型给多态使用,你不用担心谁会去创建抽象类的对象,编译器会确保此事不成功:,这是被允许的,因为你可以赋值子类对象给父类的引用,即使父类是抽象的,这个类已经被标记为abstract,过不了编译器这一关,抽象方法,除了类之外,你也可以将方法标记为abstract的 抽象的方法代表此方法如果需要被使用则必须被子类重写。因为抽象类中某些行为(方法)没有通用的实现是可行的,所以这些行为(方法)被定义成抽象的。 抽象的方法没有方法体:,abstract关键字修饰,没有方法体,直接以分号结束,继承中的多态,对于一个非抽象的普通类被子类继承后仍然存在多态情况,假设B类是非抽象类,A类是B类的子类,则同样可

12、以多态化:B b=new A() 当类A继承于类B ,类B继承于类C 时, 类B称为类A的父类,类C称为类A的超类(又称为祖先类);类A称为类B的子类,类A称为类C的后裔类,Object类是所有类的祖先类,它处在继承层次的顶端,在此它们有如下关系: B b=new A(); C c=new B(); C c=new A() 存在抽象方法的类必须被声明为抽象类,但抽象类中不一定存在抽象方法,一个类被声明为抽象类仅仅是说明该类不能被直接实例化,如果要实例化则必须由其继承的子类来完成 抽象类中的抽象方法没有内容,它只是为了标记出多态而存在,这表示需要实例化的子类必须实现所有的抽象方法。 当我们谈到“

13、你必须实现所有抽象的方法”时,其实表示子类必须重写所有父类抽象的方法,如果子类没有完全重写抽象父类中的方法则子类必须继续被声明为抽象类(即子类也不能被实例化),直到在继承层次中有一个后裔类实现了祖先类中继承下来的所有抽象方法为止。 abstract这个关键字表示”抽象”的含义,由它修饰的类和方法都有可以被修改和改变的含义在里面,它与static和final是不兼容两种限定,即abstract和static及final不能同时修饰成员方法,多态与抽象类实例,但是注意这里你可以放任何Animal类型的子类对象进去,这就是多态最强的地方,你可以把数组的元素逐个取出来当做是Animal类型来用,声明一

14、个可以保存Animal类型的数组,总 结,多态分为静态多态(重载)与动态多态(重写),其中动态多态又称为动态绑定,它是通过对象上转型来完成的;动态的多态体现只能针对类中的实例方法而不能针对类的属性和静态方法 重载与重写的区别在于重载是同一个类中方法名相同而参数列表不同的方法,重写是在继承或实现关系中子类中重写父类(或超类)、接口(超接口)中的方法 由final修饰的类不能被继承,由final修饰的方法不能被重写,由final修饰的变量就是常量,abstract与final及static不能同时修一个方法 使用abstract修饰的类是抽象类,使用abstract修饰的方法是抽象方法,含有抽象方

15、法的类必须被定义成抽象类,而抽象类中不一定存在抽象方法 如果一个子类没有完全实现祖先类中继承下来的抽象方法则该子类必须继续保持抽象,至到它的后裔类实现所有的抽象方法为止,课后作业一,回答下面的问题: A、在上转型的绑定中,超类引用能不能调用子类特有的成员,超类型到子类型的转换可以自动进行么? B、动态绑定下,超类引用能不能调用到子类覆盖的成员属性、静态成员方法? C、抽象方法中有没有方法体? D、含有抽象方法的类必须是抽象类,这句话正确吗?抽象类里面一定有抽象方法,这句话又正确吗? E、abstract与final两个关键字可以同时修饰一个类或方法么,为什么? F、抽象类中的抽象方法是必须被子

16、类实现的,这句话正确吗?为什么? G、普通实现类、抽象类和接口都能实现动态绑定机制吗?,课后作业二,不同的化学物质在被氧化之后可能变成不同的物质种类,比如:铁被氧化之后会生成氧化铁,铝被氧化之后会生成氧化铝,锌被氧化之后会生成氧化锌 设计化学品类Chemicals抽象类,定义化学品的颜色、味道、气味、状态(液态、粉末、颗粒、块状)四个属性及氧化抽象方法(oxadation) 分别定义铁粉(Ferrum)、铝块(Aluminium)、锌粉(Zinc)、硅胶(Silicon)四种物质类,四个类均继承于Chemicals类同时实现其中的氧化抽象方法 定义一个普通类Student类,在Student类中定义做实验的方法test,在实验方法体中根据不同的化学品实验打印出不同的氧化产物 要求:使用动态多态来实现,Thank You!,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报