您好,欢迎访问三七文档
11.1引言11.2父类和子类11.3使用super11.4方法覆盖11.5覆盖和重载11.6Object的toString()方法常被覆盖11.7-8多态性、动态绑定和一般程序设计11.9对象转换和instanceof运算符11.9对象引用的类型转换和instanceof运算符11.10Object类的equals()方法常常需要被覆盖11.11数组线性表ArrayList类11.12对ArrayList有用的方法11.13用数组线性表类ArrayList来自定义存储任意对象的栈类11.14Protected数据和方法11.15final防止扩展和重写补充:11.15数据域和静态方法的隐藏补充:11.16初始化模块第11章继承和多态11.1引言动物类层次举例一般具体动物蛇蜥蜴鲸爬行动物哺乳动物狗巨蜥壁虎壁虎是一种蜥蜴爬行动物是动物的一种最顶端的类是Object,它在java.lang中定义,是所有类的始祖。一个类可以有多个子类,也可以没有子类,但它必定有一个父类(Object除外)。11.2父类和子类parentclass父类子类childclassbaseclass基类派生类derivedclasssuperclass超类次类subclass扩展类extendedclass继承:子类从父类中继承可访问的数据域和方法,也可以添加新数据域和新方法。publicclassA{publicinta=10;protectedintb=20;intc=30;privateintd=40;publicintgetD(){returnd;}}publicclassBextendsA{publicinte;publicvoidtryVariables(){System.out.println(a);//允许System.out.println(b);//允许System.out.println(c);//同包则允许System.out.println(d);//不允许System.out.println(getD());//允许}}不能继承访问权限为private的成员变量和方法注意:1、子类可以继承父类中可访问的【访问权限设定为public,protected或无权限修饰符(若同包)】成员变量和方法。但是不能继承访问权限为private的成员变量和方法。2、父类的构造方法不能被子类继承。3、一个类只能有一个直接父类。4、父类包括所有直接或间接被继承的类。5、子类和父类的关系为isaclassBextendsA{}classA{}publicclassPerson{publicStringname;publicStringgetName(){returnname;}}publicclassEmployeeextendsPerson{publicintemployeeNumber;publicintgetEmployeeNumber(){returnemployeeNumber;}}publicclassManagerextendsEmployee{publicStringresponsibilities;publicStringgetResponsibilities(){returnresponsibilities;}}Manager继承了Employee、Person和Object类GeometricObject---colorfilleddateCreated:String:boolean:Date+++++getColor()setColor(Stringcolor)isFilled()setFilled(booleanfilled)getDateCreated():String:void:boolean:void:DateCircle-radius:double+++++++Circle()Circle(doubleradius)getRadius()setRadius(doubleradius)getArea()getPerimeter()getDiameter():double:void:double:double:doubleRectangle--widthheight:double:double++++++++Rectangle()Rectangle(doublewidth,doubleheight)getWidth()setWidth(doublewidth)getHeight()setHeight(doubleheight)getArea()getPerimeter():double:void:double:void:double:double三个类的UML表示Color补充:继承的本质classA{privateintx=1;inty;voidprintX(){System.out.println(x);}}classBextendsA{intz;}publicclassTest{publicstaticvoidmain(String[]s){Bb=newB();b.printX();}}x=1y=0printX()z=0bB类对象A类对象Object类对象toString()clone()其它…11.3使用superthis用途1:成员变量和局部变量重名时this.用途2:构造方法中调用另一构造方法,简化代码。如this(参数)Super(firstline)用途1:使用从父类继承来的被隐藏属性super.变量使用从父类继承来的方法也可间接访问这些属性用途2:子类构造方法中调用父类的构造方法super()super(参数)用途3:调用父类的普通方法super.方法(参数)11.3.1在子类构造方法中调用父类的构造方法构造方法不会被继承调用父类的构造方法必须用super,而且必须是构造方法的第一条语句语法:super()或super(参数)classPerson{Stringname;intid;//身份证号Student(Stringname,intid){this.name=name;this.id=id;}}classUniStudentextendsPerson{Stringuniversity;Stringschool;UniStudent(Stringname,intid){this(name,id,“西南大学”,“计信院);//此行删除编译错}UniStudent(Stringname,intid,Stringuniversity,Stringschool){super(name,id);//此行删除编译错this.university=university;this.school=school;}}publicclassTest{publicstaticvoidmain(String[]arguments){UniStudents=newUniStudent(张三,201622);}}说明:1、每一个构造方法,如果既没有用this(可能有参数)来调用本类的另一个构造方法,也没有用super(可能有参数)来调用父类的某个构造方法,那么,编译器将在其第一行为它添加super(),以此来调用父类的无参构造方法。2、构造方法中,this()或者super()必须是第一条语句。所以,this()和super()不可能并存,也不可能有两条this()或两条super()。利用super可以调用父类的构造函数–super(参数)调用父类的的构造函数。–必须是子类构造函数的第一条语句。–如果子类构造函数中没有显式地调用父类的构造函数,那么将自动调用父类的无参构造函数。这就是为什么先构造父类,再构造子类–父类的构造函数在子类构造函数之前执行。调用父类的成员–super.data(如果父类属性在子类可访问)–super.method(parameters)(如果父类方法在子类可访问)Circle代码里可以写getDateCreated()或super.getDateCreated()不能使用super.super.p()这样的super链11.3.2构造方法链子类A无构造方法publicA(){super();}publicA(){}publicA(){super();}publicA(参数){super();语句}publicA(参数){语句;}自动添加无参构造方法自动添加自动添加等价于等价于等价于没有this()没有super()没有this()没有super()构造方法链在任何情况下,构造一个类的实例时,会沿着继承链调用所有父类的构造方法,这叫构造方法链。Example:ConstructorDemo.javaCBACBA继承链构造链如果要构造C类对象父类子类缺少无参构造函数的后果classFruit{publicFruit(Stringname){System.out.println(调用Fruit的构造函数);}}classAppleextendsFruit{}父类没有无参构造函数,但子类没有定义构造函数,所以子类Apple的无参构造函数会调用父类的无参构造函数,所以程序不能编译。classA{A(){System.out.println(A);}}classBextendsA{B(){System.out.println(B);}}classCextendsB{C(){System.out.println(C);}}classTest{publicstaticvoidmain(String[]args){newC();newB();}}课堂提问11.3.3调用父类的一般方法publicclassPerson{publicStringname;publicStringgetName(){returnname;}}publicclassEmployeeextendsPerson{publicintemployeeNumber;publicvoidprint(){System.out.print(super.getName()+employeeNumber);}}这里super.常省略11.4方法重写/覆盖方法覆盖的哲学涵义:子类对象当然可以修改父类的行为变量的隐藏:子类中声明了与父类中相同的成员变量名,则从父类继承的变量将被隐藏子类拥有了两个相同名字的变量,一个继承自父类,另一个由自己声明静态方法的隐藏:子类中声明了与父类中相同的静态方法实例方法的覆盖:子类修改(重写)了父类中定义的方法。父类的被覆盖方法仍然存在子类中用super.方法()来调用父类中的方法(包括被覆盖方法)子类对象.super.方法()是语法错super.super.方法()也是语法错override(覆盖)的说明:override就是在类的继承过程中发生的方法覆盖。一旦父类中的方法被覆盖,则不能通过子类对象访问被覆盖的父类方法。在子类类体中可以使用super引用被覆盖的父类方法。发生覆盖的条件:1、覆盖的方法的方法名称和参数类型必须要和被覆盖的方法的标志完全匹配,才能达到覆盖的效果;2、覆盖的方法的返回值必须和被覆盖的方法的返回一致;3、覆盖的方法所抛出的异常必须和被覆盖方法的所抛出的异常一致,或者是其子类,或者什么也不抛出;4、被覆盖的方法不能为private,否则在其子类中只是新定义了一个方法,并没有对其进行覆盖。override(覆盖)的说明(续):5、覆盖的方法的访问权限必须大于等于被覆盖方法的访问权限。例如:被覆盖方法的访问权限是“无”,那么覆盖的方法的访问权限可以是“无”、protected、public。6、被覆盖的方法不能是final类型的,因为final类型的方法就是声明不能被覆盖。但是覆盖的方法可以是final类型的,不会影响覆盖效果。7、静态的方法不会发生覆盖。所以如果父类中的方法为静态的,而子类中的方法不是静态的,但是两个方法除了这一点外其他都满足覆盖条件,那么会发生编译错误。反之亦然。即
本文标题:java-继承
链接地址:https://www.777doc.com/doc-1877392 .html