第5章继承与多态 ■第四章已经有论及,抽象性、封装性、继承性和多态性称 为面向对象的四大特性。通过前面的学习,对前两个特性有 了一定程度的理解,本章将继续探讨后两个特性,即继承性 和多态性
◼第四章已经有论及,抽象性、封装性、继承性和多态性称 为面向对象的四大特性。通过前面的学习,对前两个特性有 了一定程度的理解,本章将继续探讨后两个特性,即继承性 和多态性。 第5章 继承与多态
本章要点 ■类的继承; ■类成员的隐藏与重载; ■多态性; ■ Object类和cas类; 抽象类与接口; 对象克隆; ■对象转型和类的设计原则
◼类的继承; ◼类成员的隐藏与重载; ◼多态性; ◼Object类和 Class类; ◼抽象类与接口; ◼对象克隆; ◼对象转型和类的设计原则 本章要点
51类的继承 ■]ava中的继承分类的继承和接口的继承两种,类 的继承只支持单继承;而接口的继承可以是多重继 承
◼Java中的继承分类的继承和接口的继承两种,类 的继承只支持单继承;而接口的继承可以是多重继 承。 5.1 类的继承
51类的继承—子类的定义 子类的定义子类也是类 它的定义形式与一般类的定义形式极其相似,其格式为: I Modifiers] class Sub className extends SuperclassName d//classBody 其中, Modifiers是修饰符,可以使用的修饰符与前一章中所 介绍的一样; SubClassName是子类的名称; extends是用于 实现继承的关键字,当类的定义中有 extends关键字时,表 示当前定义的类继承于别的类,是别的类的子类; SuperClassName是父类名; Classbody是子类的类体
[Modifiers] class SubClassName extends SuperClassName { //ClassBody } ▪子类的定义子类也是类。 它的定义形式与一般类的定义形式极其相似,其格式为: 其中,Modifiers是修饰符,可以使用的修饰符与前一章中所 介绍的一样;SubClassName是子类的名称;extends是用于 实现继承的关键字,当类的定义中有extends关键字时,表 示当前定义的类继承于别的类,是别的类的子类; SuperClassName是父类名;ClassBody是子类的类体。 5.1 类的继承——子类的定义
51类的继承—子类的定义示例 class Point∥/点类 protected int x,y;//点坐标 public Point(t //无参构造方法 public Point(int xx, int yytsetPoint(xx, yyi public void setPoint(int m, int n){x=my=n}/设置标位置 public int getxotreturn X;] public int getYotreturn yi] 继承于点 类的圆类 class Circle extends point//定义圆类 private double radius / radius为圆的半径 public Circle(int x,int y, double r)this x=X; thisy=y; setRadius(r)il public void setRadius( double r) radius=r;}//设置圆的半径 public double getRadiuso{ return radius}//获取圆的半径 public double getAreaotreturn3.1415* radius* radius;//获取圆 的面积
class Point{ //点类 protected int x,y; //点坐标 public Point(){} //无参构造方法 public Point(int xx,int yy){setPoint(xx,yy);} public void setPoint(int m,int n){x=m;y=n;} //设置标位置 public int getX(){return x;} public int getY(){return y;} } class Circle extends Point{ //定义圆类 private double radius; //radius为圆的半径 public Circle(int x,int y,double r){this.x=x;this.y=y;setRadius(r);} public void setRadius(double r){radius=r;} //设置圆的半径 public double getRadius(){return radius;} //获取圆的半径 public double getArea(){return 3.1415*radius*radius;} //获取圆 的面积 5.1 类的继承——子类的定义示例 继承于点 类的圆类
51类的继承—子类的定义示例 public String toString i return"Position (+X++y+ Radius="+radius; y } public class CircleTestt public static void main( String[] args Circle c=new Circle(50, 50, 10); System. out println(c toString); CsetPoint(100, 100) CsetRadius(20); System. out printin(c tostring); } 例中,定义了三个类 Point、 Circle和 ircleTest。 Circle继承于 Point类 Point类是父类,Cide是子类,它们的UML图及相互关系如图5.1所示。 而 CirdleTest类用于对 Circle作一简单测试
public String toString() { return"Position("+x+","+y+")Radius="+radius;} } public class CircleTest{ public static void main(String[] args){ Circle c=new Circle(50,50,10); System.out.println(c.toString()); c.setPoint(100,100); c.setRadius(20); System.out.println(c.toString()); }} 5.1 类的继承——子类的定义示例 例中,定义了三个类Point、Circle和CircleTest。Circle继承于Point类, Point类是父类,Circle是子类,它们的UML图及相互关系如图5.1所示。 而CircleTest类用于对Circle作一简单测试
51类的继承—子类的定义示例 Point tx: int ty int +Point +Point (int, int) +setPoint(int, int): void getxo:in +getO: int 图51 Circle -radius double +Circle(int, int, double) +setRadius (double): void +getRadiuso: double +getAreao: double +to string o: string
5.1 类的继承——子类的定义示例 图5.1
51类的继承—子类的构造方法 在子类的定义示例有这样一条语句: public Point{}/无参构造方法 Java中,在执行子类的构造方法时,必须先执行父类的构造 方法,它的第一条语句必须是调用父类的构造方法的语句。 调用父类的构造方法是通过语句 super(来完成的。如果要调 用父类的有参构造方法,则在 super(的圆括号中加入所需的 参数 当在子类的构造方法中通过 super()来调用父类的构造方法时 如果不带参数,则这样的显式调用可以省略,它调用父类的 构造方法是由系统自动进行的。但是,此时,如果父类中没 有显式定义无参的构造方法,则编译出错
在子类的定义示例有这样一条语句: 5.1 类的继承——子类的构造方法 public Point(){} //无参构造方法 Java中,在执行子类的构造方法时,必须先执行父类的构造 方法,它的第一条语句必须是调用父类的构造方法的语句。 调用父类的构造方法是通过语句super()来完成的。如果要调 用父类的有参构造方法,则在super()的圆括号中加入所需的 参数。 当在子类的构造方法中通过super()来调用父类的构造方法时, 如果不带参数,则这样的显式调用可以省略,它调用父类的 构造方法是由系统自动进行的。但是,此时,如果父类中没 有显式定义无参的构造方法,则编译出错
52类成员的隐藏与重载 通过类的继承,子类继承了父类的成员,同时 在子类中还可以添加一些新成员。但是,当在 子类中添加的成员与父类中的成员同名时,系 统如何处理这样的冲突呢?本节主要探讨这个 问题
◼ 通过类的继承,子类继承了父类的成员,同时 在子类中还可以添加一些新成员。但是,当在 子类中添加的成员与父类中的成员同名时,系 统如何处理这样的冲突呢?本节主要探讨这个 问题。 5.2 类成员的隐藏与重载
52类成员的隐藏与重载—类成员的继承 通过继承,子类继承了父类中除构造方法以外的所有成员,这些 成员称为子类的继承成员。继承成员不仅包括在超类中定义的公 有( public)、受保护( protected)及私有成员( private),还 包括超类的继承成员。但是在子类中,只能直接引用父类中用 public或 protected修饰的成员,父类中用 private修饰的成员在子 类中不可直接引用,因为它们受访问属性的控制 使用子类的程序能访问子类的公有继承成员,但不能访问子类的 受保护和私有的继承成员。子类的内部能访问它自己定义的所有 成员,在程序中,只能访问子类自己定义的公有成员,而不能访 问子类自己定义的受保护和私有成员
◼ 通过继承,子类继承了父类中除构造方法以外的所有成员,这些 成员称为子类的继承成员。继承成员不仅包括在超类中定义的公 有(public)、受保护(protected)及私有成员(private),还 包括超类的继承成员。但是在子类中,只能直接引用父类中用 public或protected修饰的成员,父类中用private修饰的成员在子 类中不可直接引用,因为它们受访问属性的控制。 ◼ 使用子类的程序能访问子类的公有继承成员,但不能访问子类的 受保护和私有的继承成员。子类的内部能访问它自己定义的所有 成员,在程序中,只能访问子类自己定义的公有成员,而不能访 问子类自己定义的受保护和私有成员。 5.2 类成员的隐藏与重载——类成员的继承