继承接口和内部类.ppt
继承继承继承继承 多态多态多态多态 抽象类抽象类抽象类抽象类 接口接口接口接口 内部类内部类内部类内部类第四章第四章 继承、接口和抽象类继承、接口和抽象类 继承继承继承继承继承的特点继承的特点继承的特点继承的特点 extends extends 父类名父类名父类名父类名;若无若无若无若无extends,extends,则默认父类则默认父类则默认父类则默认父类ObjectObject 子类将继承父类成员子类将继承父类成员子类将继承父类成员子类将继承父类成员,但不能直接访问父类但不能直接访问父类但不能直接访问父类但不能直接访问父类privateprivate成员成员成员成员 单继承单继承单继承单继承,多层继承多层继承多层继承多层继承 子类对父类可做扩展和特殊化子类对父类可做扩展和特殊化子类对父类可做扩展和特殊化子类对父类可做扩展和特殊化(1)(1)创建新的成员:成员变量和方法创建新的成员:成员变量和方法创建新的成员:成员变量和方法创建新的成员:成员变量和方法(2)(2)重新定义父类中已有的成员变量:隐藏重新定义父类中已有的成员变量:隐藏重新定义父类中已有的成员变量:隐藏重新定义父类中已有的成员变量:隐藏(3)(3)重新定义父类中已有的方法:覆盖重新定义父类中已有的方法:覆盖重新定义父类中已有的方法:覆盖重新定义父类中已有的方法:覆盖(override)(override)子类中的方法应与父类中的被覆盖的方法有完全相同的:参子类中的方法应与父类中的被覆盖的方法有完全相同的:参子类中的方法应与父类中的被覆盖的方法有完全相同的:参子类中的方法应与父类中的被覆盖的方法有完全相同的:参数列表、返回值;而且访问权限不能更严格数列表、返回值;而且访问权限不能更严格数列表、返回值;而且访问权限不能更严格数列表、返回值;而且访问权限不能更严格 super()super():调用父类被覆盖的方法;父类构造方法:调用父类被覆盖的方法;父类构造方法:调用父类被覆盖的方法;父类构造方法:调用父类被覆盖的方法;父类构造方法例:例:例:例:Circle.java,Cylinder.javaCircle.java,Cylinder.java 继承继承继承继承继承的特点继承的特点继承的特点继承的特点 子类的构造方法子类的构造方法子类的构造方法子类的构造方法 (1)(1)若子类的构造方法中若子类的构造方法中若子类的构造方法中若子类的构造方法中,没有使用没有使用没有使用没有使用supersuper调用父类的构造方调用父类的构造方调用父类的构造方调用父类的构造方法和法和法和法和thisthis调用重载的其他构造方法,则在创建子类对象时调用重载的其他构造方法,则在创建子类对象时调用重载的其他构造方法,则在创建子类对象时调用重载的其他构造方法,则在创建子类对象时,系统默系统默系统默系统默认先调用父类的无参构造方法认先调用父类的无参构造方法认先调用父类的无参构造方法认先调用父类的无参构造方法,然后执行子类的构造方法然后执行子类的构造方法然后执行子类的构造方法然后执行子类的构造方法;(2)(2)在子类的构造方法中使用在子类的构造方法中使用在子类的构造方法中使用在子类的构造方法中使用super(super(参数参数参数参数)调用父类的含参构调用父类的含参构调用父类的含参构调用父类的含参构造方法造方法造方法造方法,super,super必须是第一句必须是第一句必须是第一句必须是第一句 (3)this()(3)this()和和和和super()super()不能同时出现不能同时出现不能同时出现不能同时出现 例:例:例:例:Sandwich.javaSandwich.java(构造方法调用次序)(构造方法调用次序)(构造方法调用次序)(构造方法调用次序)多态多态多态多态一个引用变量可以引用多种实际类型的现象称为多态,在运行时能够自一个引用变量可以引用多种实际类型的现象称为多态,在运行时能够自一个引用变量可以引用多种实际类型的现象称为多态,在运行时能够自一个引用变量可以引用多种实际类型的现象称为多态,在运行时能够自动选择调用适当的方法称为动态绑定动选择调用适当的方法称为动态绑定动选择调用适当的方法称为动态绑定动选择调用适当的方法称为动态绑定引用变量的类型转换引用变量的类型转换引用变量的类型转换引用变量的类型转换 子类引用变量转换成父类引用变量子类引用变量转换成父类引用变量子类引用变量转换成父类引用变量子类引用变量转换成父类引用变量 (1 1)规则:沿着继承层次,从下往上,)规则:沿着继承层次,从下往上,)规则:沿着继承层次,从下往上,)规则:沿着继承层次,从下往上,子类可以自动转换成父类子类可以自动转换成父类子类可以自动转换成父类子类可以自动转换成父类 (2 2)转换时机:赋值,方法调用(参数传递)转换时机:赋值,方法调用(参数传递)转换时机:赋值,方法调用(参数传递)转换时机:赋值,方法调用(参数传递)EmployeeEmployeeManagerManagerSecretarySecretaryProgrammerProgrammerManager m=new Manager();Manager m=new Manager();Employee e=m;/Employee e=m;/赋值时发生自动转换赋值时发生自动转换赋值时发生自动转换赋值时发生自动转换e.raiseSalary();/e.raiseSalary();/正确正确正确正确e.setBonus();/e.setBonus();/错误错误错误错误raiseSalary()raiseSalary()setBonus()setBonus()多态多态多态多态引用变量的类型转换引用变量的类型转换引用变量的类型转换引用变量的类型转换 父类引用变量转换成子类引用变量(强制转换)父类引用变量转换成子类引用变量(强制转换)父类引用变量转换成子类引用变量(强制转换)父类引用变量转换成子类引用变量(强制转换)子类引用变量子类引用变量子类引用变量子类引用变量=(=(子类子类子类子类)父类引用变量父类引用变量父类引用变量父类引用变量 EmployeeEmployeeManagerManagerSecretarySecretaryProgrammerProgrammerEmployee e=new Employee();Employee e=new Employee();Manager m=e;/Manager m=e;/错误错误错误错误Employee e=new Employee();Employee e=new Employee();Manager m=Manger(e);Manager m=Manger(e);/强制转换强制转换强制转换强制转换 多态多态多态多态引用变量的类型转换引用变量的类型转换引用变量的类型转换引用变量的类型转换 Object Object 类类类类,toString方法方法例:PolyTest.javaPolyTest.java多态多态:为父类对象设计的任何代码都可以应用于子类为父类对象设计的任何代码都可以应用于子类 动态绑定动态绑定动态绑定动态绑定 对象方法的执行过程对象方法的执行过程对象方法的执行过程对象方法的执行过程 优点:无需对现存代码进行修改就可对程序进行扩展优点:无需对现存代码进行修改就可对程序进行扩展优点:无需对现存代码进行修改就可对程序进行扩展优点:无需对现存代码进行修改就可对程序进行扩展CnCn-1Cn-2C1C0顺序查找顺序查找 instanceofinstanceof 对象引用对象引用对象引用对象引用 instanceof instanceof 类(或接口)类(或接口)类(或接口)类(或接口)例:Polymorphism.javaPolymorphism.java 抽象类抽象类抽象类抽象类抽象类抽象类抽象类抽象类 abstractabstract 不包含方法定义的方法称为抽象方法不包含方法定义的方法称为抽象方法不包含方法定义的方法称为抽象方法不包含方法定义的方法称为抽象方法 任何包含抽象方法的类必须声明为抽象类任何包含抽象方法的类必须声明为抽象类任何包含抽象方法的类必须声明为抽象类任何包含抽象方法的类必须声明为抽象类 不能生成抽象类的对象不能生成抽象类的对象不能生成抽象类的对象不能生成抽象类的对象 抽象类的子类必须覆盖所有的抽象方法,才能生成对象,否抽象类的子类必须覆盖所有的抽象方法,才能生成对象,否抽象类的子类必须覆盖所有的抽象方法,才能生成对象,否抽象类的子类必须覆盖所有的抽象方法,才能生成对象,否则仍然是抽象类则仍然是抽象类则仍然是抽象类则仍然是抽象类 例例例例:AbstractClassTest.java:AbstractClassTest.javaarea()area()CircleCircleSquareSquareShapeShapearea()area()area()area()area()area()TriangleTriangle 接口接口接口接口接口接口接口接口 描述类具有什么功能,而不给出每个功能的具体实现描述类具有什么功能,而不给出每个功能的具体实现描述类具有什么功能,而不给出每个功能的具体实现描述类具有什么功能,而不给出每个功能的具体实现 接口中的方法和成员变量接口中的方法和成员变量接口中的方法和成员变量接口中的方法和成员变量 定义接口定义接口定义接口定义接口方法:隐含为方法:隐含为方法:隐含为方法:隐含为public abstractpublic abstract变量:变量:变量:变量:隐含为隐含为隐含为隐含为public static finalpublic static final public interface public interface 接口名接口名接口名接口名 extends extends 接口列表接口列表接口列表接口列表 返回类型返回类型返回类型返回类型 方法名();方法名();方法名();方法名();常量类型常量类型常量类型常量类型 常常常常量量量量名名名名=.=.;接口接口接口接口接口接口接口接口 使用接口使用接口使用接口使用接口 当一个类声明当一个类声明当一个类声明当一个类声明 implements implements 某一某一某一某一 interface interface 时,必须具体实现该时,必须具体实现该时,必须具体实现该时,必须具体实现该 interface interface 中定义的抽象方法,中定义的抽象方法,中定义的抽象方法,中定义的抽象方法,并把此方法定义为并把此方法定义为并把此方法定义为并把此方法定义为publicpublic的的的的(抽象类除外)抽象类除外)抽象类除外)抽象类除外)利用接口可实现多重继承,一个类可以实现一个或多个接口利用接口可实现多重继承,一个类可以实现一个或多个接口利用接口可实现多重继承,一个类可以实现一个或多个接口利用接口可实现多重继承,一个类可以实现一个或多个接口 例:例:例:例:InterfaceTest.javaInterfaceTest.java接口与抽象类的区别接口与抽象类的区别:接口中,数据必须是常量,抽象类可以有非常量的数据;接口中,数据必须是常量,抽象类可以有非常量的数据;接口中,每个方法只有方法名定义,没有实现,抽象类可以有具体的实现方法;接口中,每个方法只有方法名定义,没有实现,抽象类可以有具体的实现方法;Java对类的扩展只允许单重继承,对接口允许多重继承;对类的扩展只允许单重继承,对接口允许多重继承;强是关系:明显地描述父子关系,用抽象类;强是关系:明显地描述父子关系,用抽象类;弱是关系:对象拥有某种属性,弱是关系:对象拥有某种属性,用接口;用接口;内部类内部类内部类内部类在一个类的内部嵌套定义的类在一个类的内部嵌套定义的类在一个类的内部嵌套定义的类在一个类的内部嵌套定义的类成员内部类成员内部类成员内部类成员内部类 可以访问外部类的成员变量和方法可以访问外部类的成员变量和方法可以访问外部类的成员变量和方法可以访问外部类的成员变量和方法;反过来不行反过来不行反过来不行反过来不行 可以声明为可以声明为可以声明为可以声明为private,protected,publicprivate,protected,public或缺省或缺省或缺省或缺省 若为若为若为若为static,static,则不能访问非则不能访问非则不能访问非则不能访问非staticstatic成员成员成员成员,很少使用很少使用很少使用很少使用 若局部变量若局部变量若局部变量若局部变量,内部类的成员变量和外部类的成员变量重名内部类的成员变量和外部类的成员变量重名内部类的成员变量和外部类的成员变量重名内部类的成员变量和外部类的成员变量重名 则分别用变量名则分别用变量名则分别用变量名则分别用变量名;this.;this.变量名变量名变量名变量名:外部类名外部类名外部类名外部类名.this.this.变量名表变量名表变量名表变量名表示示示示 引用引用引用引用:若为若为若为若为public,public,则外部类名则外部类名则外部类名则外部类名.内部类名内部类名内部类名内部类名 Outer o=new Outer();Outer o=new Outer();Outer.Inner i=o.new Inner();Outer.Inner i=o.new Inner();或或或或Outer.Inner i=new Outer.new Inner();Outer.Inner i=new Outer.new Inner();例:例:例:例:InnerClassTest.javaInnerClassTest.java 内部类内部类内部类内部类方法中的内部类方法中的内部类方法中的内部类方法中的内部类 可以访问方法中可以访问方法中可以访问方法中可以访问方法中finalfinal局部变量局部变量局部变量局部变量 不能使用访问修饰符,不能使用不能使用访问修饰符,不能使用不能使用访问修饰符,不能使用不能使用访问修饰符,不能使用static static 例:例:例:例:MOuter.javaMOuter.java 继承继承继承继承(特点,子类的构造方法)特点,子类的构造方法)特点,子类的构造方法)特点,子类的构造方法)多态多态多态多态(引用变量的类型转换,动态绑定)引用变量的类型转换,动态绑定)引用变量的类型转换,动态绑定)引用变量的类型转换,动态绑定)抽象类(抽象类(抽象类(抽象类(abstractabstract)接口(实现多重继承)接口(实现多重继承)接口(实现多重继承)接口(实现多重继承)内部类内部类内部类内部类小结小结