- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
在Eclipse中调用MyObject 对象的成员,会自动弹出继 承自Object的所有方法
从Object中获得的遗产
toString()
当对象要被打印在控制台上的自描述字符串 所有的对象都具有这个方法 方法从Object继承而来
equals方法 hashCຫໍສະໝຸດ Baidude方法
为什么需要包
生活案例
文档分门别类,易于查找
如何实现继承 4-3
继承表示子类是一种父类的关系 子类对象是对父类对象的发展, 创建子类对象要先创建父类对象 子类在构造时先执行父类的构造 方法(构造方法链)
人类
属性: 姓名 行为: 说话
学生类
学生类
人类
属性: 学号 行为: 学习
如何实现继承 4-4
子类的构造方法中,通过super关键字调用父类的 构造方法
方法重写后,通过super关键字调用父类的方 法 public class HandsOnJavaTeacher extends HandsOnTeacher {
public void lecture(){ System.out.println("启动 NetBeans"); super.giveLesson(); } }
生活中的继承 2-2
子类具有父类的一般特性(包括属性和行为), 以及自身特殊的特性
引擎数量
巴士是汽车吗? 卡车是汽车吗? 出租车是汽车吗?
汽车
外观颜色 刹车 加速
属性 行为
最大载客数量 报站
最大载重量 卸货
所属公司 最大载客数量 打发票
为什么需要继承 4-1 开发Employee教员类,其中教员分为Java教员 以及.NET教员,各自的要求如下:
为什么需要继承 4-3
如何改进?有没有可能建立继承关系,让子类自 动继承父类的属性和方法?
Java教员是教员吗? .NET教员是教员吗? 教员 姓名 所在中心 授课 自我介绍 属 性 行 为 public class HandsOnTeacher { private String name; // 教员姓名 private String school; // 所在中心 public HandsOnTeacher(String myName, String mySchool) { name = myName; school = mySchool; } public void lecture(){ System.out.println("知识点讲解"); System.out.println("总结提问"); } public void sayHello() { 现在,所有子类中相同的代 码都抽取到父类中了 大家好!我是 System.out.println("
继承的原则
继承层次不可过多 继承的上层为抽象层 继承的最大弱点:打破封装 精心设计用来继承的类
一切类的“祖先”——Object
在Java 中,所有的Java类都直接或间接地继承了 java.lang.Object类
public class MyObject { //… } public class MyObect extends //… } Object {
易于管理
不同内容的文档可以放在不同的 袋子中,拥有相同的名字,避免冲突
为什么需要包
树形文件系统
使用目录解决文件同名冲突问题
如何存放两个同名的类而不冲突?
插入排序 Sort.java 冒泡排序 Sort.java
包
包——解决类的同名问题
包 A.java
允许类组成较小的单元(类似 文件夹),易于找到和使用相 应的文件
继承举例
在程序中我们应该怎样使用继承? 使用继承有什么规律?
如何实现继承 4-1
在Java语言中,用extends关键字来表示一个类继 承了另一个类,例如:
public class HandsOnJavaTeacher //其余代码省略 } extends HandsOnTeacher {
在父类中只定义一些通用的属性与方法,例如:
如何实现继承 4-2
子类自动继承父类的属性和方法,子类中可以 定义特定的属性和方法
public class HandsOnTeacher { private String name; // 教员姓名 public class HandsOnJavaTeacher extends HandsOnTeacher { private String school;// 所在中心 public HandsOnJavaTeacher(String public HandsOnTeacher (String myName, String mySchool) { myName, String mySchool) { super(myName, mySchool); //初始化属性值 } } public void lecture(){ public void lecture() { System.out.println("启动 //授课方法的具体实现 Eclipse"); } super.lecture(); 由于lecture()方法与父类 public void sayHello() { } 的实现有所不同,因此重 父类中的属性和方法可 // 自我介绍方法的具体实现 写了该方法 } 以被子类继承 } } 方法重写:子类和父类的方法具有相同的名称、参数列表、返回类型
Java教员
属性:姓名、所属中心 方法:授课(步骤:打开Netbeans、实施理论课授课)、自 我介绍
.NET教员
属性:姓名、所属中心 方法:授课(步骤:打开Visual studio 2005、实施理论课 授课)、自我介绍
为什么需要继承 4-2
请问:以下这个解决方案中存在着什么问题?
public class HandsOnJavaTeacher { public class HandsOnDotNetTeacher { private String name; // 教员姓名 private String name; // 教员姓名 private String school; // 所在中心 private String school; // 所在中心 public HandsOnDotNetTeacher(String public HandsOnJavaTeacher(String myName, String mySchool) { myName, String mySchool) { name = myName; name = myName; school = mySchool; school = mySchool; } } public void giveLession(){ public void giveLession(){ System.out.println("启动 System.out.println("启动 Visual NetBeans"); Studio 2005"); System.out.println("知识点讲解"); System.out.println("知识点讲解"); System.out.println("总结提问"); System.out.println("总结提问"); } } public void introduction() { public void introduction() { 代码存在重复 System.out.println("大家好!我是 System.out.println("大家好!我是"
更好的保护类、数 据和方法
防止命名冲突
如何创建包
使用package声明包, 以分号结尾
如果有包的声明,一定 作为Java源代码的第一条 语句
package s1java.sg.chap7 ;
public class AccpSchool{ …… 包名 public String toString(){ …… } }
继承打破封装
子类可以改变父类
子类可以改变父类的方法 子类可以改变父类的封装的机制
怎样才能把类变的坚不可摧?
Final与finalize
final修饰类-不可被继承 final修饰方法-不可被重写 final修饰变量—简单类型变量 --引用类型的变量 finalize:可以告诉垃圾回收器应该执行的操作,该 方法从Object类继承而来。在从堆中永久删除对象之 前,垃圾回收器调用该对象的Finalize方法。
JAVA面向对象编程(二)
封装、继承与多态
本章目标
什么是继承?继承有什么好处? 举例说明在什么样的情况下,需要使用到继承? 在Java中,类之间的继承采用什么关键字?
生活中的继承 2-1
生活中,继承的例子随处可见
动物 谁是父类? 谁是子类? 能说出继承的特点吗?
食草动物
食肉动物
继承需要符合的关系:is-a,父类更通用、子类更具体
Java教员
.NET教员
为什么需要继承 4-4
public class HandsOnJavaTeacher extends HandsOnTeacher { public HandsOnJavaTeacher(String myName, String mySchool) { super(myName, mySchool); 子类自动继承父类的属 } 性和方法,子类中不再 public void lecture(){ 存在重复代码 System.out.println("启动 NetBeans"); super.lecture(); } }ublic class HandsOnDotNetTeacher extends HandsOnTeacher { p public HandsOnDotNetTeacher(String myName, String mySchool) { super(myName, mySchool); } public void lecture(){ System.out.println("启动 Visual Studio .NET"); super.lecture(); } 使用继承,可以有效实现代码复用 }
多态
1、子类重写父类的方法
2、编写方法时,使用父类定义的方法 3、运行时,根据实际创建的对象类型动态决定使用哪个方法
public class HandsOnTeacher { …… …… public void lecture() { //授课方法的具体实现 } }
public class HandsOnJavaTeacher extends HandsOnTeacher { …… public void lecture(){ System.out.println("启动 Eclipse"); super.lecture(); } }
public class HandsOnJavaTeacher extends HandsOnTeacher { public HandsOnJavaTeacher(String myName, String mySchool) { super(myName, mySchool); 通过调用父类的构造方法, 完成对属性值的初始化 } }
package net.javagroup.research.powerproject; 部门名 项目名
public class HandsOnTeacher { private String name; // 教员姓名 private String school; // 所在中心 public HandsOnTeacher(String myName, String mySchool) { //初始化属性值 } public void lecture() { //授课方法的具体实现 } public void sayHello() { //自我介绍方法的具体实现 } }
包命名规范
包名由小写字母组成,不能以圆点开头或结尾
package mypackage; package .mypackage;
×
自己设定的包名之前最好加上唯一的前缀,通常使 用组织倒置的网络域名。如:域名javagroup.net
package net.javagroup.mypackage;
自己设定的包名部分依不同机构各自内部的规范不 同而不同