Java《继承和多态》_第1页
Java《继承和多态》_第2页
Java《继承和多态》_第3页
Java《继承和多态》_第4页
Java《继承和多态》_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

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

文档简介

1、继承 u 开发教师类,其中教师分为软件专业教师以及呼叫专业教师,各自的要求如下: 软件专业教师 属性:姓名、所属单位属性:姓名、所属单位 方法:方法: 授课(使用电脑授课)授课(使用电脑授课) 自我介绍自我介绍 呼叫专业教师 属性:姓名、所属单位属性:姓名、所属单位 方法:方法: 授课(使用电话授课)授课(使用电话授课) 自我介绍自我介绍请问:以下这个解决方案中存在着什么问题?public class SoftwareTeacher private String name; /教师姓名教师姓名private String center; /所在单位所在单位public SoftwareTeac

2、her (String myName, String myCenter) name = myName; center = myCenter;public void ()System.out.println(使用电使用电脑授课脑授课);System.out.println(知识点知识点讲解讲解); public void () System.out.println(大家好!大家好!我是我是 + center + 的的 + name + .); public class CallTeacher private String name; / 教师姓名教师姓名 private String cente

3、r; / 所在单位所在单位 public CallTeacher (String myName, String myCenter) name = myName; center = myCenter; public void () System.out.println(“使用电话授课使用电话授课); System.out.println(知识点讲解知识点讲解); public void introduction() System.out.println(大家好!我是大家好!我是 + center + 的的 + name + .); 子类自动继承父类的属性和方法子类自动继承父类的属性和方法软件专业

4、教师是教师吗?呼叫专业教师是教师吗?public class Teacher private String name; /教师姓名教师姓名private String center; /所在单位所在单位public Teacher(String myName, String myCenter) name = myName; center = myCenter;public void giveLession()System.out.println(知识点讲解知识点讲解); public void introduction() System.out.println(大家好!我是大家好!我是 + c

5、enter + 的的 + name + .); 现在,所有子类中相同的代码都抽取到父类中了 属性行为姓名所在单位授课自我介绍教师软件专业教师呼叫专业教师extends关键字u 在Java语言中,用extends关键字来表示一个类继承了另一个类,例如:public class SoftwareTeacher Teacher/其余代码省略其余代码省略u 在父类中只定义一些通用的属性与方法,例如:public class Teacher private String name; / 教师姓名教师姓名private String center; / 所在单位所在单位public Teacher(Str

6、ing myName, String myCenter) /初始化属性值初始化属性值 public void giveLesson() /授课方法的具体实现授课方法的具体实现 public void introduction() /自我介绍方法的具体实现自我介绍方法的具体实现 单继承:Java中一个子类只有唯一一个父类新增教务类,考核教师新增加教务类,考核教师public class SchoolManagerPublic String manage(SoftwareTeacher st)/考核内容Public String manage(CallTeacher ct)/考核内容Public

7、static void main(String args)/SoftwareTeacher st=new SoftwareTeacher ();/CallTeacher ct=new CallTeacher();Teacher t=new Teacher ();SchoolManager sm=new SchoolManager();/Sm.manage(st);/Sm.manage(st);Sm.manage(ct);使用继承,有效实现代码复用使用继承,有效实现代码复用public class SoftwareTeacher extends Teacher public SoftwareTe

8、acher(String myName, String myCenter) super(myName, myCenter);public void giveLesson()System.out.println(使用电脑授课);super.giveLesson();public class CallTeacher extends Teacher public CallTeacher (String myName, String myCenter) super(myName, myCenter);public void giveLesson()System.out.println(使用电话授课);

9、super.giveLesson();子类自动继承父类的属性和方法,子类中不再存在重复代码继承与方法重写u 子类自动继承父类的属性和方法,子类中可以定义特定的属性和方法public class Teacher private String name; / 教师姓名教师姓名private String center;/ 所在单位所在单位public Teacher (String myName, String myCenter) /初始化属性值初始化属性值public void giveLesson() /授课方法的具体实现授课方法的具体实现 public void introduction()

10、 /自我介绍方法的具体实现自我介绍方法的具体实现 public class SoftwareTeacher extends Teacher public SoftwareTeacher(String myName, String myCenter) super(myName, myCenter);public void giveLesson() System.out.println(“使用电脑授课使用电脑授课); super.giveLesson();由于giveLesson()方法与父类的实现有所不同,因此重写了该方法 方法重写:子类和父类的方法方法重写:子类和父类的方法父类中的属性和方法可

11、以被子类继承super关键字调用父类的方法public class SoftwareTeacher extends Teacher public SoftwareTeacher (String myName, String myCenter) super(myName, myCenter);u 子类的构造方法中,通过super关键字调用u 方法重写后,通过super关键字调用public class SoftwareTeacher extends Teacher public void giveLesson()System.out.println(使用电脑授课使用电脑授课);super.giv

12、eLesson();通过调用父类的构造方法,完通过调用父类的构造方法,完成对属性值的初始化成对属性值的初始化通过调用父类的普通方法,完成部分功能通过调用父类的普通方法,完成部分功能重写与重载u方法的重载:定义有相同名字,但参数不同 的多个方法构成重载u方法的重写:方法的重写必须和被重写的方法具有相同的名字,参数,返回值类型。u构造方法也可以重载。u重载能在父子类之间发生吗?u构造方法能构成重写(覆写)吗?继承中的构造方法u 子类构造过程中可以用super(参数列表)调用父类的构造方法,用this(参数列表)调用自己的其它构造方法u如果调用super,必须写在子类构造方法的第一条u如果子类的构造

13、方法没有调用父类的构造方法,则系统默认调用父类中没有参数的那个构造方法; 如果子类的构造方法没有调用父类的构造方法,而父类中又没有不带参数的构造方法,则编译出错;u 通常先super调用父类的基本方法,再写自己的方法一切类的“祖先”Objectu 在Java 中,所有的Java类都直接或间接地继承了java.lang.Object类public class MyObject /public class MyObect extends Object /u学习java API文档了解下面内容:object类,它是所有类的,所有类从它继承。equals,两空值进行比较永远返回 false。Java中

14、对 String类 中的 equals方法进行了重写。方法名方法名说明说明备注备注Object clone()将当前对象克隆Boolen equals(Object obj)判断两个引用是否指向同一对象,其参数不能为普通数据类型被很多子类重载,用于用语判断对象的内容是否一致,如String, 包装类, URL, File, ,java.util包中的类或接口等void finalize()对象被释放时使用Class getClass()获得当前对象的类对象注意Class中的首字母大写int hashCode()得到代表对象的一个整数,这个整数在应用程序运行时保持不变这个整数的意义类似对象的身份

15、证号码,String, 包装类, URL, File, ,java.util包中的类或接口将本方法覆盖,当内容相同时得到的hashCode值相同String toString()得到代表这个对象的字符串String, 包装类, URL, File, java.util包中的类或接口将本方法覆盖, 得到的值将是其对象内容Void notify用于线程同步中唤醒等待的线程Void wait()应用于线程同步中的线程等待对象的转型u对象转型分为向上转型(upcasting) 向下转型(downcasting).举例:Father是父类,是父类,Son类继承自类继承自Father。Father f1

16、= new Son(); / 这就叫 upcasting (向上转型)/ 现在f1引用指向一个Son对象Son s1 = (Son)f1; / 这就叫 downcasting (向下转型)/ 现在f1还是指向Son对象Father f2 = new Father();Son s2 = (Son)f2; / 出错,子类引用不能指向父类对象出错,子类引用不能指向父类对象转型规则u 父类的引用变量可以指向一个子类的对象,但不可以访问子类中新增加的成员(方法和变量);u 父类对象不能操作子类声明定义的成员变量;也不能使用子类声明定义的方法。u 父类对象可以调用子类重写的实例方法。u 父类对象可以调用子

17、类继承的成员变量和隐藏的成员变量。u 可以将对象的父类对象再强制转换到一个子类对象,这时,该子类对象又具备了子类所有属性和功能u 如果子类重写了父类中的类方法,通过父类对象引用的是父类中的类方法instanceof判断对象类型判断对象类型u执行向下转型操作时,如果父类对象不是子类对象的实例,就会发生ClassCastException异常。uinstanceof操作符判断一个实例对象是否属于一个类。uinstanceof的语法格式如下: 返回值为布尔值(true、false)是java关键字下面程序的运行结果是什么class Apublic class B extends A public s

18、tatic void main(String args) A a=null; B b=null; if(a instanceof A) System.out.println(true 1); else System.out.println(false 1); if(b instanceof B) System.out.println(true 2); else System.out.println(false 2); a=new B(); if(a instanceof A) System.out.println(true 3); else System.out.println(false 3

19、); if(a instanceof B) System.out.println(true 4); else System.out.println(false 4); b=new B(); if(b instanceof A) System.out.println(true 5); else System.out.println(false 5); if(b instanceof B) System.out.println(true 6); else System.out.println(false 6); 为什么需要多态 public class Schoolmanager public v

20、oid manage(SoftwareTeacher st)roduction();st.giveLesson();public void manage (CallTeacher ct)roduction();ct.giveLesson();public static void main(String args) Schoolmanager cm = new Schoolmanager ();cm. manage(new SoftwareTeacher (“张三张三”,“软件专业软件专业“);cm. manage(new CallTeacher (“张明张明”,“呼叫专

21、业呼叫专业“);u 第一种解决方案大家好!我是软件专业的张三大家好!我是软件专业的张三使用电脑授课使用电脑授课知识点讲解知识点讲解大家好!我是呼叫专业的张明大家好!我是呼叫专业的张明使用电话授课使用电话授课知识点讲解知识点讲解u 在教师类的基础上,开发一个类代表教务,负责对各教师进行考核,考核内容包括: 1、教师的自我介绍 2、教师的授课代码的可扩展性、可维护性差代码的可扩展性、可维护性差u 按照第一种解决方案,我们需要如下两个步骤:,增加方法:judge(NetTeacher nt)u 如果增加一种新类型网络专业教师(NetTeacher),也接受教务考核,网络专业教师的相关信息如下: 属性

22、:姓名、所属单位 方法:授课(使用网络设备授课)、自我介绍public class Operation public void judge(SoftwareTeacher st)public void judge(CallTeacher ct)public void judge(NetTeacher nt)roduction(); nt.giveLesson();public static void main(String args) Operation op = new Operation ();op.judge(new NetTeacher (“王五王五”,“网络专业网络专业“

23、);每增加一种新的教师类型,每增加一种新的教师类型,都要修改教务类,增加相应都要修改教务类,增加相应的的judge(考核考核)方法方法多态增强可扩展性、可维护性u 第二种解决方案使用多态public class SchoolManager public void manage(Teacher t)roduction();t.giveLesson(); public static void main(String args) SchoolManager op = new SchoolManager ();op.manage(new SoftwareTeacher (“张三张三”,“软件

24、专业软件专业“);op.manage(new CallTeacher (“张明张明”,“呼叫专业呼叫专业“); op.manage(new NetTeacher(“王五王五”,“网络专业网络专业“); 可以接收子类类型根据实际创建的对象类型调用相应方法大家好!我是软件专业的张三使用电脑授课知识点讲解大家好!我是呼叫专业的张明使用电话授课知识点讲解大家好!我是呼叫专业的张明使用网络设备授课知识点讲解控制台输出使用多态之后,当需要增加新的子类类型时,无需更改总类什么是多态u 简单来说,实际new的哪个类,就调用哪个的方法彩色打印机彩色打印机 打印机打印机 黑白打印机黑白打印机打印效果:打印效果:黑

25、白黑白打印打印 打印打印 u 在执行期间(非编译期间)判断所引用类型的实际对象,根据实际对象调用其方法如何实现多态public class Teacher public void giveLesson() System.out.println(知识点讲解知识点讲解); public class Test public static void main(String args) SchoolManager sm = new SchoolManager(); sm. manage(new SoftwareTeacher(); 31、子类重写父类的方法2、编写方法时,使用父类定义的方法3、运行时,根

26、据实际创建的对象类型动态决定使用哪个方法public class SoftwareTeacher extends Teacher public void giveLesson() System.out.println(使用电脑授课使用电脑授课); super.giveLesson(); 1public class SchoolManager public void manage(Teacher t) t.giveLesson(); 2u 三个条件:1)要有方法的重写要有方法的重写2)要有继承要有继承3)父类引用指向子类对象父类引用指向子类对象给定如下Java代码,编译运行后,输出结果是什么cl

27、ass Base public String name;public Base()name = Base;public Base(String pName)name = pName;public void method()System.out.println(name);class Child extends Basepublic Child()super(Child1);name=Child2;public class Sample public static void main(String args) Child c = new Child(); c.method(); Child2 控制台输出控制台输出123 final关键字ufinal具有“不可改变的”的含义 用final修饰的类不能被继承,没有子类

温馨提示

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

评论

0/150

提交评论