第八章 继承、抽象类和接口.ppt
《第八章 继承、抽象类和接口.ppt》由会员分享,可在线阅读,更多相关《第八章 继承、抽象类和接口.ppt(109页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第八章 继承、抽象类和接口本章主要内容n子类的创建n在子类中访问父类成员n覆盖父类的方法n抽象类和抽象方法n接口及接口的实现n利用接口实现类的多重继承n内部类的匿名类n包(类库)继承n继承是一种由已有类创建新类的机制。n利用继承,可以先创建一个公共属性的一般类,根据一般类在创建一个具有特殊属性的新类。n新类继承一般类的状态和行为,并根据需要增加自己的新的状态和行为。多层继承多层继承Person 类类Student 类类Worker类类小学生小学生 类类中学生中学生 类类 大学生大学生 类类 IT业业 工人类工人类其他业其他业 工人类工人类IT-java-类类IT-C-类类IT业业 其他其他 类
2、类8.1 类的继承n一个类从另一个类派生出来的过程叫继承n被继承的类称为基类(超类)n执行该继承的类称为子类(派生类)v继承是面向对象编程技术的一块基继承是面向对象编程技术的一块基石,它允许创建分等级层次的类。石,它允许创建分等级层次的类。v运用继承,可以创建一个通用类定运用继承,可以创建一个通用类定义一系列一般特性。该类可以被更具义一系列一般特性。该类可以被更具体的类继承体的类继承vPersonPerson是父类;定义了是父类;定义了name/agename/age两个两个属性,属性,getInfogetInfo()()方法方法vStudent/Student/WorderWorder分别是
3、其的两个子分别是其的两个子类,除了已有的类,除了已有的name/age/name/age/getInfogetInfo以外,以外,还有自己的特有的属性和方法还有自己的特有的属性和方法PersonString nameint ageString getInfo()StudentString nameint ageString schoolString getInfo()String getSchool()WorkerString nameint ageString CompanyString getInfo()String getCompany()继承继承继承的实现继承的实现n通过extends
4、关键字来实现类间的继承关系n声明一个继承父类的类的通常形式如下:qclass subclass-name extends superclass-name /类体类体 注意注意:没有extends,默认父类为java.lang.Object只能有一个父类,即单继承子类继承父类的全部成员(方法和属性),除private的成员/方法和父类的构造方法classPersonprivateStringname;privateintage;publicPerson()System.out.println(调用了人类的构造方法Person());publicvoidSetNameAge(Stringname,
5、intage)this.name=name;this.age=age;publicvoidshow()System.out.println(姓名:+name+年龄:+age);classStudentextendsPersonprivateStringdepartment;publicStudent()System.out.println(调用了学生类的构造方法Student();publicvoidSetDepartment(Stringdep)department=dep;System.out.println(我是+department+的学生);publicclassapp8_1publ
6、icstaticvoidmain(Stringargs)Studentstu=newStudent();stu.SetNameAge(张小三,21);stu.show();stu.SetDepartment(计算机科学系);nJava程序在执行子类的构造方法之前,会先自动调用父类中没有参数的构造函数,其目的是为了帮助继承自父类的成员做初始化的操作。调用父类中特定的构造函数class Person private String name;private int age;public Person()System.out.println(调用了人类的构造方法调用了人类的构造方法Person()()
7、);public Person(String name,int age)System.out.println(调用了人类的构造方法调用了人类的构造方法Person()());this.name=name;this.age=age;public void show()System.out.println(姓名:姓名:+name+年龄:年龄:+age);classStudentextendsPersonprivateStringdepartment;publicStudent()System.out.println(调用了学生类的构造方法Student();publicStudent(String
8、name,intage,Stringdep)super(name,age);department=dep;System.out.println(我是+department+的学生);System.out.println(“调用了学生类的有参构造方法Student(Stringname,intage,Stringdep);publicclassapp8_1publicstaticvoidmain(Stringargs)Studentstu=newStudent();/调用父类的无参构造函数stu.show();Studentstu2=newStudent(张小三,21,计算机科学系);/调用父类
9、的有参构造函数stu2.show();super用来引用当前对象的父类,this用来引用当前对象,注意n调用父类构造方法的super()语句必须写在子类构造方法的第一行,否则编译时出错。n在子类中访问父类的构造方法,其格式为super(参数列表),super()可以重载。nJava程序在执行子类的构造方法之前,如果没有super()调用父类中特定的构造方法,则会先调用父类中“没有参数的构造方法”。nsuper()是从子类的构造方法调用父类的构造方法,而this()是在一个类内部调用其他的构造方法。nsuper()和this()必须放在构造方法内的第一行,并且super()和this()不能同时
10、存在一个构造方法内。n在静态方法不能使用super()和this()。在子类中访问父类的成员n使用使用super可以可以访问父类的构造方法访问父类的构造方法,还可以,还可以访问父类的成员变量和成员方法访问父类的成员变量和成员方法,但,但不能访问不能访问在子类中添加的成员。在子类中添加的成员。nsuper.变量名变量名nsuper.方法名方法名classPersonprotectedStringname;protectedintage;publicPerson()System.out.println(调用了人类的构造方法Person());publicPerson(Stringname,inta
11、ge)System.out.println(调用了人类的构造方法Person());this.name=name;this.age=age;publicvoidshow()System.out.println(姓名:+name+年龄:+age);classStudentextendsPersonprivateStringdepartment;intage=20;publicStudent(Stringxm,Stringdep)name=xm;department=dep;super.age=25;System.out.println(子类Student中的成员变量age:+age);super
12、.show();System.out.println(系别+department);publicclassapp8_3publicstaticvoidmain(Stringargs)Studentstu=newStudent(李小双,计科系);classStudentextendsPersonprivateStringdepartment;intage=20;/子类的成员变量publicStudent(Stringxm,Stringdep)super.name=xm;department=dep;age=3;super.age=25;/父类的成员变量System.out.println(子类S
13、tudent中的成员变量age:+age);super.show();System.out.println(系别+department);classPersonprotectedStringname;protectedintage;n无法在子类(类外)访问父类中的private成员n将父类中的成员声明为protected(保护成员),则可以在父类中直接访问,也可以在其子类中访问。覆盖n重载重载是指在是指在同一类同一类中定义名称相同,但参数个中定义名称相同,但参数个数或类型不同的方法。数或类型不同的方法。n覆盖覆盖是指在是指在子类中,定义名称、参数个数、类子类中,定义名称、参数个数、类型与父类完
14、全相同的方法,型与父类完全相同的方法,用以重写父类里同用以重写父类里同名方法的功能。名方法的功能。v 覆盖和重载是覆盖和重载是JAVAJAVA中实中实现多态性的两种方法现多态性的两种方法覆盖父类的方法n子类继承父类中所有可被访问的成员方法时,如果子类的方法与父类的方法同名,则不能继承,此时子类的方法覆盖父类的方法。n子类中不能覆盖父类中声明为final或static的方法。classPersonprotectedStringname;protectedintage;publicPerson(Stringname,intage)this.name=name;this.age=age;protec
15、tedvoidshow()System.out.println(姓名:+name+年龄:+age);classStudentextendsPersonprivateStringdepartment;publicStudent(Stringname,intage,Stringdep)super(name,age);department=dep;protectedvoidshow()System.out.println(系别+department);publicclassapp8_4publicstaticvoidmain(Stringargs)Studentstu=newStudent(李小双,
16、20,计科系);stu.show();n注意点:q如果在子类中想调用父类中的那个被重写的方法,我们可以用super.方法的格式。q重写方法时,不能使用比父类中被重写的方法更严格的访问权限。npublic-protected-default-private(高到低)用父类的变量访问子类的成员n通过父类的变量访问子类的成员,只限于“覆盖”的情况发生时。不可被继承的成员与最终类final关键字关键字nJava中声明类、属性和方法时,可使用关键字final来修饰。qfinal标记的类不能被继承最终类。qfinal标记的方法不能被子类覆盖。qfinal标记的变量(成员变量或局部变量)即成为常量,只能赋值
17、一次。qpublicstaticfinal共同标记常量时,这个常量就成了全局的常量。npublicstaticfinalintMAXCOUNT=10;nfinalStingNAME=“SUN”;v finalfinal标明某一个对象标明某一个对象(类,属性,方法)是(类,属性,方法)是固定不变的。固定不变的。finalclassAAAstaticfinaldoublepi=3.14;publicfinalvoidshow()System.out.println(pi=+pi);classBBBextendsAAAprivateintnum=100;publicvoidshow()System.
18、out.println(num=+num);publicvoidchange()super.pi=5;publicclassapp8_6publicstaticvoidmain(Stringargs)BBBex=newBBB();ex.show();ex.change();Object类nObject类是java中所有类顶级父类。q如果一个类没有明显的使用extends继承另一个父类,则默认是继承了Object类。qObject类中的方法如果在子类没有被覆盖的话,则默认使用的是Object中的方法。Object类常用方法方法功能publicBooleanequals(Objectobj)判断两
19、个对象变量所指的是否为同一个对象publicStringtoString()将调用toString()方法的对象转换成字符串publicfinalClassgetClass()返回调用getClass()方法的对象所属的类protectedObjectclone()返回调用该方法的对象的一个副本classAinta=1;publicclassapp8_7publicstaticvoidmain(Stringargs)Aobj1=newA();Aobj2=newA();Strings1,s2,s3=abc,s4=abc;s1=newString(abc);s2=newString(abc);Sy
20、stem.out.println(s1.equals(s2)是+(s1.equals(s2);System.out.println(s1=s3是+(s1=s3);System.out.println(s1.equals(s3)是+(s1.equals(s3);System.out.println(s3=s4是+(s3=s4);System.out.println(s2.equals(s3)是+(s2.equals(s3);System.out.println(s1=s2是+(s1=s2);System.out.println(obj1=obj2是+(obj1=obj2);System.out.
21、println(obj1.equals(obj2)是+obj1.equals(obj2);obj1=obj2;System.out.println(obj1=obj2是+(obj1=obj2);System.out.println(obj1.equals(obj2)是+obj1.equals(obj2);“=”用于比较两个变量本身的值,即两个对象在内存中的地址用于比较两个变量本身的值,即两个对象在内存中的地址“=”和和“equals()()”对于非字符串类型的变量来说比较在堆内存的对于非字符串类型的变量来说比较在堆内存的首地址;用来比较两个类变量时,比较两个类变量是否指向同一个对象首地址;用来
22、比较两个类变量时,比较两个类变量是否指向同一个对象classPersonprotectedStringname;publicPerson(Stringxm)name=xm;publicclassapp8_8publicstaticvoidmain(Stringargs)Personper=newPerson(张三);Classobj=per.getClass();System.out.println(对象per所属的类为:+obj);n语法格式:q对象instanceof类(或接口)n返回值为布尔值,真true或假false;qStrings=“abc”;nIf(sinstanceofStri
23、ng)qPersonp=newPerson();npinstanceofPersonqStudentstu=newStudent();nstuinstanceofStudent对象运算符instanceofinstanceofinstanceof 操作符可以用操作符可以用操作符可以用操作符可以用它来判断一个实例对象它来判断一个实例对象它来判断一个实例对象它来判断一个实例对象是否属于一个类是否属于一个类是否属于一个类是否属于一个类npublicclassPersonnnstaticintcount=0;nprotectedStringname;nprotectedintage;npublicPe
24、rson(Strings1,inta1)nnname=s1;nage=a1;nthis.count+;nnpublicStringtoString()nnreturnthis.name+,+this.age;nnpublicvoiddisplay()nnSystem.out.print(本类名=+this.getClass().getName()+;);nSystem.out.println(本类名=+this.getClass().getSuperclass().getName()+;);nSystem.out.print(Person.count+this.count+);nSystem.
25、out.print(Student.count+Student.count+);nObjectobj=this;nif(objinstanceofPerson)nSystem.out.print(obj.toString()+是Person的对象);nnnclassStudentextendsPersonnnstaticintcount=0;nprotectedStringdept;nprotectedStudent(Stringn1,inta1,Stringd1)nnsuper(n1,a1);ndept=d1;nthis.count+;nnpublicStringtoString()nnre
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第八章 继承、抽象类和接口 第八 继承 抽象 接口
限制150内