《java教程第7章继承和多态.ppt》由会员分享,可在线阅读,更多相关《java教程第7章继承和多态.ppt(23页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第第7章章 继承和多态继承和多态类的继承类继承的过程的讨论抽象类和接口多态instanceof操作符7.1 类与类之间的关系类与类之间的关系is-a:继承;has-a:聚合,A的对象包含B的对象;use-a:依赖,一个类的方法操作了另一个类的对象。7.2 继承继承继承就是在现有类的基础上构建新的类,继承现有类时,就重用(继承)了那个类的方法和属性,同时可向新类中增加自己的方法和属性。注意:父类的私有方法及构造方法子类不能能继承,不能使用;声明为final的类不能被继承。类类 Animalclass Animal private int age;private int weight;public
2、 Animal()public Animal(int age,int weight)this.age=age;this.weight=weight;public int getAge()return age;public int getWeight()return weight;public void sleep()System.out.println(“Animal sleep”);public void breathe()System.out.println(“Animal breathe”);7.2.1 定义子类的成员变量定义子类的成员变量子类中,成员变量的定义可能有三种情况:完全继承父
3、类的;与父类同名的成员变量;子类特有的成员变量;与父类同名的成员变量用的少,一般直接继承就可以了。不建议用class Fish extends Animal private String scale;7.2.2 定义子类的构造方法定义子类的构造方法super的含义:是指超类;它和this一样有两种用法:点操作:访问超类成员:super.say();调用超类构造器:super();初始化超类;super用于调用超类构造器的用法,只能在构造器中,且只能放在第一行,这时它与this()不能同时出现;定义子类对象时会先初始化超类;如果子类构造器不显示调用超类构造器,编译器会自动调用超类的无参构造器。类
4、类Fish的构造方法的构造方法class Fish extends Animal protected String scale;public Fish()super();public Fish(String scale)super(1,1);this.scale=scale;public Fish(int age,int weight,String scale)this.age=age;this.weight=weight;this.scale=scale;7.2.3 定义子类的成员方法定义子类的成员方法子类的方法体中,成员方法的定义可能出现两种情况:子类特有的方法;子类继承父类的方法。方法的
5、覆盖:子类和父类的方法之间:1、返回值类型相同;2、方法名相同;3、形参类型、个数、顺序相同;4、子类中方法的权限不小于父类中的权限;5、子类方法不能抛出新异常。注意:与方法重载的区别;方法覆盖特别严格,违反任意一条都不行;违反第3条时构成重载;声明为final的方法不能被覆盖。类类Fish的成员方法的成员方法class Fish extends Animal public String getScale()return scale;public void swimming()System.out.println(“Fish swimming”);public void sleep()Syst
6、em.out.println(“Fish sleep”);public void breathe()System.out.println(“Fish breathe”);7.2.4 继承的过程继承的过程吸收父类成员全部继承父类除了私有成员和构造方法之外的成员改造父类成员多指方法重写添加新成员添加父类不具备的成员,也称对父类的扩展思考思考class Super public float getNum()return 3.0f;public class Sub extends Super/插入下列哪个方法会编译错误?a)public float getNum()return 4.0f;b)publ
7、ic void getNum()c)public void getNum(double d)d)public double getNum(float d)return 4.0d下列哪些方法是对父类中方法:protected float getVar()return x;的有效覆盖?(x为定义了的float型成员变量)a)float getVar()return x;b)public float getVar()return x;c)double getVar()return x;d)protected float getVar()return x+1;e)public float getVar
8、(float f)return f;7.3 抽象类抽象类从某种角度来说,祖先类更通用,这样我们就把它用作派生其他类的基础,而非具有需要使用的特定实例的类;抽象方法:只有方法声明,而没有方法实现的方法,以分号结束;抽象类不能实例化对象;抽象方法和抽象类用abstract声明;没有任何抽象方法的类也可以声明为抽象类,这时它不能实例化对象。7.3.1 抽象类举例抽象类举例abstract class Animal public abstract void sleep();public abstract void breathe();public abstract void swimming();pu
9、blic abstract void fly();class Fish extends Animal public void sleep()System.out.println(“在水里睡觉”);public void breathe()System.out.println(“用腮呼吸”);public void swimming()System.out.println(“鱼游泳”);public void fly()7.3.2 抽象类使用的要点抽象类使用的要点抽象类不能实例化对象,只能作为父类使用;如果一个类继承了抽象类,这个类必须实现抽象类的所有抽象方法(即方法覆盖),否则这个类必须声明为
10、抽象类;注意方法覆盖;abstract与final不能在一起使用;一个方法有了大括号就说这个方法实现了;7.4 接口接口接口:不是类是一组对类的要求,不带有任何实现细节;简单的理解:可以看成是抽象方法和静态常量的集合;接口的分类:1.标记性接口:什么都没有,如Serilizable,Cloneable等2.常量群接口:只有常量,没有方法,如 SwingConstants3.一般接口:7.4.1 接口的概念接口的概念7.4.2 接口的作用接口的作用接口的使用弥补了Java单亲继承的缺点;类的继承:类继承类单继承接口:类实现接口多实现 接口继承接口多继承有关系的类才能实现同一个抽象类,无关系的类不
11、可能有同一个父类,但无关的类可以有同一个接口;接口的使用使得项目中多个程序员可以并行开发。7.4.3 接口的声明接口的声明接口中的(成员变量),自动声明为:public static final接口中的成员方法,自动声明为:public abstractinterface Dancable int MIN_AGE=5;void jump();void roll();7.4.4 接口的使用接口的使用接口使用过程中的要点:1.接口不能实例化对象;2.接口只能继承接口;3.实现接口时必须实现接口中所有的方法,否则该类必须声明为抽象类。class Person implements Dancable
12、public void jump()System.out.println(“起跳”);public void roll()System.out.println(“旋转”);7.4.5 接口作为方法的参数接口作为方法的参数接口可以作为某个方法的参数,使用该方法时,传递的是实现了该接口的某个类的对象,如:class Testpublic void fun(Dancable b)b.jump();public static void main(String args)Test t=new Test();Person p=new Person();t.fun(p);7.5 多态多态7.5.1 多态的概
13、念多态的概念可以把替代原则变换为继承机制:我们可以将某个对象看成为所属类的实例,也可以看成是其超类的实例。例如:Animal a=new Fish();多态,是指多种表现形式。是允许将父对象设置成为和一个或多个它的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作;简单的说,就是允许将子类类型赋值给父类类型。多态的特性:编译时接口缩小,运行时动态邦定;参数传递过程中的多态现象。7.5.2 多态测试public class Test public static void main(String args)Animal a=new Fish(1,1,big);a
14、.sleep();Fish f=new Fish(1,1,big);fun(f);public static void fun(Animal a)a.breathe();思考:a.swimming()能用吗?7.6 类型转换类型转换语法:(类名)对象名;有继承关系的类的对象之间才能进行转换;只有曾经上溯造型过的对象才可以下溯造型;public class Test Animal a=new Fish(1,1,big);Fish f=(Fish)a;f.swimming();7.7 instanceof 运算符运算符其意义是:判断对象变量是否是这个类的一个对象。对象变量 instanceof 类名class A class B extends Aclass C extends Apublic class Testpublic static void main(String args)A a1=new B();A a2=new C();if(a2 instanceof C)C c=(C)a1;