《5_第五章_面向对象[下].ppt》由会员分享,可在线阅读,更多相关《5_第五章_面向对象[下].ppt(51页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、高级软件人才实作培训专家高级软件人才实作培训专家!北京传智播客教育 第五章第五章面向对象面向对象传智左冷禅高级软件人才实作培训专家高级软件人才实作培训专家!本章内容l继承l多态l抽象类l接口l包和导包l权限修饰符l内部类北京传智播客教育 高级软件人才实作培训专家高级软件人才实作培训专家!继承概述l继承概述多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承那个类即可。通过extends关键字可以实现类与类的继承class 子类名 extends 父类名 单独的这个类称为父类,基类或者超类;这多个类可以称为子类或者派生类。有了继承以后,我们定义
2、一个类的时候,可以在一个已经存在的类的基础上,还可以定义自己的新成员。北京传智播客教育 高级软件人才实作培训专家高级软件人才实作培训专家!继承的案例和继承的好处l通过一个具体案例来演示代码案例1:学生类和老师。定义两个功能(吃饭,睡觉)案例2:加入人类后改进。l继承的好处提高了代码的复用性多个类相同的成员可以放到同一个类中提高了代码的维护性如果功能的代码需要修改,修改一处即可让类与类之间产生了关系,是多态的前提其实这也是继承的一个弊端:类的耦合性很强北京传智播客教育 高级软件人才实作培训专家高级软件人才实作培训专家!Java中继承的特点lJava只支持单继承,不支持多继承。一个类只能有一个父类
3、,不可以有多个父类。class SubDemo extends Demo/okclass SubDemo extends Demo1,Demo2./errorlJava支持多层继承(继承体系)class Aclass B extends Aclass C extends B北京传智播客教育 高级软件人才实作培训专家高级软件人才实作培训专家!Java中继承的注意事项l子类只能继承父类所有非私有的成员(成员方法和成员变量)其实这也体现了继承的另一个弊端:打破了封装性l子类不能继承父类的构造方法,但是可以通过super(后面讲)关键字去访问父类构造方法。l不要为了部分功能而去继承l我们到底在什么时候
4、使用继承呢?继承中类之间体现的是:”is a”的关系。北京传智播客教育 高级软件人才实作培训专家高级软件人才实作培训专家!继承中成员变量的关系l案例演示子父类中同名和不同名的成员变量l结论:在子类方法中访问一个变量首先在子类局部范围找然后在子类成员范围找最后在父类成员范围找(肯定不能访问到父类局部范围)如果还是没有就报错。(不考虑父亲的父亲)北京传智播客教育 高级软件人才实作培训专家高级软件人才实作培训专家!super关键字lsuper的用法和this很像this代表本类对应的引用。super代表父类存储空间的标识(可以理解为父类引用)l用法(this和super均可如下使用)l访问成员变量l
5、this.成员变量super.成员变量l访问构造方法(子父类的构造方法问题讲)lthis()super()l访问成员方法(子父类的成员方法问题讲)lthis.成员方法()super.成员方法()北京传智播客教育 高级软件人才实作培训专家高级软件人才实作培训专家!继承中构造方法的关系l子类中所有的构造方法默认都会访问父类中空参数的构造方法l为什么呢?因为子类会继承父类中的数据,可能还会使用父类的数据。所以,子类初始化之前,一定要先完成父类数据的初始化。每一个构造方法的第一条语句默认都是:super()北京传智播客教育 高级软件人才实作培训专家高级软件人才实作培训专家!继承中构造方法的关系l如何父
6、类中没有构造方法,该怎么办呢?子类通过super去显示调用父类其他的带参的构造方法子类通过this去调用本类的其他构造方法本类其他构造也必须首先访问了父类构造一定要注意:super()或者this(.)必须出现在第一条语句山否则,就会有父类数据的多次初始化l看程序写结果北京传智播客教育 高级软件人才实作培训专家高级软件人才实作培训专家!继承中成员方法的关系l案例演示子父类中同名和不同名的成员方法l结论:通过子类对象去访问一个方法首先在子类中找然后在父类中找如果还是没有就报错。(不考虑父亲的父亲)北京传智播客教育 高级软件人才实作培训专家高级软件人才实作培训专家!继承中成员方法的关系l方法重写概
7、述子类中出现了和父类中一模一样的方法声明,也被称为方法覆盖,方法复写。使用特点:如果方法名不同,就调用对应的方法如果方法名相同,最终使用的是子类自己的l方法重写的应用:当子类需要父类的功能,而功能主体子类有自己特有内容时,可以重写父类中的方法,这样,即沿袭了父类的功能,又定义了子类特有的内容。北京传智播客教育 高级软件人才实作培训专家高级软件人才实作培训专家!继承中成员方法的关系l方法重写的注意事项父类中私有方法不能被重写子类重写父类方法时,访问权限不能更低父类静态方法,子类也必须通过静态方法进行重写。(其实这个算不上方法重写,但是现象确实如此,至于为什么算不上方法重写,多态中我会讲解)北京传
8、智播客教育 高级软件人才实作培训专家高级软件人才实作培训专家!两个面试题l方法重写和方法重载的区别?方法重载能改变返回值类型吗?OverloadOverridelthis关键字和super关键字分别代表什么?以及他们各自的使用场景和作用。北京传智播客教育 高级软件人才实作培训专家高级软件人才实作培训专家!继承练习l学生案例和老师案例讲解使用继承前使用继承后父类中成员private修饰,子类如何访问呢?l猫狗案例讲解分析和实现北京传智播客教育 高级软件人才实作培训专家高级软件人才实作培训专家!final关键字lfinal关键字是最终的意思,可以修饰类,成员变量,成员方法。修饰类,类不能被继承修饰
9、变量,变量就变成了常量,只能被赋值一次修饰方法,方法不能被重写北京传智播客教育 高级软件人才实作培训专家高级软件人才实作培训专家!final关键字lfinal关键字面试题final修饰局部变量在方法内部,该变量不可以被改变在方法声明上,分别演示基本类型和引用类型作为参数的情况基本类型,是值不能被改变引用类型,是地址值不能被改变final修饰变量的初始化时机在对象构造完毕前即可北京传智播客教育 高级软件人才实作培训专家高级软件人才实作培训专家!多态概述l多态概述某一个事物,在不同时刻表现出来的不同状态。举例:猫可以是猫的类型。猫 m=new 猫();同时猫也是动物的一种,也可以把猫称为动物。动物
10、 d=new 猫();在举一个例子:水在不同时刻的状态l多态前提和体现有继承关系有方法重写有父类引用指向子类对象北京传智播客教育 高级软件人才实作培训专家高级软件人才实作培训专家!多态案例及成员访问特点l多态案例按照前提写一个多态的案例l成员访问特点l成员变量l编译看左边,运行看左边l成员方法l编译看左边,运行看右边l静态方法l编译看左边,运行看左边l所以前面我说静态方法不能算方法的重写北京传智播客教育 高级软件人才实作培训专家高级软件人才实作培训专家!多态的好处和弊端l多态的好处提高了程序的维护性(由继承保证)提高了程序的扩展性(由多态保证)l多态的弊端不能访问子类特有功能那么我们如何才能访
11、问子类的特有功能呢?多态中的转型北京传智播客教育 高级软件人才实作培训专家高级软件人才实作培训专家!多态中的转型问题l向上转型从子到父父类引用指向子类对象l向下转型从父到子父类引用转为子类对象l多态成员访问及转型的理解孔子装爹案例北京传智播客教育 高级软件人才实作培训专家高级软件人才实作培训专家!多态练习l猫狗案例练习多态版l不同地方饮食文化不同的案例Personeat()SouthPersoneat()NorthPersoneat()北京传智播客教育 高级软件人才实作培训专家高级软件人才实作培训专家!抽象类概述l抽象类概述回想前面我们的猫狗案例,提取出了一个动物类。并且我们在前面也创建过了动
12、物对象,其实这是不对的。为什么呢?因为,我说动物,你知道我说的是什么动物吗?只有看到了具体的动物,你才知道,这是什么动物。所以说,动物本身并不是一个具体的事物,而是一个抽象的事物。只有真正的猫,狗才是具体的动物。同理,我们也可以推想,不同的动物吃的东西应该是不一样的,所以,我们不应该在动物类中给出具体体现,而是应该给出一个声明即可。北京传智播客教育 高级软件人才实作培训专家高级软件人才实作培训专家!抽象类概述l抽象类概述回想前面我们的猫狗案例,提取出了一个动物类。并且我们在前面也创建过了动物对象,其实这是不对的。为什么呢?因为,我说动物,你知道我说的是什么动物吗?只有看到了具体的动物,你才知道
13、,这是什么动物。所以说,动物本身并不是一个具体的事物,而是一个抽象的事物。只有真正的猫,狗才是具体的动物。同理,我们也可以推想,不同的动物吃的东西应该是不一样的,所以,我们不应该在动物类中给出具体体现,而是应该给出一个声明即可。在Java中,一个没有方法体的方法应该定义为抽象方法,而类中如果有抽象方法,该类必须定义为抽象类。北京传智播客教育 高级软件人才实作培训专家高级软件人才实作培训专家!抽象类特点l抽象类特点抽象类和抽象方法必须用abstract关键字修饰格式abstract class 类名 public abstract void eat();抽象类不一定有抽象方法,有抽象方法的类一定
14、是抽象类抽象类不能实例化那么,抽象类如何实例化呢?按照多态的方式,由具体的子类实例化。其实这也是多态的一种,抽象类多态。抽象类的子类要么是抽象类要么重写抽象类中的所有抽象方法北京传智播客教育 高级软件人才实作培训专家高级软件人才实作培训专家!抽象类的成员特点l成员变量可以是变量也可以是常量l构造方法有构造方法,但是不能实例化那么,构造方法的作用是什么呢?用于子类访问父类数据的初始化l成员方法可以有抽象方法 限定子类必须完成某些动作也可以有非抽象方法 提高代码服用性北京传智播客教育 高级软件人才实作培训专家高级软件人才实作培训专家!抽象类练习l猫狗案例具体事物:猫,狗共性:姓名,年龄,吃饭l老师
15、案例具体事物:基础班老师,就业班老师共性:姓名,年龄,讲课。l学生案例具体事务:基础班学员,就业班学员共性:姓名,年龄,班级,学习,吃饭l员工案例(备注部分)北京传智播客教育 高级软件人才实作培训专家高级软件人才实作培训专家!抽象类的几个小问题l一个类如果没有抽象方法,可不可以定义为抽象类?如果可以,有什么意义?labstract不能和哪些关键字共存private冲突final冲突static无意义北京传智播客教育 高级软件人才实作培训专家高级软件人才实作培训专家!接口概述l接口概述继续回到我们的猫狗案例,我们想想狗一般就是看门,猫一般就是作为宠物了,对不。但是,现在有很多的驯养员或者是驯兽师
16、,可以训练出:猫钻火圈,狗跳高,狗做计算等。而这些额外的动作,并不是所有猫或者狗一开始就具备的,这应该属于经过特殊的培训训练出来的,对不。所以,这些额外的动作定义到动物类中就不合适,也不适合直接定义到猫或者狗中,因为只有部分猫狗具备这些功能。所以,为了体现事物功能的扩展性,Java中就提供了接口来定义这些额外功能,并不给出具体实现,将来哪些猫狗需要被培训,只需要这部分猫狗把这些额外功能实现即可。北京传智播客教育 高级软件人才实作培训专家高级软件人才实作培训专家!接口特点l接口特点接口用关键字interface表示格式:interface 接口名 类实现接口用implements表示格式:cla
17、ss 类名 implements 接口名 接口不能实例化那么,接口如何实例化呢?按照多态的方式,由具体的子类实例化。其实这也是多态的一种,接口多态。接口的子类要么是抽象类要么重写接口中的所有抽象方法北京传智播客教育 高级软件人才实作培训专家高级软件人才实作培训专家!接口成员特点l成员变量只能是常量默认修饰符 public static finall构造方法没有,因为接口主要是扩展功能的,而没有具体存在l成员方法只能是抽象方法默认修饰符 public abstract北京传智播客教育 高级软件人才实作培训专家高级软件人才实作培训专家!类与类,类与接口以及接口与接口的关系l类与类继承关系,只能单继
18、承,但是可以多层继承l类与接口实现关系,可以单实现,也可以多实现。还可以在继承一个类的同时实现多个接口l接口与接口继承关系,可以单继承,也可以多继承北京传智播客教育 高级软件人才实作培训专家高级软件人才实作培训专家!抽象类和接口的区别l成员区别抽象类 变量,常量;有抽象方法;抽象方法,非抽象方法接口 常量;抽象方法l关系区别类与类 继承,单继承类与接口 实现,单实现,多实现接口与接口 继承,单继承,多继承l设计理念区别抽象类 被继承体现的是:”is a”的关系。共性功能接口 被实现体现的是:”like a”的关系。扩展功能北京传智播客教育 高级软件人才实作培训专家高级软件人才实作培训专家!接口
19、练习l猫狗案例,加入跳高的额外功能l老师和学生案例,加入抽烟的额外功能l教练和运动员案例(学生分析然后讲解)乒乓球运动员和篮球运动员。乒乓球教练和篮球教练。为了出国交流,跟乒乓球相关的人员都需要学习英语。请用所学知识:分析,这个案例中有哪些抽象类,哪些接口,哪些具体类。北京传智播客教育 高级软件人才实作培训专家高级软件人才实作培训专家!形式参数和返回值问题案例l形式参数基本类型引用类型l返回值类型基本类型引用类型l链式编程北京传智播客教育 高级软件人才实作培训专家高级软件人才实作培训专家!包l包的概述其实就是文件夹作用:对类进行分类管理包的划分:举例:学生的增加,删除,修改,查询老师的增加,删
20、除,修改,查询以及以后可能出现的其他的类的增加,删除,修改,查询基本的划分:按照模块和功能分。高级的划分:就业班做项目的时候你就能看到了。北京传智播客教育 高级软件人才实作培训专家高级软件人才实作培训专家!包的定义及注意事项l定义包的格式package 包名;多级包用.分开即可注意事项:package语句必须是程序的第一条可执行的代码package语句在一个java文件中只能有一个如果没有package,默认表示无包名北京传智播客教育 高级软件人才实作培训专家高级软件人才实作培训专家!带包的类的编译和运行l手动式a:javac编译当前类文件。b:手动建立包对应的文件夹。c:把a步骤的class
21、文件放到b步骤的最终文件夹下。d:通过java命令执行。注意了:需要带包名称的执行java cn.itcast.HelloWorldl自动式a:javac编译的时候带上-d即可javac-d.HelloWorld.javab:通过java命令执行。和手动式一样北京传智播客教育 高级软件人才实作培训专家高级软件人才实作培训专家!不同包下类之间的访问l定义两个类:Demo,Test。Demo求和方法(sum)Test测试方法(main)北京传智播客教育 高级软件人才实作培训专家高级软件人才实作培训专家!导包l导包概述不同包下的类之间的访问,我们发现,每次使用不同包下的类的时候,都需要加包的全路径。
22、比较麻烦。这个时候,java就提供了导包的功能。l导包格式import 包名;注意:这种方式导入是到类的名称。虽然可以最后写*,但是不建议。lpackage,import,class有没有顺序关系(面试题)北京传智播客教育 高级软件人才实作培训专家高级软件人才实作培训专家!权限修饰符北京传智播客教育 publicprotected 默认private同一类中同一包子类,其他类不同包子类不同包其他类高级软件人才实作培训专家高级软件人才实作培训专家!类及其组成可以用的修饰符l类:默认,public,final,abstract我们自己定义:public居多l成员变量:四种权限修饰符均可,final
23、,static我们自己定义:private居多l构造方法:四种权限修饰符均可,其他不可我们自己定义:public 居多l成员方法:四种权限修饰符均可,fianl,static,abstract我们自己定义:public居多北京传智播客教育 高级软件人才实作培训专家高级软件人才实作培训专家!内部类概述l把类定义在其他类的内部,这个类就被称为内部类。举例:在类A中定义了一个类B,类B就是内部类。l内部类的访问特点:内部类可以直接访问外部类的成员,包括私有。外部类要访问内部类的成员,必须创建对象。北京传智播客教育 高级软件人才实作培训专家高级软件人才实作培训专家!内部类位置l按照内部类在类中定义的位
24、置不同,可以分为如下两种格式:成员位置(成员内部类)局部位置(局部内部类)l成员内部类l外界如何创建对象l外部类名.内部类名 对象名=外部类对象.内部类对象;北京传智播客教育 高级软件人才实作培训专家高级软件人才实作培训专家!成员内部类l刚才我们讲解过了,成员内部类的使用,但是一般来说,在实际开发中是不会这样使用的。因为一般内部类就是不让外界直接访问的。举例讲解这个问题:Body和Heart,电脑和CPU。l成员内部的常见修饰符private 为了保证数据的安全性static 为了让数据访问更方便被静态修饰的成员内部类只能访问外部类的静态成员内部类被静态修饰后的方法静态方法非静态方法北京传智播
25、客教育 高级软件人才实作培训专家高级软件人才实作培训专家!成员内部类面试题l补齐程序(注意:内部类和外部类没有继承关系)class Outer public int num=10;class Inner public int num=20;public void show()int num=30;System.out.println(?);System.out.println(?);System.out.println(?);在控制分别输出:30,20,10北京传智播客教育 高级软件人才实作培训专家高级软件人才实作培训专家!局部内部类l可以直接访问外部类的成员l可以创建内部类对象,通过对象调用
26、内部类方法,来使用局部内部类功能l局部内部类访问局部变量的注意事项:必须被final修饰?为什么呢?因为局部变量会随着方法的调用完毕而消失,这个时候,局部对象并没有立马从堆内存中消失,还要使用那个变量。为了让数据还能继续被使用,就用fianl修饰,这样,在堆内存里面存储的其实是一个常量值。通过反编译工具可以看一下。北京传智播客教育 高级软件人才实作培训专家高级软件人才实作培训专家!匿名内部类l就是内部类的简化写法。l前提:存在一个类或者接口这里的类可以是具体类也可以是抽象类。l格式:new 类名或者接口名()重写方法;l本质:是一个继承了类或者实现了接口的子类匿名对象北京传智播客教育 高级软件
27、人才实作培训专家高级软件人才实作培训专家!匿名内部类案例l写案例,并测试如何调用方法加入方法有多个,如何调用呢?方式1:每一种格式调用一个,太麻烦方式2:用类或者接口接收该子类对象,多态思想北京传智播客教育 高级软件人才实作培训专家高级软件人才实作培训专家!匿名内部类在开发中的使用l首先回顾我们曾经讲过的方法的形式参数是引用类型的情况,重点是接口的情况,我们知道这里需要一个子类对象。而匿名内部类就是一个子类匿名对象,所以,可以使用匿名内部类改进以前的做法。北京传智播客教育 高级软件人才实作培训专家高级软件人才实作培训专家!匿名内部类面试题l按照要求,补齐代码interface Inter void show();class Outer /补齐代码 class OuterDemo public static void main(String args)Outer.method().show();要求在控制台输出”HelloWorld”北京传智播客教育
限制150内