收藏 分销(赏)

Java类设计.ppt

上传人:胜**** 文档编号:840795 上传时间:2024-03-28 格式:PPT 页数:50 大小:1,016KB
下载 相关 举报
Java类设计.ppt_第1页
第1页 / 共50页
Java类设计.ppt_第2页
第2页 / 共50页
Java类设计.ppt_第3页
第3页 / 共50页
Java类设计.ppt_第4页
第4页 / 共50页
Java类设计.ppt_第5页
第5页 / 共50页
点击查看更多>>
资源描述

1、Java Java 类设计类设计本章内容本章内容Java类的继承方法的重写、覆盖访问控制super 关键字多态性及其应用Object 类及其主要方法本章内容本章内容JavaJava类的继承类的继承方法的重写、覆盖多态性及其应用成员访问控制对象的创建和初始化细节几种常用的Java类类的继承类的继承 (1)(1)为描述和处理个人个人信息,定义类Person:public class Person public String name;public int age;public Date birthDate;public String getInfo().PersonPerson+name:Stri

2、ng+age:int+birthDate:Date+getInfo():String类的继承类的继承 (2)(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类的继承类的继承 (3)(3)通过继承继承,简化

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都可以利用。PersonPerson+name:String+age:int+birthDate:Date+getInfo():St

4、ringStudentStudent+school:String类的继承类的继承 (4)(4)类继承语法规则:class class extendsextends 类的继承类的继承 (5)(5)Java只支持单继承,不允许多重继承一个子类只能有一个直接父类一个父类可以派生出多个子类单继承举例单继承举例PersonPerson+name:String+age:int+birthDate:Date+getInfo():StringStudentStudent+school:StringSoldierSoldierOfficerOfficerGraduateGraduate+major:String

5、+register():void父类子类孙子类类的继承类的继承 (6)(6)子类继承了父类,就继承了父类的方法和属性。在子类中,可以使用父类中定义的方法和属性,也可以创建新的数据和方法。因而,子类通常比父类的功能更多子类通常比父类的功能更多。在Java 中,继承的关键字用的是“extends”,即子类不是父类的子集,而是对父类的“扩展”。关于继承的规则:子类不能继承父类中私有的子类不能继承父类中私有的(private)(private)的成员变量和方法的成员变量和方法。练习练习1 1 1.(1)1.(1)定义一个定义一个ManKindManKind类,包括类,包括 成员变量成员变量 int s

6、ex int sex 和和 int salaryint salary;方法方法 void manOrWorman()void manOrWorman():根据:根据sexsex的值显示的值显示“manman”(sex=1)(sex=1)或者或者“womenwomen”(sex=0)(sex=0);方法方法 void employeed()void employeed():根据:根据salarysalary的值显示的值显示“no jobno job”(salary=0)(salary=0)或者或者“jobjob”(salary!=0)(salary!=0)。(2)(2)定义类定义类Kids1Ki

7、ds1继承继承ManKindManKind,并包括,并包括 成员变量成员变量 int yearsOldint yearsOld;方法方法 printAge()printAge()打印打印 yearsOld yearsOld 的值。的值。(3)(3)在在Kids1Kids1类的类的mainmain方法中实例化方法中实例化Kids1Kids1的对象的对象 someKidsomeKid,用,用该对象访问其父类的成员变量及方法。该对象访问其父类的成员变量及方法。练习练习1 1 2.2.根据下图实现类。在根据下图实现类。在TestCylinderTestCylinder类中创建类中创建CylinderC

8、ylinder类的对类的对象,设置圆柱的底面半径和高,并输出圆柱的体积。象,设置圆柱的底面半径和高,并输出圆柱的体积。Circle (Circle (圆圆)-radius:double Circle():构造方法,将radius属性初始化为1+setRadius(double radius):void+getRadius():double+findArea():double 计算圆的面积Cylinder (Cylinder (圆柱圆柱)-length:doubleCylinder():构造方法,将length属性初始化为1+setLength(double length):void+getLe

9、ngth():double+findVolume():double 计算圆柱体积本章内容本章内容Java类的继承访问访问控制控制方法的重载、覆盖super 关键字多态性及其应用Object 类及其主要方法访问控制访问控制修饰符修饰符同一个类同一个类同一个包同一个包子类子类整体整体privateprivateYesdefaultdefaultYesYesprotectedprotectedYesYesYespublicpublicYesYesYesYes可以对Java类中定义的属属性性和方方法法进行访问控制-规定不同的保护等级:public、protected、default、private访问

10、控制举例访问控制举例(1)(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);访问控制举

11、例访问控制举例(2)(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.fm

12、4();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()访问控制分析访问控制分析f2_defaultc2_publicf3_protectedf4_publicc1_private子类对象可以访问的数据子类的对象可以调用的方法fm2()_defaultfm3()_ protectedfm4()_ publiccm2()_publiccm1()_private父类Parent和子类Child在同一包中定义时:本章内容本章内容Java类的继承访问控制方法

13、的重写、方法的重写、覆盖覆盖super 关键字多态性及其应用Object 类及其主要方法覆盖方法覆盖方法 在子类中可以根据需要对从父类中继承来的方法进行改造在子类中可以根据需要对从父类中继承来的方法进行改造覆盖方法覆盖方法覆盖方法覆盖方法(方法的方法的重置、重写重置、重写重置、重写重置、重写),在程序执行时,子类的方法,在程序执行时,子类的方法将覆盖父类的方法。将覆盖父类的方法。覆盖方法覆盖方法必须必须和被覆盖方法具有相同的和被覆盖方法具有相同的方法名称、参数列表方法名称、参数列表方法名称、参数列表方法名称、参数列表和返回值类型。和返回值类型。和返回值类型。和返回值类型。覆盖方法不能使用比被覆

14、盖方法更严格的访问权限。覆盖方法不能使用比被覆盖方法更严格的访问权限。覆盖方法不能使用比被覆盖方法更严格的访问权限。覆盖方法不能使用比被覆盖方法更严格的访问权限。覆盖方法举例覆盖方法举例(1)(1)public class Person public String name;public int age;public String getInfo()public String getInfo()return Name:+name+n+age:+age;public class Student extends Person public String school;public String g

15、etInfo()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类的getInf

16、o()方法Student s1=new Student();s1.getInfo();/调用Student类的getInfo()方法这是一种“多态性”:同名的方法,用不同的对象来区分调用的是哪一个方法。覆盖方法举例覆盖方法举例(2)(2)class Parent public public void method1()class Child extends Parent private private void method1()/非法,子类中的method1()的访问权限private比被覆盖方法的访问权限public弱public class UseBoth public void doO

17、therThing()Parent p1=new Parent();Child p2=new Child();Child p2=new Child();p1.method1();p2.method1();修改练习修改练习1 1中定义的类中定义的类Kids1Kids1,在,在Kids1Kids1中重新定义中重新定义employed()employed()方法,覆盖父类方法,覆盖父类ManKindManKind中定义的中定义的employed()employed()方法,输出方法,输出“Kids Kids should study and no job.should study and no jo

18、b.”练习练习2 2本章内容本章内容Java类的继承访问控制方法的重载、覆盖super super 关键字关键字super super 关键字关键字子类对象的实例化过程子类对象的实例化过程多态性及其应用Object 类及其主要方法关键字关键字supersuper 在在JavaJava类中使用类中使用supersuper来引用父类的成分来引用父类的成分 supersuper可用于访问父类中定义的属性可用于访问父类中定义的属性 如如果果使使用用supersuper关关键键字字引引用用父父类类属属性性或或者者方方法法必必须须在在方方法法块块的的第一行出现第一行出现 supersuper可用于调用父类

19、中定义的成员方法可用于调用父类中定义的成员方法 supersuper可用于在子类构造方法中调用父类的构造方法可用于在子类构造方法中调用父类的构造方法 supersuper的追溯不仅限于直接父类的追溯不仅限于直接父类关键字关键字 supersuper举例举例 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 Or

20、iental;public String getSchool()return school;public String getInfo()/调用父类的方法 return super.getInfosuper.getInfo()+nschool:+school;1.1.修改练习修改练习3 3中定义的类中定义的类Kids1Kids1中中employed()employed()方法,在该方法方法,在该方法中调用父类中调用父类ManKindManKind的的employed()employed()方法,然后再输出方法,然后再输出“but but Kids should study and no job

21、.Kids should study and no job.”2.2.修改练习修改练习1 1中定义的中定义的CylinderCylinder类,在类,在CylinderCylinder类中覆盖类中覆盖findAreafindArea()()方法,计算圆柱的表面积。考虑:方法,计算圆柱的表面积。考虑:findVolumefindVolume方法怎样做方法怎样做相应的修改?相应的修改?在在TestCylinderTestCylinder类中创建类中创建CylinderCylinder类的对象,设置圆柱的底类的对象,设置圆柱的底面半径和高,并输出圆柱的表面积和体积。面半径和高,并输出圆柱的表面积和体

22、积。附加题:在附加题:在TestCylinderTestCylinder类中创建一个类中创建一个CircleCircle类的对象,类的对象,设置圆的半径,计算输出圆的面积。体会父类和子类成员设置圆的半径,计算输出圆的面积。体会父类和子类成员的分别调用。的分别调用。练习练习4 4构造方法不能继承构造方法不能继承 子子类类继继承承父父类类所所有有的的成成员员变变量量和和成成员员方方法法,但但不不继继承承父父类类的构造方法的构造方法 在一个在一个JavaJava类中可以通过两种方式获得构造方法类中可以通过两种方式获得构造方法 使用系统默认的无参数构造方法使用系统默认的无参数构造方法 显式定义一个或多

23、个构造方法显式定义一个或多个构造方法 一旦显式定义了构造方法,则系统一旦显式定义了构造方法,则系统不再不再提供默认构造方法提供默认构造方法调用父类构造方法调用父类构造方法 在在在在子子子子类类类类的的的的构构构构造造造造方方方方法法法法中中中中可可使使用用super(super(参参数数列列表表)语语句句调调用用父父类的构造方法类的构造方法 如如果果子子类类的的构构造造方方法法中中没没有有显显示示地地调调用用父父类类构构造造方方法法,也也没没有有使使用用thisthis关关键键字字调调用用重重载载的的其其它它构构造造方方法法,则则系系统统默默认调用父类认调用父类无参数无参数的构造方法的构造方法

24、 如如果果子子类类构构造造方方法法中中既既未未显显式式调调用用父父类类构构造造方方法法,而而父父类类中又没有无参的构造方法,则编译出错中又没有无参的构造方法,则编译出错调用父类构造方法举例调用父类构造方法举例 (1)(1)1 public class Person 2 3 private String name;4 private int age;5private Date birthDate;67 public Person(String name,int age,Date d)8 this.name=name;9 this.age=age;10 this.birthDate=d;11 12

25、 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);2021/22 调用父类构造方法举例调用父类构造方法举例 (2)(2)1 public class Student extends Person 2 private String school;34 public Student(String name,int age,

26、String s)5 super(namesuper(name,age),age);6 school=s;7 8 public Student(String namename,String s)9 super(name)super(name);10 school=s;11 12 public Student(String s)1313 /编译出错编译出错:no super(),:no super(),系统将调用父类无参数的构造方法。系统将调用父类无参数的构造方法。13 school=s;14 15 思考 1).为什么super()和this()调用语句不能同时在一个构造函数中出现?2).为什么

27、super()或this()调用语句只能作为构造函数中的第一句出现?子类对象的实例化过程子类对象的实例化过程练习练习7 7 修改练习修改练习1 1中定义的中定义的CircleCircle类和类和CylinderCylinder类的构造方类的构造方法,利用构造方法参数为对象的所有属性赋初值。法,利用构造方法参数为对象的所有属性赋初值。本章内容本章内容Java类的继承方法的重载、覆盖访问控制super 关键字多态性及其多态性及其应用应用多态多态instanceof instanceof 运算符运算符类型转换异常类型转换异常Object 类及其主要方法多态性多态性(1)(1)多态多态在在JavaJa

28、va中,中,子类子类的对象可以替代的对象可以替代父类父类的对象使用的对象使用 一个变量只能有一种确定的数据类型一个变量只能有一种确定的数据类型 一个引用类型变量可能指向一个引用类型变量可能指向(引用引用)多种不同类型的对象多种不同类型的对象Person p=new Student();Person p=new Student();Object o=new PersonObject o=new Person();/Object();/Object();/Object();/Object类型的变量类型的变量类型的变量类型的变量o o o o,指向,指向,指向,指向PersonPersonPerso

29、nPerson类型的对象类型的对象类型的对象类型的对象o=new Student();o=new Student();/Object/Object/Object/Object类型的变量类型的变量类型的变量类型的变量o o o o,指向,指向,指向,指向StudentStudentStudentStudent类型的对象类型的对象类型的对象类型的对象父类类型的变量可以指向子类的对象父类类型的变量可以指向子类的对象多态性多态性(2)(2)一个引用类型变量如果声明为父类的类型,但实际引用的是子类对象,那么该变量就不能再访问子类中添加的属性和方法Student m=new Student();m.sch

30、ool=“pku”;/合法,Student类有school成员变量Person e=new Student();e.school=“pku”;/非法,Person类没有school成员变量 属性是在编译时确定的,编译时e为Person类型,没有school成员变量,因而编译错误。虚拟方法调用虚拟方法调用(Virtual Method Invocation)(Virtual Method Invocation)(Virtual Method Invocation)(Virtual Method Invocation)正常的方法调用正常的方法调用 Person e=new Person();e.g

31、etInfo();Student e=new Student();e.getInfo();虚拟方法调用虚拟方法调用(多态情况下多态情况下)Person e=new Student();e.getInfo();/调用Student类的getInfo()方法 编译时类型和运行时类型编译时类型和运行时类型编译时编译时e e为为PersonPerson类型,而方法的调用是在运行时确定的,类型,而方法的调用是在运行时确定的,所以调用的是所以调用的是StudentStudent类的类的getInfo()getInfo()方法。方法。动态动态绑定绑定多态性应用举例多态性应用举例方法声明的形参类型为方法声明的

32、形参类型为父类父类类型,可以使用类型,可以使用子类的对象子类的对象作为实参调用作为实参调用该方法该方法public class Test public class Test public void method(Person e)public void method(Person e)/e.getInfo();e.getInfo();public static void main(Stirng args)public static void main(Stirng args)Test t=new Test();Test t=new Test();Student m=new Student();

33、Student m=new Student();t.method(m);t.method(m);/子类的对象子类的对象mm传送给父类类型的参数传送给父类类型的参数e e instanceofinstanceof 操作符操作符x instanceof A:检验x是否为类A的对象,返回值为boolean型。要求x所属的类与类A必须是子类和父类的关系,否则编译错误。如果x属于类A的子类B,x instanceof A值也为true。public class Person extends Object public class Person extends Object public class St

34、udent extends Person public class Student extends Person public class Graduate extends Person public class Graduate extends Person -public void method1(Person e)public void method1(Person e)if(e instanceof Person)if(e instanceof Person)/处理处理PersonPerson类及其子类对象类及其子类对象if(e instanceof Student)if(e inst

35、anceof Student)/处理处理StudentStudent类及其子类对象类及其子类对象if(e instanceof Graduate)if(e instanceof Graduate)/处理处理GraduateGraduate类及其子类对象类及其子类对象 class Person class Person protected String name=person;protected String name=person;protected int age=50;protected int age=50;public String getInfo()public String get

36、Info()return Name:+name+n+age:+age;return Name:+name+n+age:+age;class Student extends Person class Student extends Person protected String school=pku;protected String school=pku;public String getInfo()public String getInfo()return Name:+name+nage:+age return Name:+name+nage:+age +nschool:+school;+ns

37、chool:+school;class Graduate extends Studentclass Graduate extends Student public String major=IT;public String major=IT;public String getInfo()public String getInfo()return Name:+name+nage:+age return Name:+name+nage:+age +nschool:+school+nmajor:+major;+nschool:+school+nmajor:+major;练习练习8 8建立建立Test

38、Instance TestInstance 类,在类中定类,在类中定义方法义方法method1(Person e);method1(Person e);在在method1method1中中:(1)(1)根据根据e e的类型调用相应类的的类型调用相应类的getInfogetInfo()()方法。方法。(2)(2)根据根据e e的类型执行:的类型执行:如果如果e e为为PersonPerson类的对象,输出:类的对象,输出:“a persona person”;如果如果e e为为StudentStudent类的对象,输出类的对象,输出“a studenta student”“a person a

39、person”如果如果e e为为GraduateGraduate类的对象,输出:类的对象,输出:“a graduated studenta graduated student”“a studenta student”“a persona person”(ex8)(ex8)对象类型转换对象类型转换 (Casting)(Casting)基本数据类型的基本数据类型的CastingCasting:小的数据类型可以自动转换成大的数据类型小的数据类型可以自动转换成大的数据类型如如long g=20;double d=12.0flong g=20;double d=12.0f可以把大的数据类型强制转换可以把

40、大的数据类型强制转换(casting)(casting)成小的数据类型成小的数据类型如如 floate f=(float)12.0 int a=(int)1200Lfloate f=(float)12.0 int a=(int)1200L 对对JavaJava对象的强制类型转换称为造型对象的强制类型转换称为造型 从子类到父类的类型转换可以自动进行从子类到父类的类型转换可以自动进行 从父类到子类的类型转换必须通过造型从父类到子类的类型转换必须通过造型(强制类型转换强制类型转换)实现实现 无继承关系的引用类型间的转换是非法的无继承关系的引用类型间的转换是非法的 在造型前可以使用在造型前可以使用in

41、stanceofinstanceof操作符测试一个对象的类型操作符测试一个对象的类型对象类型转换举例对象类型转换举例public class Test public class Test public void method(Person e)public void method(Person e)/设设PersonPerson类中没有类中没有getschoolgetschool()()方法方法 System.out.pritnln(e.getschool();System.out.pritnln(e.getschool();/非法非法,编译时错误编译时错误 if(e instanceof S

42、tudent)if(e instanceof Student)Student me=(Student)e;Student me=(Student)e;/将将e e强制转换为强制转换为StudentStudent类型类型 System.out.pritnln(me.getschool();System.out.pritnln(me.getschool();public static void main(Stirng args)public static void main(Stirng args)Test t=new Test();Test t=new Test();Student m=new

43、Student();Student m=new Student();t.method(m);t.method(m);本章内容本章内容Java类的继承方法的重载、覆盖访问控制super 关键字多态性及其应用Object Object 类及其主要方法类及其主要方法Object Object 类类equals()equals()方法方法toString()toString()方法方法封装类封装类ObjectObject 类(熟悉和掌握)类(熟悉和掌握)Object类是所有Java类的根父类如果在类的声明中未使用extends关键字指明其父类,则默认父类为Object类 public class Pe

44、rson.等价于:public class Person extends Object.例:method(Object obj)/可以接收任何类作为其参数Object o=new Person;method(o);=操作符与操作符与equalsequals方法方法(重点)重点)=操作符与操作符与操作符与操作符与equalsequalsequalsequals方法的区别:方法的区别:方法的区别:方法的区别:=:引用类型比较引用:引用类型比较引用:引用类型比较引用:引用类型比较引用(是否指向同一个对象是否指向同一个对象是否指向同一个对象是否指向同一个对象);Person p1=new Person

45、();Person p2=new Person();Person p1=new Person();Person p2=new Person();Person p1=new Person();Person p2=new Person();Person p1=new Person();Person p2=new Person();if(p1=p2)if(p1=p2)if(p1=p2)if(p1=p2)基本类型比较值;基本类型比较值;基本类型比较值;基本类型比较值;int a=5;if(a=6)int a=5;if(a=6)int a=5;if(a=6)int a=5;if(a=6)用用用用=进进进

46、进行行行行比比比比较较较较时时时时,符符符符号号号号两两两两边边边边的的的的数数数数据据据据类类类类型型型型必必必必须须须须一一一一致致致致(可可可可自自自自动动动动转转转转换换换换的的的的基基基基本本本本数数数数据据据据类类类类型除外型除外型除外型除外),否则编译出错;,否则编译出错;,否则编译出错;,否则编译出错;equals()equals()equals()equals()方方方方法法法法是是是是ObjectObjectObjectObject类类类类的的的的方方方方法法法法,由由由由于于于于所所所所有有有有类类类类都都都都继继继继承承承承ObjectObjectObjectObjec

47、t类类类类,也也也也就就就就继继继继承承承承了了了了equalsequalsequalsequals()()()()方方方方法法法法。只只只只能能能能比比比比较较较较引引引引用用用用类类类类型型型型,其其其其作作作作用用用用与与与与“=”相相相相同同同同,比比比比较较较较是是是是否否否否指指指指向向向向同同同同一一一一个个个个对对对对象象象象。格式格式格式格式:obj1.equals(obj2):obj1.equals(obj2):obj1.equals(obj2):obj1.equals(obj2)特特特特例例例例:当当当当用用用用equals()equals()equals()equals

48、()方方方方法法法法进进进进行行行行比比比比较较较较时时时时,对对对对类类类类FileFileFileFile、StringStringStringString、DateDateDateDate及及及及封封封封装装装装类类类类(Wrapper Wrapper Wrapper Wrapper ClassClassClassClass)来来来来说说说说,是是是是比比比比较较较较类类类类型型型型及及及及内内内内容容容容而而而而不不不不考考考考虑虑虑虑引引引引用用用用的的的的是是是是否否否否是是是是同同同同一一一一个个个个对象对象对象对象;原因:在这些类中覆盖了原因:在这些类中覆盖了原因:在这些类中覆

49、盖了原因:在这些类中覆盖了equals()equals()equals()equals()方法。方法。方法。方法。=操作符与操作符与equalsequals方法举例方法举例 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)Syste

50、m.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)toString toString 方法方法 toString()toString()方方法法在在ObjectObject类类中中定定义义,其其返返回回值值是是St

展开阅读全文
相似文档                                   自信AI助手自信AI助手
猜你喜欢                                   自信AI导航自信AI导航
搜索标签

当前位置:首页 > 通信科技 > 开发语言

移动网页_全站_页脚广告1

关于我们      联系我们       自信AI       AI导航        获赠5币

©2010-2024 宁波自信网络信息技术有限公司  版权所有

客服电话:4008-655-100  投诉/维权电话:4009-655-100

gongan.png浙公网安备33021202000488号  |  icp.png浙ICP备2021020529号-1 浙B2-2024(办理中)  

关注我们 :gzh.png    weibo.png    LOFTER.png 

客服