Java语言第四章继承和多态.ppt
文本预览下载声明
第四章 继承和多态 继承和多态 4.1继承基础 4.2构造器的调用顺序 4.3 继承还是组合? 4.4 Object类 4.5 toString方法 4.6 对象的比较 4.1继承基础 类与类之间还有一种父与子的关系,子类继承父类方法与属性,这个我们就称之为继承 子类拥有父类的一些公有的属性和方法,并且子类可能也会有自己的方法和属性 除了添加父类中没有的新方法外子类还可以通过重写父类的方法来重定义自己的行为方式 继承基础 重写与重载不同,重载需要不同的参数来区别相同方法名的方法,重写是发生在子类与父类上,重写父类方法必须与父类的方法名同名同参并且同返回值 。 当访问修饰符为private时,表明该方法不能被重写,同样当方法具有final关键字时该方法不能被重写 。 子类虽然重写了父类的某个方法,但仍然需要用到父类的这个方法,这时使用super关键字仍然可以调用父类的方法 。 程序4.1 TestExtends.java示例继承机制 Static方法不能重写 Bird类派生了鸵鸟Ostrich类 ,以上程序声明了一个Bird类型的鸵鸟对象,象基本类型数据的自动提升一样,鸵鸟自动提升为Bird类,这叫做向上转型。 static方法是不会被重写 如TestOstrich.java所示:子类中定义了与父类同名的fly方法,父类的fly方法不会被重写,而是被遮蔽因此得出结果鸵鸟会飞! 4.2构造器的调用顺序 子类在产生对象实例时首先会调用父类的构造方法,如果没有显示的指定调用父类自定义的构造方法,那么编译器会调用默认的父类构造方法:super 。但是父类如果自定义了带参数的构造方法,就必须在子类的构造方法中指定调用它,否则会因找不到super 而报错。注意,如果需要显示的调用父类构造方法,必须将其写在构造方法里的第一行 。 接着按声明的顺序调用成员初始化。 最后调用本构造方法的方法体 例:程序4.3 TestInheritanceConstructor.java 4.3 继承还是组合? 判断继承关系的一条定律是看它是否符合is-a的定义 继承打破了类的封装子类继承了父类的成员就意味着父类成员有所改变时子类必须随之变化,这削弱了子类的独立性,增加了软件维护的难度。 继承的层次不宜过多,设计时良好的继承体系书应该保持在三层以内。 我们复用类时的指导原则是优先选择组合 4.4 Object类 Java中所有的类都是继承自一个老祖宗,Object类,它们都是Object类的子类。如果一个类在声明时没有用extends关键字显式的指定继承自某个基类,则Java隐式的指定它的默认基类为Object类。 这种强制的继承模式叫做单根继承模式。单根继承使得Java简化了许多操作,基于单根继承,所有的对象都可以像基本数据类型一样向上转型到根层次上而使其操作上一视同仁 单根继承的优势还在于可以在Object类定义所有对象都通用的方法,所有类都会自动继承这些方法 4.5 toString方法 Object类定义了 public String toString 方法,返回值是String类型,每当个对象都会有个toString方法,作用就是描述对象的信息 要想使用toString方法必须按自己的需求重写这个方法 4.6 对象的比较 Java中比较两个基本数据类型变量的值时很简单使用“ ”操作符 Object类中的equals方法提供了对象内容的比较方法 同样我们要是用这个方法必须重写它 如果不重写equals方法,将调用object类的eaquals方法。Object类的equals方法相当于“ ” 例:程序4.7 TestEquals.java 4.7多态 4.7.1向上转型(upcasting) 4.7.2动态绑定 4.7.3构造器中多态方法的行为 4.7.4向下转型 4.7多态 多态是和继承密切相关的,正因为有继承,才会有多态出现。多态从字面上的意思应该是多种形态。更进一步,延伸到继承里来,那么多态就应该是具有相同的操作不同的行为的一种特征。 4.7.1向上转型(upcasting) public?class?Shape void?draw static?void?start Shape?s s.draw ; public?static?void?main String?[]?agrs start new?Circle ; start new?Square ; class?Circle?extends?Shape void?draw System.out.println “draw?Circle” ; class?Square?extends?Shape void?draw System.out
显示全部