1、Java程序设计,第三部分 面向对象程序设计高级篇,学习目标,理解类继承的概念以及父类和子类的关系 理解super关键字 掌握方法覆盖、多态性、动态绑定和对象的强制类型转换 理解数据字段和静态方法的隐藏 掌握修饰符:protected、final 设计和使用抽象类 掌握接口的声明和实现,Employee和Manager,public class Employee public String name; public double salary; public Date birthDate; public String getDetails() . ,public class Manager public String name; public double salary; public Date birthDate; public String department; public String getDetails() . ,继承,public class Employee public String name; public double salary; public Date b
2、irthDate; public String getDetails() . ,public class Manager extends Employee public String department; ,父类和子类,语法 class ClassName extends Superclass class body 如果class C1 extends C2,则称C1为子类(subclass),C2为父类(superclass)。 子类继承了父类中可访问的数据和方法,子类也可添加新的数据和方法, 子类不继承父类的构造函数。 一个类只能有一个直接父类。,例 几何对象类,编写程序,父类GeometricObject,两个子类Circle和Rectangle。,Example:Circle.java, Rectangle.java, TestCircleRectangle.java,super关键字,调用父类的构造函数 super(parametersopt)调用父类的的构造函数。 必须是子类构造函数的第一条语句。 如果子类中没有显式地调用父类的构造函数,那么将自动调用父类不带参数的构造函
3、数。 父类的构造函数在子类构造函数之前执行。 调用父类的成员 super.data super.method(parameters),方法覆盖,如果子类重新定义了从父类中继承的实例方法,称为方法覆盖(method override)。 仅当方法是可访问的实例方法时,才能被覆盖,即私有方法不能被覆盖。 静态方法不能被覆盖,如果静态方法在子类中重新定义,那么父类方法将被隐藏。 一旦父类中的方法被覆盖,则不能从子类外部访问被覆盖的方法。在子类中可以使用super引用被覆盖的方法。,Example:Circle.java, Rectangle.java, TestCircleRectangle.java,覆盖与重载,public class Test public static void main(String args) A a = new A(); a.p(10); class B public void p(int i) class A extends B public void p(int i) System.out.println(i); ,public class Test pub
4、lic static void main(String args) A a = new A(); a.p(10); class B public void p(int i) class A extends B public void p(double i) System.out.println(i); ,Object类,java.lang.Object类是所有类的父类。如果一个类在声明时没有指定父类,那么这个类的父类是Object类。 equals方法:用于测试两个对象是否相等。Object类的默认实现是比较两个对象是否引用同一个对象。 toString方法:返回代表这个对象的字符串。Object类的默认实现是返回由类名、和hashCode组成。,多态性、动态绑定,当调用实例方法时,由Java虚拟机动态地决定所调用的方法,称为动态绑定(dynamic binding) 或为多态(polymorphism)。 假定对象o是类C1的实例,C1是C2的子类,C2是C3的子类,Cn-1是Cn的子类。也就是说,Cn是最一般的类,C1是最特殊的类。在Java中,Cn是Object类。如果调用o的方
5、法p,Java虚拟机按照C1、C2、Cn的顺序依次查找方法p的实现。一旦找到一个实现,将停止查找,并执行找到的第一个实现。,通用编程,父类变量可以引用子类对象,针对父类对象设计的任何代码都可以应用于子类对象。 多态性允许方法使用更通用的类作为参数类型。 如果方法参数是父类,那么这个参数可以接受任何子类对象作为实参。当调用这对象的方法时,将动态绑定方法的实现。,Example:PolymorphismDemo.java,类型转换,类型转换(type casting)可以将一个对象的类型转换成继承结构中的另一种类型。 从子类到父类的转换是合法的,称为隐式转换。 m(new Student(); Object o = new Student(); m(o); 从父类到子类必须显式转换,被转换的变量所指向的对象的类型必须是转换类或它的子类。 Object o = new Student(); Student s = (Student)o; o所指向的对象必须是Student或Student子类的对象,instanceof操作符,可以用instanceof操作符判断一个对象是否是一个类的实例。表
6、达式返回boolean值。 语法 referenceVariable instanceof TypeName,例 强制类型转换,编写程序,创建两个几何对象:圆和矩形。调用displayObject来显示结果。 如果对象是圆,显示半径和面积 如果对象是矩形,显示面积,Example:TestPolymorphismCasting.java,隐藏数据字段和静态方法,如果子类中声明的数据字段和静态方法与父类中的名称相同,那么父类中的将被隐藏(hide)。 通过super关键字访问被隐藏的数据字段和静态方法。 通过父类型的变量访问被隐藏的数据字段和静态方法。 成员访问 实例方法根据变量所引用的对象的实际类型进行访问。 数据字段和静态方法根据变量的声明类型进行访问。,Example:HideDemo.java,A x = new B();,protected修饰符,protected修饰符用于修饰数据和方法,可以被同一个包中的任何类或不同包中的子类访问。,C1,public int x protected int y int z private int u,C2中的代码可以访问x,y,z C3中
7、的代码可以访问c1对象中的x,y,z C4中的代码可以访问x,y C5中的代码可以访问c1对象中的x,类成员的访问控制符 类的访问控制符 public:类可以被任何包中的类访问 无(package):只有同一个包中的类可以访问,访问控制符,final修饰符,final数据:常量,数据初始化后不能再修改。 final方法:最终方法,子类不能覆盖。 final类:最终类,不能派生子类。 String, StringBuffer final局部变量:数据初始化后不能再修改。,抽象类和抽象方法,Java中可以定义不含方法体的方法,方法的方法体由该类的子类根据自己的情况去实现,这样的方法称为抽象方法(abstract method),包含抽象方法的类必须是抽象类(abstract class)。 一个类C如果满足下面的任一条件,则该类包含抽象方法: 类C显式地包含一个抽象方法的声明; 类C的父类中声明的抽象方法未在类C和它的父类中实现; 类C的父接口中声明或继承一个方法,并且类C中未声明或继承一个方法来实现它。,注意,抽象类和抽象方法必须用abstract关键字来修饰。 只有实例方法可以声明为抽
8、象方法。 抽象类不能被实例化,即不能用new关键字创建对象。 抽象类的父类可以是具体类。 具体子类必须实现抽象父类中所有抽象方法,否则子类需要声明为抽象类。,抽象类示例,Example:GeometricObject.java,Circle.java, Rectangle.java, TestGeometricObject.java,接口,接口是常量和抽象方法的集合。接口是能力、规范、协议的反映。 语法 modifier interface interfaceName constant_declaration* abstract_method_declaration* 接口中的数据字段隐含为public static final 接口体中的方法隐式地声明为public abstract,使用接口,可以在能够使用任何其他数据类型的地方使用接口。 接口类型属于引用类型,接口类型的变量可以存储: 空引用(null) 任何实现该接口的类的实例的引用 类实现接口的语法 modifier class className extends superclass implements interface
9、NameList member_declaration* 除非类被声明为abstract,所有父接口中声明的成员方法必须被实现,或者通过在类中声明或者通过从父类继承已有的方法声明。,例1,public interface Flyer void takeOff(); void land(); void fly(); public class Airplane implements Flyer public void takeOff() / 加速直到离地升空 / 收起起落架 public void land() / 放下起落架 / 减速并降低副翼直到降落 / 刹车 public void fly() / 保持引擎运转 ,例2,例3,例4,接口继承,一个接口可以继承多个接口。 语法 modifier interface interfaceName extends interfaceNameList declaration* 如果接口声明中提供了extends子句那么该接口就继承了父接口的成员类型、方法和常量。这些接口称为声明接口的直接父接口。 任何实现该接口的类,必须实现该接口继承的其他接口。,接口和抽象类的比较,基本数据类型的包装类,作用 为基本数据类型提供方法和常量值 用于只能处理对象引用的地方 包装类的对象的值是不变的,Number,Byte,Short,Integer,Long,Float,Double,Character,Boolean,Object,构造函数与通用方法,构造函数 以一个对应的基本数据类型为参数 以字符串为参数(除了Character) 通用方法 public static Type valueOf(String str) public String toString() public type typeValue() public int compareTo(Type other) public int compareTo(Object obj) public boolean e
《[工学]part03-java面向对象编程高级篇》由会员tia****nde分享,可在线阅读,更多相关《[工学]part03-java面向对象编程高级篇》请在金锄头文库上搜索。