您好,欢迎访问三七文档
当前位置:首页 > 建筑/环境 > 电气安装工程 > Java基础课程笔记
DAY11/*多态的概念:1、之前我们学习了继承,继承的好处之一:为多态提供了前提。2、多态:是指父类类型的变量存储了子类对象的引用。3、注意:“多态”的使用,一定要继承关系多态的前提和体现:1、有继承关系(重要)classStudentextendsPerson2、有方法重写3、有父类引用指向子类对象(重要)Personp=newStudent();*//*多态的成员访问特点:以下都是指:子类的成员覆盖了父类的成员是(子父类都有):1、成员变量:编译看左边(父类必须要有,否则编译错误),运行时看左边(运行时,打印的值:父类的)2、成员方法:编译看左边(父类必须要有,否则编译错误),运行看右边(运行时,运行的是“子类”的)3、静态方法:编译看左边(父类必须要有,否则编译错误),运行按左边(运行时,运行的是”父类“的)总之:编译都要看左边,也就是:多态时,访问的成员,父类中必须要有;否则编译错误运行时:除了“成员方法”看右边,其他的都是看左边;多态时:左:父类右:子类*//*多态中的类型转换:1、多态时:Animala1=newCat();此时,编译器是将Cat的引用“隐式”的转换为Animal类型。这种转换类型类似于longn=int;是一种隐式的:类型提升--向上转型;2、多态时,父类的引用不能访问子类特有的成员;3、可以经“父类类型”强制转换为“它所存储的子类对象”的引用;Catc=(Cat)a1;向下转型后,就可以访问子类特有成员;4、强制转换时,一定要转换为“它所存储的子类对象”,否则会在运行时抛出:ClassCastException为了防止这种异常,我们可以在“强制转换前”先进行判断,后转换:判断,使用关键字:instanceof(只能用于引用数据类型的判断);格式:变量instanceof某类类型返回:boolean值,如果为true:表示左边的“变量”是右边的”某类类型“可以安全强制转换;如果为false:便是左边的”变量“不是右边的”某类类型“;小结:1、向下转型:Animala1=newCat();2、向上转型:Catc=(Cat)a1;*///孔子装爹/*孔子装爹案例:class孔爹{intage=80;void讲课(){System.out.println(孔爹讲Java);}}class孔子extends孔爹{intage=50;void讲课(){System.out.println(孔子讲C#);}void打游戏(){System.out.println(孔子玩斗地主(IOS版));}}main(){//有一天有人请孔爹出去讲Java,孔爹去了//之后,又来人请孔爹,孔爹没在家,只有孔子接待,孔子一听来人说给的报酬还挺高//孔子于是就打算冒充他爹,替爹去讲课。//于是孔子进屋:带上假胡子,穿上他爹的衣服,就去讲课了孔爹kd=new孔子();System.out.println(大家好,我的年龄是:+kd.age);//80kd.讲课();//孔子讲C#kd.打游戏();//编译错误,孔爹不能打游戏//孔子讲课后回到家,脱掉衣服,卸掉胡子孔子kz=(孔子)kd;kz.打游戏();//OK了;}*//*多态的好处1.提高了程序的维护性(由继承保证)2.提高了程序的扩展性(由多态保证):见:04.Demo多态的弊端1.不能访问子类特有功能那么我们如何才能访问子类的特有功能呢?多态中的转型*//*抽象类:1.抽象类也是一个类;2.有时,父类中的方法,会被每个子类重写,那么在父类中这个方法的方法体内容,就没有意义了,这时,可以在父类中将此方法定义为抽象方法:只有方法的定义,没有方法体;需要使用关键字:abstract3.如果一个类中包含了一个抽象方法,那么这个类必须也要定义为抽象类,仍然使用关键字:abstract4.子类继承一个抽象类,仍然使用:extends,仍然是单继承;但是:子类必须重写父类中所有的抽象方法,否则子类也必须是个抽象类(另一个角度说:一个抽象类可以继承自另一个抽象类);5.一个抽象类,不能被实例化;因为无法为抽象方法分配空间;6.抽象类中可不可以没有抽象方法?可以的;抽象类中可以什么都不定义7.抽象类中都可以定义什么?1.成员变量;2.实现的方法;3.构造方法:作用:为成员属性赋值;4.抽象方法;*//*猫:成员属性:名称:(父类)性别:(父类)年龄:(父类)成员方法:吃饭:(抽象)睡觉:(父类)捉老鼠:狗:成员属性:名称:(父类)性别:(父类)年龄:(父类)成员方法:吃饭:(抽象)睡觉:(父类)看门:*//*老师案例具体事物:基础班老师,就业班老师共性:姓名,年龄,讲课。Person(抽象):成员属性:姓名:年龄:成员方法:讲课(抽象)基础班老师继承Person实现抽象方法:讲课就业班老师继承Person实现抽象方法:讲课*//*抽象类的几个小问题:1.一个类如果没有抽象方法,可不可以定义为抽象类?如果可以,有什么意义?1).可以;2).可以利用多态;2.abstract关键字不能和哪些关键字共存:1).private:abstract的方法就是需要被子类重写;一个private的方法不能被子类重写:2).final:一个final的方法也不能被子类重写,所以与abstract冲突;3).static:一个静态的方法,在没有对象的情况下,就会被分配空间。而一个抽象方法没有方法体,无法被分配空间。所以,一个抽象方法不能被定义为静态;*//*接口:1.如果一个类中包含的全部都是抽象方法,可以将这个类定义为接口;2.接口的定义格式:interface接口名{//接口成员:}3.接口中可以定义什么(JDK1.8之前):1).成员变量:但是,成员变量必须被声明为:publicstaticfinal,这几个修饰符可以不写编译器会自动添加:interfaceIA{intnum1=10;//publicstaticfinalintnum1=10;publicintnum2=20;//OK的staticintnum3=30;//OK的finalintnum4=40;//OK的staticfinalintnum5=50;//OK的publicfinalintnum6=60;//OK的}2).抽象方法:抽象方法必须被声明为:publicabstract。这几个修饰符可以不写,编译器会自动添加。4.子类实现接口,使用关键字:implements;5.子类实现接口后,必须要重写接口中所有的抽象方法,否则子类必须是抽象类或者是一个接口;6.子类实现接口,可以同时实现多个接口;不怕方法冲突,因为接口中的方法都是抽象方法;7.一个接口可以继承另一个或多个接口,使用关键字:extends;接口继承接口,允许多继承;interfaceIA{voidf1();}interfaceIB{voidf1();voidf2();}interfaceICextendsIA,IB{}classSubClassimplementsIC{publicvoidf1(){}publicvoidf2(){}}8.接口的作用:1).多态;2).Java中只允许单继承;可以通过同时实现多个接口达到扩展功能的目的;//老大命令:abstractclassAbstractService{abstractvoidsave();abstractvoidupdate();abstractvoiddelete();abstractvoidfind();}//副项目经理interfaceIService{abstractvoidcheck();//检查权限abstractvoidlog();//写日志的}//程序员继承//Student模块classStudentServiceextendsAbstractServiceimplementsIService{voidsave(){}voidupdate(){}voiddelete(){}voidfind(){}publicvoidcheck(){}publicvoidlog(){}}*//*类与类,类与接口,接口与接口的关系(注:下面说到的类,包括:抽象类和普通父类)1.类与类:继承(extends);单继承2.类与接口:实现(implements);可以同时实现多个接口3.接口与接口:继承(extends);可以多继承*//*抽象类和接口的相同点和区别:1.相同点:都不能被实例化,都是用来被子类继承,或者实现的;2.不同点:1).定义:抽象类:abstractclass接口:interface2).成员:抽象类:成员变量、成员方法、构造方法、抽象方法接口:静态常量、抽象方法(JDK1.8以前);*//*猫狗案例加入跳高功能猫:成员属性:名称:(父类)性别:(父类)年龄:(父类)成员方法:吃饭:(抽象)睡觉:(父类)捉老鼠:跳高:(抽象)狗:成员属性:名称:(父类)性别:(父类)年龄:(父类)成员方法:吃饭:(抽象)睡觉:(父类)看门:跳高:(抽象)*//*接口:1.说英语:IEnglish抽象方法:voidspeakEnglish();抽象类:1.Person成员属性:姓名:性别:年龄:实现的方法:睡觉:抽象方法:吃饭:(抽象)2.运动员extendsPerson重写的方法:吃饭:自定义方法:训练:(抽象)3.教练员extendsPerson重写的方法:吃饭:自定义方法:教学:(抽象)具体类:1.乒乓球运动员exnteds运动员implementsIEnglish重写的方法:训练:speakEnglish();2.篮球运动员extends运动员重写的方法:训练:3.乒乓球教练extends教练员implementsIEnglish重写的方法:教学:speakEnglish();4.篮球教练extends教练员重写的方法:教学:*//*类名作为形式参数://当类名作为形参时,表示:可以接收一个此类型(及其子类)对象的引用//调用方可以传递实参://1.Student对象的引用;//2.Student子类对象的引用;多态//3.null;(可以赋给任何的引用类型)抽象类名作为形式参数://一个方法形参如果是抽象类类型的,可以传递//1.它的任何子类对象的引用;//2.null接口名作为形式参数://一个方法的形参,是接口类型,可以接收://1.IA子类对象的引用;//2.null类名作为方法的返回值://方法的返回值是一个类类型,它可以返回://1.此类对象的引用;//2.此类子类对象的引用;//3.null抽象类名作为返回值类型://此方法返回一个Person类型的引用,它可能会返回什么?//1.此类的子类对象的引用;//2.null;接口名作为返回值类型//接口名作为方法的返回值,可以返回://1.此接口的子类对象的引用;//2.null;*///链式编程:优点:简单;缺点:对象都是匿名对象,只能用一次;
本文标题:Java基础课程笔记
链接地址:https://www.777doc.com/doc-2880852 .html