JAVA程序设计:第6章 Java类设计_第1页
JAVA程序设计:第6章 Java类设计_第2页
JAVA程序设计:第6章 Java类设计_第3页
JAVA程序设计:第6章 Java类设计_第4页
JAVA程序设计:第6章 Java类设计_第5页
已阅读5页,还剩47页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第六章Java类设计本章内容Java类的继承方法的重载、重写多态性及其应用成员访问控制对象的创建和初始化细节几种常用的Java类类的继承 (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类的继承 (2) 为描述和处理学生信息,定义类Student:publ

2、ic 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) 通过继承,简化Student类的定义:public class Person public String name; public int age; public Da

3、te birthDate; public String getInfo() .public class Student extends Person public String school; public String getInfor public void show() public void show(int t)Person+name : String +age : int+birthDate : Date+getInfo() : StringStudent+school : String继承对象的生成Student st=new Student();0600ststptrPubli

4、c String getInfor()nameageBirthDatestptrPublic String getInfor()nameageBirthDateSchoolstptrPublic String getInfor()nameageBirthDatePublic String getInfor()SchoolstptrPublic String getInfor()nameageBirthDatePublic String getInfor()Public void show()Public void show(int a)SchoolstptrPublic String getI

5、nfor()nameageBirthDatePublic String getInfor()Public void show()Public void show(int a)School类的继承 (4)类继承语法规则: class extends * Object类是所有Java类的最高层父类Java只支持单继承,不允许多重继承一个子类只能有一个父类一个父类可以继承出多个子类单继承举例Person+name : String +age : int+birthDate : Date+getInfo() : StringStudent+school : StringSoldierOfficerGr

6、aduate+major : history+register() : voidJava 类的访问权限访问控制修饰符同一个类同一个包派生类外部privateYesdefaultYesYesprotectedYesYesYespublicYesYesYesYes可以对Java类中定义的属性和方法进行访问控制-规定不同的保护等级:Public classdefault classpublicclassclasspublic classdefault classpublicclassdefault classpublic classpublicdefaultclassPublic classpubl

7、ic访问控制举例(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.printl

8、n(in fm4() f4= + f4);访问控制举例(2)(0601)class Child extends Parentprivate 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;

9、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();访问控制分析f1_privatef2_defaultc2_publicf3_protectedf4_publicc1_private内存空间中子类对象携带的数据子类的对象可以调用的方法fm2()_defaultfm3()_ protectedfm4()_ publiccm2()_publiccm1()_private父类Parent和子类Child在同一

10、包中定义时:方法的重写(0603)在子类中可以根据需要对从父类中继承来的方法进行改造-方法的重写重写方法必须和被重写方法具有相同的方法名称、参数列表和返回值类型重写方法不能使用比被重写方法更严格的访问权限(0603)方法重写举例(1) public class Person protected String name;protected int age;protected Date birthDate; /java.util包中定义过类Datepublic String getInfo() return Name: + name + n +age: + age; public class St

11、udent extends Person protected String school;public String getInfo() return Name: + name + nage: + age + nschool: + school; 方法重写举例(2)public class Parent public void method1() public class Child extends Parent private void method1() /illegalpublic class UseBoth public void doOtherThing() Parent p1 =

12、new Parent();Child p2 = new Child();p1.method1();p2.method1();关键字super在Java类中使用super来引用父类的成分super可用于访问父类中定义的属性super可用于调用父类中定义的成员方法super可用于在子类构造方法中调用父类的构造方法super的追溯不仅于直接父类关键字super举例 public class Person private String name; private int age; private Date birthDate; public String getInfo() return Name:

13、+ 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; stptrPublic String getInfor()nameageBirthDatePublic String getInfor()Public void show()P

14、ublic void show(int a)Schoolps多态性(1)多态-在Java中,父类对象的指针可以指向它的所有继承类。一个对象只能有一种确定的数据类型一个引用类型变量可能指向(引用)多种不同类型的对象Person p = new Student();Object o = new Person();o = new Student(); 多态性(2)一个引用类型变量如果声明为父类的类型,但实际引用的是子类对象,那么该变量就不能再访问子类中添加的属性和方法Student m = new Student();m.school = pku; /合法Person e = new Student

15、(); 虚方法调用 (Virtual Method Invocation) 正常的方法调用 Person e = new Person(); e.getInfo(); Student e = new Student(); e.getInfo(); 虚拟方法调用(多态情况下) Person e = new Student(); e.getInfo(); 编译时类型和运行时类型编译时多态重载来实现运行时多态虚方法来调用Dt.javainstanceof 操作符(0607)public class Person extends Object public class Student extends

16、Person public class Graduate extends Person -public void method1(Person e) if (e instanceof Student) / 处理Student类型及其子类类型对象 else if (e instanceof Graduate) /处理Graduate类型及其子类类型对象 else /处理Person类型对象对象造型 (Casting )对Java对象的强制类型转换称为造型在造型前可以使用instanceof操作符测试一个对象的类型从子类到父类的类型转换可以自动进行从父类到子类的类型转换必须通过造型(强制类型转换)

17、实现无继承关系的引用类型间的转换是非法的对象造型举例public class Test /Person及Student类的定义见第17页 public void method(Person e) System.out.pritnln(e.getschool(); /非法 if(e intstanceof Student) Student me = (Student)e; System.out.pritnln(me.getschool(); public static void main(Stirng args) Test t = new Test(); Student m = new Stud

18、ent(); t.method(m); 方法名重载 在同一个类中可以定义多个同名方法-方法名重载public class PrintStreampublic void println(int i) public void println(float f) public void println(String s) 重载方法的参数列表必须不同 重载方法的返回值类型可以相同,也可以不同构造方法重载(0608)构造方法重载举例: public class Personpublic Person(String name, int age, Date d) public Person(String na

19、me, int age) public Person(String name, Date d) 构造方法重载,参数列表必须不同可以在构造方法的第一行使用this关键字调用其它(重载的)构造方法构造方法重载举例public class Person private String name; private int age; private Date birthDate; public Person(String name, int age, Date d) = name; this.age = age; this.birthDate = d; public Person(St

20、ring name, int age) this(name, age, null); public Person(String name, Date d) this(name, 30, d); public Person(String name) this(name, 30); 构造方法不能继承子类继承父类所有的成员变量和成员方法,但不继承父类的构造方法一旦显式定义了构造方法,则系统不再提供默认构造方法调用父类构造方法(0609)在子类的构造方法中可使用super(argument_list)语句调用父类的构造方法如果子类的构造方法中没有显示地调用父类构造方法,也没有使用this关键字调用重载

21、的其它构造方法,则系统默认调用父类无参数的构造方法如果子类构造方法中既未显式调用父类构造方法,而父类中又没有无参的构造方法,则编译出错调用父类构造方法举例 (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 = name;9 this.age = age;10 this.birthDate = d;11 12 public Person(String

22、 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)1 public class Student extends Person 2 private String school;34 public Student(String name, int age, String s) 5 super(na

23、me, age);6 school = s;7 8 public Student(String name, String s) 9 super(name);10 school = s;11 12 public Student(String s) / 编译出错: no super()13 school = s;14 15 对象构造和初始化细节分配存储空间并进行默认的初始化按下述步骤初始化实例变量绑定构造方法参数如有this()调用,则调用相应的重载构造方法,然后跳转到步骤5显式或隐式追溯调用父类的构造方法(Object类除外)进行实例变量的显式初始化操作执行当前构造方法的方法体构造和初始化对象举

24、例public class Object public Object() .public class Person extends Object private String name; private int age = 0; private Date birthDate; public Person(String n, Date d) / implicit super();name = n;birthDate = d; public Person(String n) this(n, null); public class Student extends Person private Str

25、ing school; public Student(String n, String d) super(n); school = d; Ex2 初始化过程引申 public class Person private String name; private int age = 0; private Date birthDate; private String info; public Person(String n, Date d) /step 3 name = n; birthDate = d; info = getInfo(); public Person(String n) this(

26、n, null); /step 2 public String getInfo() return Name: + name + nage: + age + nBirth Date: + birthDate; public class Student extends Person private String school; public Student(String n, String d) /step 0 super(n); /step 1 school = d; public String getInfo() /step 4 return super.getInfo() + nSchool

27、: + school; Object 类Object类是所有Java类的根父类如果在类的声明中未使用extends关键字指明其父类,则默认父类为Object类 public class Person .等价于:public class Person extends Object .=操作符与equals方法=操作符与equals方法的区别:引用类型比较引用;基本类型比较值;equals()方法只能比较引用类型,=可以比较引用类型及基本类型;特例:当用equals()方法进行比较时,对类File、String、Date及封装类(Wrapper Class)来说,是比较类型及内容而不考虑引用的是否是同一个实例;用=进行比较时,符号两边的数据类型必须一致(可自动转换的基本数据类型除外),否则编译出错;=操作符与equals方法举例class TestEqual

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论