您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 冶金工业 > java课件-继承和多态.ppt
类的继承被继承的类称为父类或者超类或者基类继承父类的类称为子类或者派生类执行继承时,子类将获得父类的所有成员(包括private的成员),并具有自身特有的属性。继承是面向对象编程技术的一块基石,它允许创建分等级层次的类。运用继承,可以创建一个通用类定义一系列一般特性。该类可以被更具体的类继承Emoloyee类:namesexWorker类:categorydressAllowanceOfficer类:empClassvehicle职员类,具有姓名和性别两个属性工人类,继承了父类的姓名和性别属性外还包含类别和是否有服装津贴属性主任类,还包含级别和是否配备交通工具属性extends关键字extends关键字用于继承类。声明一个继承父类的类的通常形式如下:classsubclass-nameextendssuperclass-name{//类体}没有extends,默认父类为Object一个类只能有一个父类,即单继承子类继承父类的全部成员注意继承示例classEmployee{Stringname;//姓名charsex;//性别Employee(Stringn,chars){name=n;sex=s;}publicStringgetName(){returnname;}publicchargetSex(){returnsex;}}classWorkerextendsEmployee{charcategory;//类别booleandressAllowance;//是否提供服装津贴Worker(Stringn,chars,charc,booleand){super(n,s);category=c;dressAllowance=d;}publicchargetCategory(){returncategory;}publicbooleangetAll(){returndressAllowance;}}classInheDemo{publicstaticvoidmain(Stringargs[]){Workerw=newWorker(M.John,'M','B',true);System.out.println(工人信息);System.out.println(姓名:+w.getName());System.out.println(性别:+w.getSex());System.out.println(类别:+w.getCategory());if(w.getAll())System.out.println(提供服装津贴);elseSystem.out.println(“未提供服装津贴”);}}继承分析在子类中不能直接访问父类中的私有成员子类和父类之间应该有“IS-A”关系不要滥用继承,只有在分类学上有意义时,才应该使用继承子类具有扩展超类的责任继承的目的就是为了代码复用里式代换原则定义:无论何时,只要程序需要一个超类对象,那么就可以用一个子类对象来替代它。Employeee;e=newEmployee();//需要超类Employee对象e=newManager();//用子类对象替换掉超类对象注意:反过来是不行的多态和动态绑定声明类型:对象变量被声明时的类型实际类型:对象变量实际指向的对象类型一个对象变量可以指向多种实际类型的现象称为“多态”在运行时自动选择正确的方法进行调用的现象称为“动态绑定”Java根据对象的实际类型来进行方法调用方法重载(overloading)方法重载是Java实现面向对象的多态性机制的一种方式。同一个类中多个方法有相同的名字,不同的参数列表,这种情况称为方法重载。当重载方法被调用时,Java编译器根据参数的类型和数量来确定实际调用哪个重载方法的版本。方法重载不考虑方法的返回类型。重载构造函数一个类可以有多个构造函数如果一个类没有定义一个构造函数,Java编译器将为这个类自动提供缺省构造函数(即无参的构造函数)缺省构造函数将成员变量的值初始化为缺省值一旦创建了自己的构造函数,Java编译器将不再自动提供无参的构造函数。重载构造函数提供了一组创建对象的方式,可以根据需要决定是否带初始参数。publicclassconstructOverload{intx;constructOverload(){x=0;System.out.println(不带参数的构造函数);}constructOverload(intx){this.x=x;System.out.println(带一个参数的构造函数);}}方法覆盖(override)方法覆盖是Java实现多态性机制的另一种方式。在类层次结构中,如果子类中的一个方法与父类中的方法有相同的返回类型、相同的方法名并具有相同数量和类型的参数列表,这种情况称为方法覆盖。当一个覆盖方法通过父类引用被调用,Java根据当前被引用对象的实际类型来决定执行哪个版本的方法。可以通过super关键字调用直属父类中被覆盖的方法版本。方法覆盖示例classSuperClass{inta;SuperClass(){a=10;}publicvoidprintA(){System.out.println(父类中a=+a);}}classSubClassextendsSuperClass{inta;SubClass(inta){this.a=a;}publicvoidprintA(){System.out.println(子类中a=+a);}}publicclassOverrideDemo{publicstaticvoidmain(Stringargs[]){SuperClasss1=newSubClass(10);s1.printA();}}将调用子类的printA方法包(package)在Java中,包主要有以下用途:将类进行分类组织存放避免命名冲突包允许在更广的范围内保护类、数据和方法包可以是类、接口和子包的集合包中的文件被编译成.class文件后被放在与完整包名匹配的子目录中。实际是:基目录+包名嵌套的包之间没有任何关系•例如:包java.util和java.util.jar就是彼此无关的使用包创建包packagemypackage;在一个Java源文件中,只能使用一个package语句,并且通常位于Java源文件的第一行访问Java包成员mypackage.My_Class导入包importpackage_name.*;在一个Java源文件中,可以使用多个import语句导入子包importpackage_name.cpackage.*;类的静态成员-static类中的静态变量、方法或代码块属于类,而不属于某个特定的对象。类的静态成员可以与类的名称一起使用,而无需创建类的对象。静态变量或方法也称为类变量或类方法。用static修饰符修饰,可以是变量、方法或代码块静态变量不管创建了类的多少实例,整个类中静态变量的副本只有一个。引用静态变量的方法:-通过引用类的任一实例-通过类的名称classStaticDemo{staticintx=0;StaticDemo(){x++;}}StaticDemod1=newStaticDemo();StaticDemod2=newStaticDemo();d1.x=100;d2.x=200;testVariable=d1.x;通过类实例访问不是一个好方法StaticDemod1=newStaticDemo();StaticDemod2=newStaticDemo();StaticDemo.x=100;StaticDemo.x=200;testVariable=StaticDemo.x;声明为static的变量实质上就是全局变量通过类名访问静态方法与静态方法相关的几个要点:类的静态方法只能访问其他的静态成员静态方法没有this静态方法不能被覆盖为非静态方法classStaticFun{staticinti=10;intj;staticvoidsetValue(intx){j=x;//出错System.out.println(+i);}}不能访问非静态变量j,可以访问静态变量iclassStaticTest{staticvoidtest(){}}classStaticexextendsStaticTest{voidtest(){}//出错}Java类属性和对象属性的初始化顺序1.首先找到类中的所有静态声明语句(不管位置在哪),把他们初始化为缺省值2.然后再按照书写顺序依次处理每一个static的东西3.把对象属性初始化为缺省值4.按照书写顺序依次处理每一个对象属性的初始化语句5.最后执行构造函数final关键字/final类final修饰符可应用于类、方法和变量。final在应用于类、方法和变量时意义是不同的,但本质是一样的:final表示不可改变。声明为final的类不能被继承。final类示例:java.lang.StringfinalclassTestFinal{inti=7;intj=1;voidf(){}}classFurtherextendsTestFinal{}final类不能被继承final方法在方法声明中使用final关键字向编译器表明子类不能覆盖(override)此方法。在声明类中,一个final方法只被实现一次。如果一个类为final类,那么它的所有方法都为隐式的final方法。classTestFinal{finalvoidf(){}}classFurtherextendsTestFinal{finalvoidf(){}}final方法不能被覆盖final变量一个变量可以声明为final,这样做的目的是阻止它的内容被修改。声明final变量后,只能被初始化一次,然后就不能对其值进行修改。一个final变量实质上是一个常量。classFinalDemo{publicstaticvoidmain(Stringargs[]){finalintnoChange=20;noChange=30;}}final变量不能被修改抽象类1-1定义:一种类型,只提供部分方法的具体实现。语法:abstractclass类名{….}一般情况下,抽象类既包含具体方法,又包含抽象方法。具体方法:既有方法的声明,又有方法的实现(即有方法体)。抽象方法:只有方法的声明,而没有方法的实现(即没有方法体)。语法:abstract返回类型方法名(参数列表)•抽象类不能被实例化,只能被继承。abstract修饰符可与类和方法一起使用抽象类1-2抽象类就是用来继承的子类必须为抽象类中的所有抽象方法提供具体实现,否则,子类也将是一个抽象类抽象类中可以声明实例变量,这些实例变量就是为了提供给子类继承的抽象类可以有一个或多个构造函数,它是提供给子类进行调用的特别地,抽象类中的所有方法都可以是具体方法抽象类示例abstractclassEmployee{intbasic=2000;abstractvoidsalary();//抽象方法}classManagerextendsEmployee{voidsalary(){System.out.println(薪资等于+basic*5);}}classWorkerextendsEmployee{voidsalary(){System.out.println(薪资等于+basic*2);}}抽象方法没有方法主体在子类中提供实现在子类中提供实现Java接口2-1定义:一种类型,不包含任何具体方法。换言之,所有方法都是抽象方法语法:publicinterface接口名{…}接口不能被实例化接口中的抽象方法不需要abstract修饰一个类可以继承接口,而且可以同时继承多个接口。一个类继承一个接口被称作“接口继承”;通过一个类同时继承多个接口可以在Java中实现“多重继承”Java
本文标题:java课件-继承和多态.ppt
链接地址:https://www.777doc.com/doc-5483312 .html