资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,继 承,0,本节学习目标:,1.,继承的思想,2.JAVA,语言继承的实现,1,1,、什么是继承?,面向对象程序设计中,可以在已有类的基础上定义新的类,而不需要把已有类的内容重新书写一遍,这就叫做继承。已有的类称为基类或,父类,,在此基础上建立的新类称为,派生类,或,子类,。,运用继承,父类的特性,不必再重新定义,,就可以被其它类继承。,继承是面向对象编程技术的一个重要机制。,较好地解决了代码重用问题。,任何一个类都可以作为基类,从这个基类可以派生出多个子类,这些派生的类不仅具有基类的特征,而且还可以定义自己独有的特征。,2,2,、,java,语言中继承的定义,定义继承的形式为:,类修饰符,class,类名,extends,父类,类体,两个类之间的继承关系由,extends,关键字指明。,3,3,、举例,1,class Person,String name;,private,int,age;,Person(String,n,int,a),name=n;age=a;,public void print(),System.out.println(“My,name is”+name+”.”);,class Student,extends,Person,private float,java,english,;,Student(String,n,int,a,float,j,float,e),super(n,a,);,java=j;,english,=e;,void show(),System.out.println(“java,score is”+java+”.”);,System.out.println(“eng,score is”+,english,+”.”);,4,举例,1,(续),class,Xuesheng,public static void,main(String,args,),Student s1=new Student(tct1,18,67,89);,s1.show();,5,如果子类继承了父类,则子类自动具有父类的全部数据成员,(,数据结构,),和成员方法,(,功能,),;但是,子类对父类成员的访问有所限制;,子类可以定义自己的数据成员和成员函数,同时也可以,修改,父类的数据成员或,重写,父类的方法;,父类、子类都是,“,相对,”,的;,在,Java,中,,Object,类为特殊超类或基类,所有的类都直接或间接地继承,Object,;,Java,语言只支持单继承,如果要使用多继承的机制,可以运用将要讲解的接口,(interface),。,4,、关于,JAVA,语言继承的几点说明:,6,5,、包括继承的类成员访问权限,private,:只允许该成员自身所属的类访问,不允许子类访问;,默认修饰符:允许定义它的类自身以及处于同一个包中的其它类访问(包括子类);,不允许不同包中的子类访问;,protected:,保护成员,,允许定义它的类自身以及处于同一个包中的其它类访问(包括子类);,还允许不同包中的子类访问。,public:,允许所有类访问该,成员,;,在同一包中,子类可以访问父类除私有成员(,private,修饰的)之外的所有属性和方法。,7,被本类访问,被同一包中的其他类访问,被不同包中的其他类访问,被子类访问,(相同包),被子类访问,(不同包),Private,允许,不允许,不允许,不允许,不允许,默认修饰符,允许,允许,不允许,允许,不允许,Protected,允许,允许,不允许,允许,允许,Public,允许,允许,允许,允许,允许,类成员的访问权限小结:,8,6,、继承中构造函数的调用,(,1,)在创建一个子类对象时,系统通过子类的构造函数首先调用父类的构造函数,然后执行子类构造函数中的其余语句;,(,2,)子类构造函数使用“,super,()”,调用父类构造函数,,super,调用要作为子类构造函数的,第一条,语句;,(,3,)如果子类构造函数中没有,super,调用,同时父类中不存在带形参的构造函数,则,Java,会自动加一条默认的,super(),来调用父类构造函数,负责父类数据成员的初始化,否则系统认为存在语法错误,;,(,4,)如果父类声明了带有形参表的构造函数,子类就应当声明带形参的构造函数,同时在子类构造函数的第一条语句提供一个带形参的,super,调用,提供一个将参数传递给父类构造函数的途径,保证在进行初始化父类时能够获得必要的数据。,9,构造函数继承的实例,class Point,protected,int,x,y;,public Point(),x=0;,y=0;,System.out.println,(,零点坐标为,:+String1();,public,Point(int,a,int,b),x=a;,y=b;,System.out.println,(,点的坐标为,:+String1();,public String String1(),return+,x+,+y,+;,10,构造函数继承的实例(续),class Circle extends Point,protected double radius;,public,Circle(double,r),radius=r;,System.out.println,(,零点圆心及坐标为:,);,System.out.println,(String2();,public,Circle(int,p1,int p2,double r),super(p1,p2);,radius=r;,System.out.println,(,圆心及坐标为:,);,System.out.println,(String2();,public String String2(),return,坐标:,+String1()+,半径:,+radius;,public class Test1,public static void main(String,args,),Circle circle1=new Circle(1,2,5);,11,class Shape,public,int,x,y,;,private,int,m,n,;,public Shape(),x=10;y=20;,m=100;n=200;,System.out.println(x,=+x+y=+y);,System.out.println(this,is a,Constractor,of shape);,public void measure(),int,s;,s=x*y;,System.out.println(result,=+s);,private void show(),System.out.println(x,=+x+y=+y);,综合举例,12,综合举例(续),class Rectangle extends Shape,public static void,main(String,args,),int,width=30,height=10;,Rectangle,tt,=new Rectangle();,tt.x,=width;,tt.y,=height;,tt.measure,();,/*width=,tt.m,;,对于,Rectangle,子类不能继承父类的私有成员变量的值,所以此语句会产生语法错误*,/,/height=,tt.n,;,与上相同,/,tt.show,();/,不能引用,show(),私有方法,13,this,与,super,this,表示当前活动对象本身。任何一个活动的对象都有一个默认的,this,指针指向自己。,使用格式:,this.,成员变量名;,this.,成员方法名;,用法之一:,class X1,int,x,y,;,X1(int,x,int,y),this.,x,=x;,this.,y,=y;,Public static void,main(String,args,),X1 a=new X1(1,2);,14,super,表示当前活动对象的直接父类对象。,使用格式:,super.,成员变量名;,super.,成员方法名;,super,(传递给父类成员变量的参数),用法:见前例,注意:静态方法中不能使用,this,和,super,。,15,属性的隐藏和方法的覆盖,属性的隐藏是指子类中定义了和父类同名的属性,,实际应用较少。,方法的覆盖是指类中定义了和父类同名的方法,子类在调用这个同名方法时,默认是调用它自己定义的方法,而将从父类继承来的方法“覆盖”住,好像此方法不存在一样。如果一定要调用父类的同名方法,可以使用“,super”,关键字。(见书例,5-1,),16,观察下面程序的运行结果,class X1,Protected,int,x,y,;,X1(int i),x=,I;y,=x*2;,int,gety,(),return y;,void show(),System.out.println(“x,=”+x+”+”y=”+y);,class,Myclass,public static void main(String,args,),X2 x=new X2(5);,x.sety,();,x.show,();,class X2 extends X1,Protected,int,x,y,;,X2(int j),super(3);,this.x,=j;,int,gety,(),return y;,void show(),System.out.println(“super.x,=”+,super.x,+”+”,this.x,=”+x);,void,sety,(),y=,super.x,*,this.x,;,System.out.println(“super.y,=”+,x.gety,();,System.out.println(“this.y,=”+,x.y,);,17,7,、终止继承,如果一个类被,final,修饰符所修饰,那么这个类就不能有子类。,被定义为,final,的类通常是一些用来完成某些标准功能的类,这些类中的属性和方法固定下来,不希望通过继承来改变,保证这个类所实现的功能正确无误,。,18,上机作业:,题目,首先设计一个人员类,person,作为基类,其数据成员为姓名、年龄和性别,成员函数显示信息;设计,person,的子类学生类,student,,,student,的数据成员有,math,、,english,和,java,成绩,要有求总分和平均分的成员函数和显示信息的成员函数。,要求:,1,成员变量可以通过构造函数参数传值来赋值。,2,将,person,类的成员变量的修饰符分别设置为默认修饰符、,public,、,protected,和,private,分别进行测试,观察和分析运行结果。,注意:,1,、理解题意。,2,、上机之前在作业本上写出程序。,3,、记录调试程序时出现的错误,在作业本上说明出错的原因。,19,
展开阅读全文