JAVA程序设计模块四-类的继承和多态资料_第1页
JAVA程序设计模块四-类的继承和多态资料_第2页
JAVA程序设计模块四-类的继承和多态资料_第3页
JAVA程序设计模块四-类的继承和多态资料_第4页
JAVA程序设计模块四-类的继承和多态资料_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

旅游信息学院 JAVA语言程序设计 软件技术教研室JAVA语言程序设计JAVA程序设计模块四 ---类的继承和多态一、教学章节模块四 类的继承和多态二、教学知识点1:继承的特点2:运用Java语言实现继承3:重载与重写的区别4:运用Java程序实现多态5:Java的继承机制6:final 关键字和abstract 关键字三、教学目的和要求任务一:理解继承及其特点任务二:运用 Java语言实现继承任务三:理解重载与重写的区别任务四:运用 Java程序实现多态任务五:掌握 Java的继承机制任务六:掌握 final 关键字和abstract 关键字四、主要仪器设备1、笔记本电脑及相应的 WindowsOperatingSystems.2、已安装的JDK7.0和jcreator或MyEclipse软件。五、教学内容任务一:理解继承及其特点一、 继承的引入案例演示:classPerson{privateStringname;privateintage;publicvoidsetName(Stringname){=name;}publicvoidsetAge(intage){1旅游信息学院 JAVA语言程序设计 软件技术教研室this.age=age;}publicStringgetName(){;}publicintgetAge(){returnthis.age;}}classStudent{privateStringname;privateintage;privateStringschool;publicvoidsetName(Stringname){=name;}publicvoidsetAge(intage){this.age=age;}publicvoidsetSchool(Stringschool){this.school=school;}publicStringgetName(){;}publicintgetAge(){returnthis.age;}publicStringgetSchool(){returnthis.school;2旅游信息学院 JAVA语言程序设计 软件技术教研室}}说明:从这样的两个类中可以发现,代码的重复过多,直接从Student类中就可以发现重复的代码。因为按照以前学习的概念,如果要定义这样的类,则只能采用此种方式。从实际中可以发现学生是一个人,学生比人多了一个属性,两个方法,也就是所学生要比人的定义更多,那么这个时候就可以使用继承的概念。二、继承的概念面向对象程序设计中,在已有类的基础上定义新类,而不需要把已有类的内容重新书写一遍,这就叫做继承。已有类称为基类或父类,在此基础上建立的新类称为派生类或子类。继承关系可以描述为:子类继承了父类或父类被子类继承。 子类与父类建立继承关系后,子类也就拥有了父类的非私有的成员属性和成员方法, 同时还可以拥有自己的属性和方法。三、继承的特点继承实现方式注解:Java只允许单继承,而不允许多重继承,也就是说一个子类只能有一个父类;如果子类继承了父类,则子类自动具有父类的全部的属性和成员方法(功能),但对于继承过来的私有属性,在子类中只能通过调用父类的共有方法来设置或访问;子类可以定义自己的数据成员和成员函数,同时也可以修改父类的数据成员或重写父类的方法;Java中却允许多层继承。例如,子类A可以有父类B,父类B同样也可以再拥有父类C。因此子类都是“相对”的;5.在Java中,Object类为特殊超类或基类,所有的类都直接或间接地继承 Object。任务二:运用Java语言实现继承一、继承的实现继承的英文翻译为 inherit,但是由继承定义可以看出子类实际上是扩展了父类, 因此Java中继承是通过关键字“extends”来实现的。关键字“extends”说明要构建一个新类而新类是从一个已经存在的类中衍生出来的。格式如下:3旅游信息学院 JAVA语言程序设计 软件技术教研室[修饰符] class 子类名 [extends父类]案例演示1:classPerson{Stringname;int age;char sex;publicvoidshow(){姓名:"+name+"年龄:"+age+" 性别:"+sex);}}classStudentextendsPerson{int sno;String department;}publicclassTestStudent{publicstaticvoidmain(String[]args){Studentst=newStudent();="张三";st.age=18;st.sex='男';st.sno=201001;st.department="软件专业";st.show();}}案例演示2():classPerson{privateStringname;4旅游信息学院 JAVA语言程序设计 软件技术教研室privateintage;publicvoidsetName(Stringname){=name;}publicvoidsetAge(intage){this.age=age;}publicStringgetName(){;}publicintgetAge(){returnthis.age;}};classStudentextendsPerson{}publicclassExtDemo02{publicstaticvoidmain(Stringargs[]){Studentstu=newStudent();// 学生stu.setName("张三"); //从Person继承而来stu.setAge(30); //从Person继承而来姓名:"+stu.getName());年龄:"+stu.getAge());}}案例演示(子类可以添加自己的属性和行为) :classPerson{privateStringname;privateintage;5旅游信息学院 JAVA语言程序设计 软件技术教研室publicvoidsetName(Stringname){=name;}publicvoidsetAge(intage){this.age=age;}publicStringgetName(){;}publicintgetAge(){returnthis.age;}};classStudentextendsPerson{privateStringschool; //扩充的属性publicvoidsetSchool(Stringschool){this.school=school;}publicStringgetSchool(){returnthis.school;}}publicclassTestStudent{publicstaticvoidmain(Stringargs[]){Studentstu=newStudent();// 学生stu.setName("张三"); //从Person继承而来stu.setAge(30); //从Person继承而来stu.setSchool("清华大学"); //自己定义的方法姓名:"+stu.getName());年龄:"+stu.getAge());6旅游信息学院 JAVA语言程序设计 软件技术教研室学校:"+stu.getSchool());}}二、 构造方法的继承1、基于父类创建子类时,如果基于子类创建了一个对象,则程序运行时,系统会首先调用父类的无参构造方法, 然后才会执行子类的构造方法。 如果希望调用父类的有参构造方法,可使用 super关键字。案例演示:classPersonA{Stringname; //声明两个成员变量intage;//无构造方法publicPersonA(){="personname";this.age=23;}//有参构造方法publicPersonA(Stringname,intage){=name;this.age=age;}//成员方法publicvoidpprint(){ Name:"++" age:"+this.age);}}classStudentAextendsPersonA{String name; //在派生类中声明自己的成员变量int classno; //声明新的成员变量7旅游信息学院 JAVA语言程序设计 软件技术教研室//无参构造方法publicStudentA(){super("xyz",30); //调用父类的有参构造方法="studentname";this.age=20;}//有参构造方法publicStudentA(Stringname,intage,intclassno){super(name,age); //调用父类的有参构造方法=name;this.age=age;this.classno=classno;}//子类的成员方法publicvoidsprint(){ Name:"++" age:"+this.age+" classno:"+this.classno);父类中的name成员变量"+);}}publicclassTestStudent{publicstaticvoidmain(Stringargs[]){StudentAobj1=newStudentA();//调用无参构造方法创建对象StudentAobj2=new StudentA("张三",18,1); //调用有参构造方法创建对象obj1.pprint(); //调用父类的成员方法obj1.sprint(); //调用子类的成员方法obj2.pprint(); //调用父类的成员方法obj2.sprint(); //调用子类的成员方法}}8旅游信息学院 JAVA语言程序设计 软件技术教研室总体而言,构造方法的继承遵循以下原则:(1)子类无条件地继承父类的无参构造方法。(2)如果子类没有定义构造方法,则它将继承父类无参构造方法作为自己的无参构造方法,如果子类定义了构造方法,则在创建子类对象时,将先执行来自父类的无参构造方法,然后再执行自己的构造方法。(3)对于父类带参数的构造方法,子类可以通过在自己的构造方法中使用 super关键字来调用它,但这个调用语句必须是子类构造方法中的第一条可执行语句。2、super关键字如果子类中定义的成员变量和父类中的成员变量同名时,子类就隐藏了从父类继承的成员变量。当子类中定义了一个方法,并且这个方法的名字、返回类型和参数列表和父类的某个方法完全相同,子类从父类继承的这个方法将被隐藏。如果在子类中向使用被子类隐藏的成员变量或方法就可以使用关键字super。在Java语言中,super代表当前对象的直接父类对象,其使用格式如下:访问父类的无参构造方法:super();访问父类的有参构造方法:super(参数列表);访问父类的成员变量:super。成员变量名称;案例演示(使用关键字 super调用父类的构造方法):子类不继承父类的构造方法,因此,子类如果想使用父类的构造方法,必须在子类的构造方法中使用,并且必须使用关键字super来表示,而且super必须是子类构造方法中的头一条语句。classStudent{intnumber;Stringname;publicStudent(){}publicStudent(intnumber,Stringname){;9旅游信息学院 JAVA语言程序设计 软件技术教研室this.number=number;=name; "+number);}}classUniver_StudentextendsStudent{String marry;publicUniver_Student(intnumber,Stringname,Stringmarry){super(number,name);this.marry=marry;婚否="+marry);}}publicclassDemo5{publicstaticvoidmain(String[]args){Univer_Studentzhang=newUniver_Student(9001,"王萍","未婚");}}需要注意的是:如果在子类的构造方法中,没有使用关键字 super调用父类的某个构造方法,那么默认有 super()语句,即调用父类的不带参数的构造方法。如果类里定义了一个或多个构造方法,那么 Java不提供默认的构造方法(不带参数的构造方法),因此,当在父类中定义多个构造方法是,应当包括一个不带参数的构造方法,以防子类省略super时出现错误。2、使用关键字super操作被隐藏的成员变量和方法如果在子类中想使用被子类隐藏了的父类的成员变量或方法就可以使用关键字super,比如super.x或super.play();就是被子类隐藏的父类的成员变量 x和方法play()。案例演示:classSum{intn;10旅游信息学院 JAVA语言程序设计 软件技术教研室publicfloatf(){floatsum=0;for(inti=1;i<=n;i++){sum=sum+i;}returnsum;}}classAverageextendsSum{intn;publicfloatf(){floatc;super.n=n;c=super.f();returnc/n;}publicfloatg(){floatc;c=super.f();returnc/n;}}publicclassDemo6{publicstaticvoidmain(String[]args){Averageaver=newAverage();aver.n=100;floatresult_1=aver.f();floatresult_2=aver.g();11旅游信息学院 JAVA语言程序设计 软件技术教研室}}三、 成员变量的继承与隐藏基于父类创建子类时,子类可以继承父类的成员变量和方法。但是,如果在父类和子类中同时声明了一个同名变量,则这两个变量在程序运行时同时存在,也就是说,子类和使用父类的同名变量时,父类中的同名变量被隐藏。案例演示:classPerson{Stringname; //声明两个成员变量intage;//无构造方法publicPerson(){="personname";this.age=23;}//有参构造方法publicPerson(Stringname,intage){=name;this.age=age;}//成员方法publicvoidpprint(){ Name:"++" age:"+this.age);}}classStudentextendsPerson{String name; //在派生类中声明自己的成员变量int classno; //声明新的成员变量//无参构造方法publicStudent(){12旅游信息学院 JAVA语言程序设计 软件技术教研室="studentname";this.age=20;}//有参构造方法publicStudent(Stringname,intae,intclassno){=name;this.age=age;this.classno=classno;}//子类的成员方法publicvoidsprint(){Name:"++"age:"+this.age+"classno:"+this.classno);}}publicclassTestStudent{publicstaticvoidmain(Stringargs[]){Studentobj1=newStudent(); //调用无参构造方法创建对象Studentobj2=new Student("张三",18,1); //调用有参构造方法创建对象obj1.pprint(); //调用父类的成员方法obj1.sprint(); //调用子类的成员方法obj2.pprint(); //调用父类的成员方法obj2.sprint(); //调用子类的成员方法}}说明:(1)由于Student子类中未定义成员变量 age,因此该成员变量源自其父类,这说明子类课继承父类的成员变量。(2)Name变量同时在父类和子类中进行了声明,当通过Studentobj1=newStudent()语言创建对象obj1时,系统会首先调用父类的无参构造13旅游信息学院 JAVA语言程序设计 软件技术教研室方法,然后调用子类的无参构造方法,故父类中的 name被赋值personname,子类中的name被赋值 studentname,而公共成员变量 age被赋值 20.另外,由于子类成员变量classno未被显示赋值,故其系统自动为其初始化默认值 0这说明,如果一个成员变量同时在父类和子类中定义,那么,创建对象后,它们是同时存在的,并且父类中的成员变量用于父类方法,子类中的成员变量用于子类方法,互不干扰,因此我们说,当子类中定义了与父类类型和名称都相同的成员变量时,子类从父类继承的成员变量将被隐藏。4、方法的继承与覆盖子类可以继承父类中所有可以被子类访问的成员方法,但是如果子类重新定义了从父类继承来的方法,此时父类的这个方法在子类中将不复存在, 此时成为子类方法覆盖了父类的方法,简称方法的覆盖( override).方法的覆盖为子类提供了修改父类方法的能力,进而实现自身的行为。案例演示:基于父类创建子类时,子类可以继承父类的成员方法。但是,如果在父类和子类中同时定义了一个同名、同类型、同参数的方法,则程序运行时父类中的同名方法将被子类中的同名方法覆盖。classParentClass{publicvoidpprint(){this.print();this.print1(0);}publicvoidprint(){父类:同类型、同名、同参数成员方法! ");}publicvoidprint1(inta){父类:同类型、同名、但参数不同的成员方法! ");}}classSubClassextendsParentClass{14旅游信息学院 JAVA语言程序设计 软件技术教研室publicvoidsprint(){ //定义新的成员方法this.print();this.print1();}publicvoidprint(){子类:同类型、同名、同参数成员方法! ");}publicvoidprint1(){子类:同类型、同名、但参数不同的成员方法! ");}}publicclassDemo7{publicstaticvoidmain(String[]args){SubClassobj=newSubClass();obj.pprint(); //调用父类的成员方法obj.sprint(); //调用子类的成员方法}}结论:(1)使用子类创建对象时,可以直接引用父类中的方法, ,这体现了继承性。(2)要使子类中的方法完全覆盖父类中的方法,方法的类型、名称和参数必须完全相同,否则,任何一项不同均不能覆盖。(3)方法覆盖于成员变量隐藏的不同之处在于:子类隐藏父类的成员变量只能使之不可见,父类的同名成员变量在子类对象中仍然拥有自己独立的内存空间,而子类方法对父类方法的覆盖将清除父类方法占用的内存空间,从而使父类方法在子类对象中不复存在。(4)此外,子类不能覆盖父类中的 final方法和static方法,但可以隐藏这类方法,即在子类中声明与父类同名的 final或static方法。任务三:理解重载与重写的区别15旅游信息学院 JAVA语言程序设计 软件技术教研室1:方法的重载在Java中,可以在一个类中用相同的名称定义两个或多个方法,但参数项不同。当两个方法名称相同而参数项不同时,就认为此方法被重载,而此过程称为“方法重载”。调用重载方法时,Java将尝试调用一个参数类型和数量与此方法的阐述类型和数量相匹配的方法。如果不完全匹配,Java的自动类型转换功能将解决此问题并调用正确的重载方法。重载的要求:1)方法重载是让类以统一的方式处理不同类型数据的一种手段。多个同名函数同时存在,具有不同的参数个数/类型。重载Overloading是一个类中多态性的一种表现。2)Java的方法重载,就是在类中可以创建多个方法,它们具有相同的名字,但具有不同的参数和不同的定义。调用方法时通过传递给它们的不同参数个数和参数类型来决定具体使用哪个方法,这就是多态性。3)重载的时候,方法名要一样,但是参数类型和个数不一样,返回值类型可以相同也可以不相同。无法以返回型别作为重载函数的区分标准。案例演示:publicclassDog{Dog(){this.bark();}voidbark(){ //bark()方法是重载方法this.bark("female",3.4);}voidbark(Stringm,doublel){//注意:重载的方法的返回值都是一样的,this.bark(5,"China");}voidbark(inta,Stringn){//不能以返回值区分重载方法,而只能以“参数类型”和“类名”来区分16旅游信息学院 JAVA语言程序设计 软件技术教研室}publicstaticvoidmain(String[]args){Dogdog=newDog();dog.bark();dog.bark("male",15);dog.bark(5,"China");}}2:方法的重写如果在子类中定义的一个方法,其名称、返回值类型和参数列表正好与父类中的某个方法的名称、返回值类型和参数列表相匹配, 那么可以说,子类的方法重写了父类的方法。在类体系结构中,当子类中的方法与其父类中的方法具有相同的方法名时, 则认为子类中的方法重写了父类中的方法。 从子类中调用重写方法时,将总是调用出现在子类中的方法,而父类中的方法被隐藏。(1)重写方法的参数列表必须与被覆盖重写的方法完全新相同, 否则不是重写而是重载。方法重写又称方法覆盖。(2)重写的方法访问修饰符一定要大于被重写方法的访问修饰符,即保证public>protected>default>private;3)重写方法的返回值必须和被重写的方法的返回值一致;4)重写的方法抛出异常的异常必须和被重写的方法所抛出的异常一致,或者是该异常的子类;5)被重写的方法不能为private,否则在其子类中只是重新定义了一个方法,而并没有对其进行重写;6)静态方法不能被重写为非静态方法,否则会编译出错。案例演示:classPerson{privateStringname;privateintage;17旅游信息学院 JAVA语言程序设计 软件技术教研室publicvoidsetName(Stringname){=name;}publicvoidsetAge(intage){this.age=age;}publicStringgetName(){returnname;}publicintgetAge(){returnage;}publicStringgetInfo(){return"Name:"+name+"\n"+"age:"+age;}}classStudentextendsPerson{privateStringschool;publicStringgetSchool(){returnschool;}publicvoidsetSchool(Stringschool){this.school=school;}publicStringgetInfo(){ //该方法重写了父类的方法return "Name:"+getName()+"\n"+"age:"+getAge()+"\n"+"school:"+school;}}18旅游信息学院 JAVA语言程序设计 软件技术教研室publicclassTestOverWrite{publicstaticvoidmain(Stringarg[]){Studentstudent=newStudent();Personperson=newPerson();person.setName("none");person.setAge(1000);student.setName("John");student.setAge(18);student.setSchool("SCH");}}3:重载与重写的区别方法的重写和重载是 Java多态性的不同表现。重写是父类与子类之间多态性的一种表现,重载是一个类中多态性的一种表现。重写又称覆盖,从字面意思就可知道,它是覆盖了一个方法并且对其重写, 以求达到不同的作用。我们在继承中经常会在子类中覆盖父类中的方法。重载是指可以定义一些名称相同的方法,通过定义不同的输入参数来区分这些方法,然后在调用时,JVM(Java虚拟机)会根据不同的参数样式,来选择合适的方法执行。任务四:Java程序实现多态1、 上转的概念假设B类是A类的子类或间接子类,当用子类B创建一个对象,并把这个对象的应用放到A类的对象中时,如a;a=newB();19旅游信息学院 JAVA语言程序设计 软件技术教研室或者:a;b=newB();a=b;那么,称这个A类对象a是子类对象b的上转对象(好比说:“老虎是哺乳动物”)。,简单的说就是子类的对象赋给父类的引用称为上转。对象的上转型对象的实体是子类负责创建的,但上转型对象会失去原来子类对象的一些属性和功能。上转型对象具有如下特点:说明:1)上转型对象不能操作子类新增的成员变量(失掉了这部分属性),不能使用子类新增的方法(失掉了这部分功能)2)上转型对象可以操作子类继承或隐藏的成员变量,也可以使用子类继承的或重写的方法。3)上转型对象操作子类继承或重写的方法时,就是通知对应的子类对象去调用这些方法。因此,如果子类重写了父类的某个方法后,对象的上转型对象调用这个方法时,一定是调用了这个重写的方法。4)可以将对象的上转型对象再强制转换到一个子类对象,这时,该子类对象又具备子类的所有属性和功能。案例演示:classShape{ //父类public int x=100;20旅游信息学院 JAVA语言程序设计 软件技术教研室public intz=300;publicvoiddraw(){父类的方法!");}}classCircleextendsShape{ //子类public int x=200; //覆盖父类的成员变量public voiddraw(){重写了父类的方法!");}publicvoiddisp(){子类新增加的方法!");}}publicclassCastTest{publicstaticvoidmain(Stringargs[]){Shapes=newCircle();s.draw(); //上转调用的是被子类重写了的方法s.disp();不能调用子类新增加的方法//上转引用的是父类的变量Circlec1=newCircle();c1.draw();}案例演示二:classShape{ //父类publicstatic voiddraw(){父类的方法!");}}classCircleextendsShape{ //子类public staticvoiddraw(){重写了父类的方法!");}}publicclassCastTest{publicstaticvoidmain(Stringargs[]){Shapes=newCircle();s.draw(); //上转调用的是父类方法,因为静态方法不能被继承}}21旅游信息学院 JAVA语言程序设计 软件技术教研室向下转型:父类的对象赋给子类的引用案例演示:classA{ //定义类Apublicvoidfun1(){ //定义fun1()方法}publicvoidfun2(){ //定义fun2()方法}}classBextendsA{ //子类通过extends继承父类publicvoidfun1(){ //覆写父类中的fun1()方法}publicvoidfun3(){ //子类自己定义的方法}}publicclassTestX{publicstaticvoidmain(String[]args){Aa=newB(); //发生了向上转型的关系,子类 -->父类Bb=(B)a; //此时发生了向下转型关系b.fun1(); //调用方法被覆写的方法b.fun2(); //调用父类的方法b.fun3(); //调用子类自己定义的方法}}注意:对象向下转型的要求在以上的程序中读者已经了解了对象的向上和向下转型的基本概念,但是必须提醒读者的是,在进行对象的向下转型之前,必须首先发生对象向上转型才可以,否则将出现对象转换异常案例演示:classA{ //定义类Apublicvoidfun1(){ //定义fun1()方法}publicvoidfun2(){ //定义fun2()方法this.fun1();}};classBextendsA{ //子类通过extends继承父类publicvoidfun1(){ //覆写父类中的fun1()方法22旅游信息学院 JAVA语言程序设计 软件技术教研室}publicvoidfun3(){ //子类自己定义的方法}};publicclassTestX{publicstaticvoidmain(String[]args){Aa=newA(); //此时声明的是父类对象Bb=(B)a; //此时发生了向下转型关系b.fun1(); //调用方法被覆写的方法b.fun2(); //调用父类的方法b.fun3(); //调用子类自己定义的方法}}2:多态多态性思想:“多态”就是一个对象具有多种状态,就叫多态。可以通过子类对父类方法的覆盖来实现多态,也可以通过对方法的重载实现多态。一般来说,多态性是指同名的不同方法在程序中共有的情况,即为同一方法定义几个不同的版本,运行时根据不同情况执行不同的版本。多态可以表现在很多方面,即可以通过子类对父类方法的覆盖实现多态,也可以通过一个类中方法的重载实现多态,还可以将子类的对象作为父类的对象实现多态。(1)方法重载实现多态所谓通过“重载实现多态”是指在同一个类中定义多个同名方法。这些方法具有相同的功能和目的。但在功能的具体内容和细节上有所不同, 具有多种不同的实现方法。从而实现了方法的多态。重载中的同名方法定义在同一类中,不能再用类名(对象名)和方法名进行区别访问。但可以使用不同的形式参数, 包括不同的参数个数、参数类型或顺序进行区别访问。案例演示:方法的重载实现多态classAdd{publicintadd(intx,inty){23旅游信息学院 JAVA语言程序设计 软件技术教研室returnx+y;}publicintadd(intx,inty,intz){returnx+y+z;}}publicclassTestAdd{}}(2)构造方法的重载实现多态构造方法的重载是指在同一类中定义不同参数的多个同名构造方法,以完成不同情况下对象的初始化,从而实现了方法的多态。案例演示:classStudent{float hight;float weight;int number;Stringname;char sex;publicStudent(intnumber){this.number=number;学号:"+this.number);}publicStudent(intnumber,Stringname){this.number=number;24旅游信息学院 JAVA语言程序设计 软件技术教研室=name;学号:"+this.number+" 姓名:"+name);}publicStudent(intnumber,Stringname,charsex){this.number=number;=name;this.sex=sex;学号:"+this.number+" 姓名:"+name+" 性别:"+sex);}}publicclassTestStudent{publicstaticvoidmain(String[]args){Studentst1=newStudent(2015001);Studentst2=newStudent(2015001,"张三");Studentst3=newStudent(2015001,"李四",'男');}}(3)对象的多态性子类的对象可以通过“类型转换”成为父类的对象,父类的对象也可以通过“类型转换”成为子类的对象。从而实现了对象的多态性。对象的类型转换主要包括“向上转型”和“向下转型” 。也就是说,对象的多态性是通过“向上转型”和“向下转型” 完成的。案例演示:向上转型classFather{publicvoidmethod(){父类的方法!");}}classSonextendsFather{25旅游信息学院 JAVA语言程序设计 软件技术教研室publicvoidmethod(){子类的方法!");}}publicclassUpCasting{publicstaticvoidmain(String[]args){Fatherf1=newFather();f1.method();Son s1=newSon();s1.method();Fatherf2=newSon();f2.method(); //会调用子类的方法}}任务六:掌握final关键字和abstract关键字1:final修饰符Java中的final关键字可以用来修饰类、方法和局部变量。(1)final修饰的类称为最终类,此类不能被继承;(2)final修饰的方法称为最终方法,此方法不能被子类重写;(3)final修饰的变量称为最终变量,实际上相当于常量,不能该变量只能被赋值一次。案例演示:classPerson{publicstaticfinalStringGUOJI="中国";//相当于常量,不能再后面被改变privateintage;publicvoidsetAge(intage){this.age=age;26旅游信息学院 JAVA语言程序设计 软件技术教研室}publicintgetAge(){returnage;}publicStringgetInfo(){return"国籍:"+GUOJI+"\n"+"age:"+age;}publicstaticvoiddisp(){ //该方法不能被重写我爱我的祖国!");}}classStudentextendsPerson{privateStringschool;publicStringgetSchool(){returnschool;}publicvoidsetSchool(Stringschool){this.school=school;}publicStringgetInfo(){ //该方法重写了父类的方法return "国籍:"+GUOJI+"\n"+"age:"+getAge()+"\n"+"school:"+school;}}publicclassTestFinal{publicstaticvoidmain(Stringarg[]){Studentstudent=newStudent();Personperson=newPerson();27旅游信息学院 JAVA语言程序设计 软件技术教研室//person.GUOJI="法国"; 不能改变这个值person.setAge(1000);student.setAge(18);student.setSchool("SCH");}}2:abstract修饰符Java中的修饰符abstract可以用来修饰类和方法,被abstract修饰的类称为抽象类,被abstract修饰的方法称为抽象方法。抽象类的格式:访问限定符 abstract class 类名{}抽象方法的格式:访问限定符abstract返回值类型方法名(形参列表);抽象类注意的问题:(1)抽象类和抽象方法都必须用 abstract关键字修饰;(2)抽象类不能被实例化,即不能用关键字创建抽象类的对象(3)抽象方法只需要声明,不需要实现,且在括号后加;(4)含有抽象方法的类必须被声明为抽象类,抽象类的子类必须重写所有的抽象方法后才能被实例化,否则该子类依然是抽象类;(5)抽象类也可以包含普通成员变量和成员方法。但是,抽象方法只能出现在抽象类中,也就说,非抽象类是不能包含抽象方法的。案例演示:abstractclassPlaneGraphics{ //平面图形类,抽象类privateStringshape;publicPlaneGraphics(){this("未知图形");28旅游信息学院 JAVA语言程序设计 软件技术教研室}publicPlaneGraphics(Stringshape){this.shape=shape;}publicabstractdoublearea(); //计算面积的抽象方法,分号 ";"必须加上publicvoidprint(){面积为:"+this.area());}}classRectangleextendsPlaneGraphics{protecteddoublelength;protecteddoublewidth;publicRectangle(){}//长方形的构造方法publicRectangle(doublelength,doublewidth){super("长方形");this.length=length;this.width=width;}//正方形的构造方法publicRectangle(doublewidth){super("正方形");this.length=width;this.width=width;}29旅游信息学院 JAVA语言程序设计 软件技术教研室//计算长方形面积吗,实现父类的抽象方法publicdoublearea(){returnwidth*length;}}publicclassTestPlane{publicstaticvoidmain(String[]args){//获得长方形子类的实例PlaneGraphicsg=newRectangle(10,20);//调用抽象类中的 print()方法g.print();g=newRectangle(10); //获得正方形的实例g.print();}}案例演示2:abstractclassShape{publicabstractdoublearea();//求面积的抽象方法}classCircleextendsShape{intr;//半径Circle(intaR){this.r=aR;}//覆盖父类的抽象方法publicdoublearea(){return3.14*r*r;}}30旅游信息学院 JAVA语言程序设计 软件技术教研室classRectangleextendsShape{

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论