资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,4.3,继承和多态,父类和子类,-,继承和继承的实现,定义:类继承是指一个类可以继承其他类所有的,非私有,成员变量和成员方法。被继承的类称为父类,继承后产生的类称为子类。,格式:,修饰符,class,类名,extends,父类名,类体;,子类的,直接父类,是该子类直接继承的类,而,间接父类,则是两级或两级以上的父类。子类只能有一个直接父亲,称单继承。,JAVA,中只允许单继承,即仅允许每个类有一个直接父类,不允许有多个直接父类,但一个类可以有多个子类。,子类除了继承父类非私有的属性和方法外,还可以有自己的属性和方法。,子类可以继承父类的构造函数,构造函数的继承遵循以下的原则:,子类无条件地继承父类的不含参数的构造函数。,若子类没有定义自己的构造函数,它将继承父类无参数的构造函数作为自己的构造函数。,若子类定义了自己的构造函数,它先执行继承自父类的无参数构造函数,再执行自己的构造函数。,对父类含参数的构造函数,子类可以通过在定义自己的构造函数中使用,super,关键字来调用它,但这个调用语句必须是子类构造函数的,第一个,可执行语句。,附构造函数的继承,例:要求定义三个类:,Person,类,,Student,类,测试使用,Student,类的应用程序类,TestStudent.java,。其中,Person,类是,Student,类的直接父类,定义了姓名、性别、年龄,在,Student,类中,定义了数学、语文课成绩,并求平均成绩。,/Person.java,public class Person,protected String name;,protected char sex;,protected int age;,public Person(),public Person(String str,char ch,int i),name=str;sex=ch;age=i;,public String toString(),return,姓名:,+name+,性别:,+sex+,年龄:,+age;,/Student.java,public class Student extends Person,protected int chinese,math;,public Student(),public Student(String str,char ch,int x,int y,int z),name=str;sex=ch;age=x;,chinese=y;,math=z;,public int average(),return(chinese+math)/2;,子类要调用父类的构造函数,可用,super(),来实现。,这里可替换为:,super(str,ch,x),子类构造函数的形参表,只能使用其父类构造函数中用过的形参表,或者是对它的扩充。,/TestStudent.java,public class TestStudent,public static void main(String args),Student s1=new Student();,System.out.println(“s1:”+s1.toString()+“,成绩,;+s1.average();,Student s2=new Student(Tom,m,25,88,97);,System.out.println(s2:+s2.toString()+,成绩,;+s2.average();,注:调用子类不含参数的构造函数时,先调用父类不含参数的构造函数,程序运行后,结果为多少?,思考:,4.3.2,子类对父类的变量隐藏和方法覆盖,继承性可以使子类继承父类所有非私有的变量和方法,当一个父类成员不适合该子类时,子类可以重新定义它。,变量的隐藏:,子类重新定义从父类继承来的同名变量。,这时子类若引用父类的同名变量,要用,super,关键字做前缀:,super.,变量名,方法的覆盖:,子类重新定义从父类继承来的同名方法。即:方法头与父类一样,方法体不一样。这也是,Java,多态性的表现之一。,覆盖方法必须和被覆盖方法具有相同的方法名称、参数列表和返回值类型。,覆盖方法时,不能使用比父类中被覆盖的方法更严格的访问权限。,若子类中调用被覆盖的父类中的同名的方法,可以通过,super,关键字做前缀:,super.,方法名,(),/Automobile.java,public class Automobile,public double speed;,Automobile(),speed=200.0;,public double get_speed(),return speed;,/Car.java,public class Car extends Automobile,public double speed;,Car(),speed=0.0;,public double add_class(),speed=speed+1;,return speed;,public double add_fa_class(),super.speed=super.speed+1;,return speed;,/TestCar.java,public class TestCar,public static void main(String args),car c1=new car();,System.out.println(speed of car:+c1.add_class()+,speed of Automobile:+c1.get_speed();,System.out.println(speed of car:+c1.add_fa_class()+,speed of Automobile:+c1.get_speed();,程序运行后,结果为多少?,思考:,4.3.3,抽象类和最终类,一、抽象类,Java,中可以定义一些,不含方法体,的方法,它的方法体的实现交给该类的子类根据自己的情况去实现,这样的方法就是抽象方法,包含抽象方法的类就叫抽象类。一个抽象类中可以有多个抽象方法。,abstract,返回值类型 抽象方法(参数列表);,抽象方法的写法:,抽象类必须用,abstract,关键字来修饰;抽象方法也必须用,abstract,来修饰,,abstract,不能用来修饰变量。,含有抽象方法的类肯定是抽象类,抽象类中的某个方法不一定是抽象的。,抽象类不能被实例化,也就是不能用,new,关键字去产生对象。,如果一个类继承自某个抽象父类,而没有具体实现抽象父类中的抽象方法(编写方法体),则必须定义为抽象类(用,abstract,修饰)。,抽象类的子类必须覆盖所有的抽象方法后才能被实例化,否则该子类还是个抽象类。,例 编写一个程序,首先定义一个描述平面图形的抽象类,Figure,,然后派生出圆类,Circle,和矩形类,Rectangle,。由于平面图形都有面积,其父类中可定义求面积的方法,area(),。但子类求面积的方法,area(),是不同的,因此父类,Figure,中将,area(),定义为抽象方法,area(),,就可以求出子类所描述的形状的面积。,/Figure.java,public abstract class Figure,protected double x;,Figure(),Figure(double x1)/,定义边长,x=x1;,abstract public double area();,public String toString(),return x=+x;,/Circle.java,public class Circle extends Figure/,圆类,public Circle(double x1),super.x=x1;,public double area()/,具体实现父类中的抽象方法,求圆面积,return 3.14*x*x;,public String toString(),return,圆:,t+super.toString()+t area=+area();,/Rectangle.java,public class Rectangle extends Figure/,长方形类,protected double y;,public Rectangle(),public Rectangle(double a,double b),super(a);,y=b;,public double area()/,具体实现父类中的抽象方法,求长方形面积,return x*y;,public String toString(),return,长方形,t+super.toString()+t y=+y+t area=+area();,/TestFigure.java,public class TestFigure,public static void main(String args),Rectangle R1=new Rectangle(10.0,20.0);,Circle C1=new Circle(10.0);,System.out.println(R1.toString();,System.out.println(C1.toString();,运行结果为:,
展开阅读全文