资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,2,#,Java,类设计,1,2,本章内容,Java,类的继承,方法的重写、覆盖,访问控制,super,关键字,多态性及其应用,Object,类及其主要方法,2,2025/5/31 周六,本章内容,Java,类的继承,方法的重写、覆盖,多态性及其应用,成员访问控制,对象的创建和初始化细节,几种常用的,Java,类,3,2025/5/31 周六,类的继承,(1),为描述和处理,个人,信息,定义类,Person:,public class Person,public String name;,public int age;,public Date birthDate;,public String getInfo(),.,Person,+name:String,+age:int,+birthDate:Date,+getInfo():String,4,2025/5/31 周六,类的继承,(2),为描述和处理,学生,信息,定义类,Student:,public class Student,public String name;,public int age;,public Date birthDate;,public String school;,public String getInfo(),.,Student,+name:String,+age:int,+birthDate:Date,+school:String,+getInfo():String,5,2025/5/31 周六,类的继承,(3),通过,继承,,简化,Student,类的定义,:,public class Person,public String name;,public int age;,public Date birthDate;,public String getInfo().,public class Student,extends,Person,public String school;,/Student,类继承了父类,Person,的所有属性和方法,并增加了一个属性,school,。,Person,中的属性和方法,Student,都可以利用。,Person,+name:String,+age:int,+birthDate:Date,+getInfo():String,Student,+school:String,6,2025/5/31 周六,类的继承,(4),类继承语法规则,:,class ,extends,7,2025/5/31 周六,类的继承,(5),Java,只支持单继承,不允许多重继承,一个子类只能有一个直接父类,一个父类可以派生出多个子类,8,2025/5/31 周六,单继承举例,Person,+name:String,+age:int,+birthDate:Date,+getInfo():String,Student,+school:String,Soldier,Officer,Graduate,+major:String,+register():void,父类,子类,孙子类,9,2025/5/31 周六,类的继承,(6),子类继承了父类,就继承了父类的方法和属性。,在子类中,可以使用父类中定义的方法和属性,也可以创建新的数据和方法。,因而,,子类通常比父类的功能更多,。,在,Java,中,继承的关键字用的是“,extends,”,,即子类不是父类的子集,而是对父类的“扩展”。,关于继承的规则:,子类不能继承父类中私有的,(private),的成员变量和方法,。,10,2025/5/31 周六,练习,1,1.(1),定义一个,ManKind,类,包括,成员变量,int sex,和,int salary,;,方法,void manOrWorman(),:根据,sex,的值显示“,man”(sex=1),或者“,women”(sex=0),;,方法,void employeed(),:根据,salary,的值显示“,no job”(salary=0),或者“,job”(salary!=0),。,(2),定义类,Kids1,继承,ManKind,,并包括,成员变量,int yearsOld,;,方法,printAge(),打印,yearsOld,的值。,(3),在,Kids1,类的,main,方法中实例化,Kids1,的对象,someKid,,用该对象访问其父类的成员变量及方法。,11,2025/5/31 周六,练习,1,2.,根据下图实现类。在,TestCylinder,类中创建,Cylinder,类的对象,设置圆柱的底面半径和高,并输出圆柱的体积。,Circle (,圆,),-radius:double,Circle():,构造方法,将,radius,属性初始化为,1,+setRadius(double radius):void,+getRadius():double,+findArea():double,计算圆的面积,Cylinder (,圆柱,),-length:double,Cylinder():,构造方法,将,length,属性初始化为,1,+setLength(double length):void,+getLength():double,+findVolume():double,计算圆柱体积,12,2025/5/31 周六,本章内容,Java,类的继承,访问控制,方法的重载、覆盖,super,关键字,多态性及其应用,Object,类及其主要方法,13,2025/5/31 周六,访问控制,修饰符,同一个类,同一个包,子类,整体,private,Yes,default,Yes,Yes,protected,Yes,Yes,Yes,public,Yes,Yes,Yes,Yes,可以对,Java,类中定义的,属性,和,方法,进行访问控制,-,规定不同的保护等级:,public,、,protected,、,default,、,private,14,2025/5/31 周六,访问控制举例,(1),class Parent,private,int f1=1;,int f2=2;,protected,int f3=3;,public,int f4=4;,private,void fm1()System.out.println(in fm1()f1=+f1);,void fm2()System.out.println(in fm2()f2=+f2);,protected,void fm3()System.out.println(in fm3()f3=+f3);,public,void fm4()System.out.println(in fm4()f4=+f4);,15,2025/5/31 周六,访问控制举例,(2),class Child extends Parent,/,设父类和子类在同一个包内,private int c1=21;,public int c2=22;,private void cm1()System.out.println(in cm1()c1=+c1);,public void cm2()System.out.println(in cm2()c2=+c2);,public static void main(String args),int i;,Parent p=new Parent();,i=p.f2;,/i=p.f3;i=p.f4;,p.fm2();,/p.fm3();p.fm4();,Child c=new Child();,i=c.f2;,/i=c.f3;i=c.f4;,i=c.c1;,/i=c.c2;,c.cm1();,/c.cm2();c.fm2();c.fm3();c.fm4(),16,2025/5/31 周六,访问控制分析,f2_default,c2_public,f3_protected,f4_public,c1_private,子类对象可以访问的数据,子类的对象可以调用的方法,fm2()_default,fm3()_ protected,fm4()_ public,cm2()_public,cm1()_private,父类,Parent,和子类,Child,在同一包中定义时:,17,2025/5/31 周六,本章内容,Java,类的继承,访问控制,方法的重写、覆盖,super,关键字,多态性及其应用,Object,类及其主要方法,18,2025/5/31 周六,覆盖方法,在子类中可以根据需要对从父类中继承来的方法进行改造,覆盖方法,(,方法的,重置、重写,),,在程序执行时,子类的方法将覆盖父类的方法。,覆盖方法,必须,和被覆盖方法具有相同的,方法名称、参数列表和返回值类型。,覆盖方法不能使用比被覆盖方法更严格的访问权限。,19,2025/5/31 周六,覆盖方法举例,(1),public class Person,public String name;,public int age;,public String getInfo(),return Name:+name+n+age:+age;,public class Student extends Person,public String school;,public String getInfo(),/,覆盖方法,return Name:+name+nage:+age,+nschool:+school;,public static void main(String args),Student s1=new Student();,s1.name=Bob;,s1.age=20;,s1.school=school2;,System.out.println(s1.getInfo();/Name:Bob age:20 school:school2,Person p1=new Person();,p1.getInfo();,/,调用,Person,类的,getInfo(),方法,Student s1=new Student();,s1.getInfo();,/,调用,Student,类的,getInfo(),方法,这是一种“多态性”:同名的方法,用不同的对象来区分调用的是哪一个方法。,20,2025/5/31 周六,覆盖方法举例,(2),class Parent,public,void method1(),class Child extends Parent,private,void method1(),/,非法,子类中的,method1(),的访问权限,private,比被覆盖方法的访问权限,public,弱,public class UseBoth,public void doOtherThing(),Parent p1=new Parent();,Child p2=new Child();,p1.method1();,p2.method1();,21,2025/5/31 周六,修改练习,1,中定义的类,Kids1,,在,Kids1,中重新定义,employed(),方法,覆盖父类,ManKind,中定义的,employed(),方法,输出“,Kids,should study and no job.”,练习,2,22,2025/5/31 周六,本章内容,Java,类的继承,访问控制,方法的重载、覆盖,super,关键字,super,关键字,子类对象的实例化过程,多态性及其应用,Object,类及其主要方法,23,2025/5/31 周六,关键字,super,在,Java,类中使用,super,来引用父类的成分,super,可用于访问父类中定义的属性,如果使用,super,关键字引用父类属性或者方法必须在方法块的第一行出现,super,可用于调用父类中定义的成员方法,super,可用于在子类构造方法中调用父类的构造方法,super,的追溯不仅限于直接父类,24,2025/5/31 周六,关键字,super,举例,public class Person,private String name;,private int age;,public String getInfo(),return Name:+name+nage:+age;,public class Student extends Person,private String school=New Oriental;,public String getSchool()return school;,public String getInfo(),/,调用父类的方法,return,super.getInfo,(),+nschool:+school;,25,2025/5/31 周六,1.,修改练习,3,中定义的类,Kids1,中,employed(),方法,在该方法中调用父类,ManKind,的,employed(),方法,然后再输出“,but Kids should study and no job.”,2.,修改练习,1,中定义的,Cylinder,类,在,Cylinder,类中覆盖,findArea(),方法,计算圆柱的表面积。考虑:,findVolume,方法怎样做相应的修改?,在,TestCylinder,类中创建,Cylinder,类的对象,设置圆柱的底面半径和高,并输出圆柱的表面积和体积。,附加题:在,TestCylinder,类中创建一个,Circle,类的对象,设置圆的半径,计算输出圆的面积。体会父类和子类成员的分别调用。,练习,4,26,2025/5/31 周六,构造方法不能继承,子类继承父类所有的成员变量和成员方法,但不继承父类的构造方法,在一个,Java,类中可以通过两种方式获得构造方法,使用系统默认的无参数构造方法,显式定义一个或多个构造方法,一旦显式定义了构造方法,则系统,不再,提供默认构造方法,27,2025/5/31 周六,调用父类构造方法,在子类的构造方法中,可使用,super(,参数列表,),语句调用父类的构造方法,如果子类的构造方法中没有显示地调用父类构造方法,也没有使用,this,关键字调用重载的其它构造方法,则系统默认调用父类,无参数,的构造方法,如果子类构造方法中既未显式调用父类构造方法,而父类中又没有无参的构造方法,则编译出错,28,2025/5/31 周六,调用父类构造方法举例,(1),1 public class Person,2,3 private String name;,4 private int age;,5private Date birthDate;,6,7 public Person(String name,int age,Date d),8 this.name=name;,9 this.age=age;,10 this.birthDate=d;,11 ,12 public Person(String name,int age),13 this(name,age,null);,14,15 public Person(String name,Date d),16 this(name,30,d);,17,18 public Person(String name),19 this(name,30);,20,21/,22 ,29,2025/5/31 周六,调用父类构造方法举例,(2),1 public class Student extends Person,2 private String school;,3,4 public Student(String name,int age,String s),5,super(name,age),;,6 school=s;,7,8 public Student(String,name,String s),9,super(name),;,10 school=s;,11,public Student(String s),/,编译出错,:no super(),系统将调用父类无参数的构造方法。,13 school=s;,14,15 ,30,2025/5/31 周六,思考,1).,为什么,super(),和,this(),调用语句不能同时在一个构造函数中出现?,2).,为什么,super(),或,this(),调用语句只能作为构造函数中的第一句出现?,子类对象的实例化过程,31,2025/5/31 周六,练习,7,修改练习,1,中定义的,Circle,类和,Cylinder,类的构造方,法,利用构造方法参数为对象的所有属性赋初值。,32,2025/5/31 周六,本章内容,Java,类的继承,方法的重载、覆盖,访问控制,super,关键字,多态性及其应用,多态,instanceof,运算符,类型转换异常,Object,类及其主要方法,33,2025/5/31 周六,多态性,(1),多态,在,Java,中,,子类,的对象可以替代,父类,的对象使用,一个变量只能有一种确定的数据类型,一个引用类型变量可能指向,(,引用,),多种不同类型的对象,Person p=new Student();,Object o=new Person,();/Object,类型的变量,o,,指向,Person,类型的对象,o=new Student();,/Object,类型的变量,o,,指向,Student,类型的对象,父类类型的变量可以指向子类的对象,34,2025/5/31 周六,多态性,(2),一个引用类型变量如果声明为父类的类型,但实际引用的是子类对象,那么该变量就,不能,再访问子类中添加的属性和方法,Student m=new Student();,m.school=“pku”;,/,合法,Student,类有,school,成员变量,Person e=new Student();,e.school=“pku”;,/,非法,Person,类没有,school,成员变量,属性是在编译时确定的,编译时,e,为,Person,类型,没有,school,成员变量,,因而编译错误。,35,2025/5/31 周六,虚拟方法调用,(Virtual Method Invocation),正常的方法调用,Person e=new Person();,e.getInfo();,Student e=new Student();,e.getInfo();,虚拟方法调用,(,多态情况下,),Person e=new Student();,e.getInfo();/,调用,Student,类的,getInfo(),方法,编译时类型和运行时类型,编译时,e,为,Person,类型,而方法的调用是在运行时确定的,所以调用的是,Student,类的,getInfo(),方法。,动态绑定,36,2025/5/31 周六,多态性应用举例,方法声明的形参类型为,父类,类型,可以使用,子类的对象,作为实参调用该方法,public class Test,public void method(Person e),/,e.getInfo();,public static void main(Stirng args),Test t=new Test();,Student m=new Student();,t.method(m);,/,子类的对象,m,传送给父类类型的参数,e,37,2025/5/31 周六,instanceof,操作符,x instanceof A,:检验,x,是否为类,A,的对象,返回值为,boolean,型。,要求,x,所属的类与类,A,必须是子类和父类的关系,否则编译错误。,如果,x,属于类,A,的子类,B,,,x instanceof A,值也为,true,。,public class Person extends Object,public class Student extends Person,public class Graduate extends Person,-,public void method1(Person e),if(e instanceof Person),/,处理,Person,类及其子类对象,if(e instanceof Student),/,处理,Student,类及其子类对象,if(e instanceof Graduate),/,处理,Graduate,类及其子类对象,38,2025/5/31 周六,class Person,protected String name=person;,protected int age=50;,public String getInfo(),return Name:+name+n+age:+age;,class Student extends Person,protected String school=pku;,public String getInfo(),return Name:+name+nage:+age,+nschool:+school;,class Graduate extends Student,public String major=IT;,public String getInfo(),return Name:+name+nage:+age,+nschool:+school+nmajor:+major;,练习,8,建立,TestInstance,类,在类中定义方法,method1(Person e);,在,method1,中,:,(1),根据,e,的类型调用相应类的,getInfo(),方法。,(2),根据,e,的类型执行:,如果,e,为,Person,类的对象,输出:“,a person”;,如果,e,为,Student,类的对象,输出,“,a student”,“a person”,如果,e,为,Graduate,类的对象,输出:,“,a graduated student”,“a student”,“a person”,(ex8),39,2025/5/31 周六,对象类型转换,(Casting),基本数据类型的,Casting,:,小的数据类型可以自动转换成大的数据类型,如,long g=20;double d=12.0f,可以把大的数据类型强制转换,(casting),成小的数据类型,如,floate f=(float)12.0 int a=(int)1200L,对,Java,对象的强制类型转换称为造型,从子类到父类的类型转换可以自动进行,从父类到子类的类型转换必须通过造型,(,强制类型转换,),实现,无继承关系的引用类型间的转换是非法的,在造型前可以使用,instanceof,操作符测试一个对象的类型,40,2025/5/31 周六,对象类型转换举例,public class Test,public void method(Person e),/,设,Person,类中没有,getschool(),方法,System.out.pritnln(e.getschool();,/,非法,编译时错误,if(e instanceof Student),Student me=(Student)e;,/,将,e,强制转换为,Student,类型,System.out.pritnln(me.getschool();,public static void main(Stirng args),Test t=new Test();,Student m=new Student();,t.method(m);,41,2025/5/31 周六,本章内容,Java,类的继承,方法的重载、覆盖,访问控制,super,关键字,多态性及其应用,Object,类及其主要方法,Object,类,equals(),方法,toString(),方法,封装类,42,2025/5/31 周六,Object,类(熟悉和掌握),Object,类是所有,Java,类的根父类,如果在类的声明中未使用,extends,关键字指明其父类,则默认父类为,Object,类,public class Person,.,等价于:,public class Person extends Object,.,例:,method(Object obj)/,可以接收任何类作为其参数,Object o=new Person;,method(o);,43,2025/5/31 周六,=,操作符与,equals,方法,(,重点),=,操作符与,equals,方法的区别:,=,:引用类型比较引用,(,是否指向同一个对象,),;,Person p1=new Person();Person p2=new Person();,if(p1=p2),基本类型比较值;,int a=5;if(a=6),用,=,进行比较时,符号两边的数据类型必须一致,(,可自动转换的基本数据类型除外,),,否则编译出错;,equals(),方法是,Object,类的方法,由于所有类都继承,Object,类,也就继承了,equals(),方法。,只能比较引用类型,其作用与“,=”,相同,比较是否指向同一个对象,。格式,:obj1.equals(obj2),特例:当用,equals(),方法进行比较时,对类,File,、,String,、,Date,及封装类(,Wrapper Class,)来说,是比较类型及内容而不考虑引用的是否是同一个对象,;,原因:在这些类中覆盖了,equals(),方法。,44,2025/5/31 周六,=,操作符与,equals,方法举例,class TestEquals,public static void main(String args),MyDate m1=new MyDate(14,3,1976);,MyDate m2=new MyDate(14,3,1976);,if(m1=m2),System.out.println(m1=m2);,else,System.out.println(m1!=m2);/m1!=m2,if(m1.equals(m2),System.out.println(m1 is equal to m2,);/m1 is equal to m2,else,System.out.println(m1 is not equal to m2);,请给据以下代码自行定义能满足需要的,MyDate,类,在,MyDate,类中覆盖,equals,方法,使其判断当两个,MyDate,类型对象的年月日都相同是,结果为,ture,,否则为,false,。,public boolean equals(Object o),45,2025/5/31 周六,toString,方法,toString(),方法在,Object,类中定义,其返回值是,String,类型,返回类名和它的引用地址。,在进行,String,与其它类型数据的连接操作时,自动调用,toString(),方法,Date now=new Date();,System.out.println(“now=”+now);,相当于,System.out.println(“now=”+now.toString();/now=Date122345,可以根据需要在用户自定义类型中重写,toString(),方法,如,String,类重写了,toString(),方法,返回字符串的值。,s1=“hello”;,System.out.println(s1);/,相当于,System.out.println(s1.toString();,在,ToString1.java,中的类,A,里覆盖,toString,方法,使其输出类,A,对象的,cint,属性值。,基本类型数据转换为,String,类型时,调用了对应封装类的,toString(),方法,int a=10;System.out.println(“a=”+a);,46,2025/5/31 周六,练习,9,定义两个类,父类,GeometricObject,代表几何形状,子类,Circle,代表圆形。,GeometricObject,protected String color,protected double weight,protected GeometricObject(),protected GeometricObject(String color,double weight),属性的,getter,和,setter,方法,Circle,初始化对象的,color,属性为“,white”,,,weight,属性为,1.0,47,2025/5/31 周六,练习,9,GeometricObject,protected String color,protected double weight,Circle,private double radius,public Circle(),public Circle(double radius),public Circle(double radius,String color,double weight),radius,属性的,setter,和,getter,方法,public double findArea(),:计算圆的面积,public boolean euqals(Object c),public String toString(),初始化对象的,color,属性为“,white”,,,weight,属性为,1.0,,,radius,属性为,1.0,。,初始化对象的,color,属性为“,white”,,,weight,属性为,1.0,,,radius,根据参数构造器确定。,重写,equals,方法,比较两个圆的半径是否相等,如相等,返回,true,。,重写,toString,方法,输出圆的半径。,写一个测试类,创建两个,Circle,对象,判断其颜色是否相等;利用,equals,方法判断其半径是否相等;利用,toString(),方法输出其半径。,48,2025/5/31 周六,包装类,针对八种基本定义相应的引用类型,封装类,基本数据类型,封装类,boolean,Boolean,byte,Byte,short,Short,int,Integer,long,Long,char,Character,float,Float,double,Double,49,2025/5/31 周六,50,2025/5/31 周六,
展开阅读全文