第4章 面向对象下教学设计.docx
《第4章 面向对象下教学设计.docx》由会员分享,可在线阅读,更多相关《第4章 面向对象下教学设计.docx(16页珍藏版)》请在冰豆网上搜索。
第4章面向对象下教学设计
传智播客
《Java基础入门》
教学设计
课程名称:
Java基础教程
授课年级:
2014年级
授课学期:
2014学年第一学期
教师姓名:
某某老师
2014年02月09日
课题名称
第4章面向对象下
计划学时
6课时
内容分析
Java是一种面向对象的语言,认识面向对象的编程思想对于Java学习至关重要。
在面向对象中,我们除了要掌握好类和对象的基本用法,还需要继续学习面向对象的一些高级特性。
本课程就将对继承和多态等知识进行详细讲解,并结合程序增强读者对这些知识的理解。
教学目标及基本要求
要求学生理解面向对象的继承和多态的概念,掌握类的继承、方法重写、super关键字、final关键字、抽象类和接口以及多态,了解什么是异常、异常的处理方式、自定义异常、包的使用以及如何为Java应用打包
重点及措施
教学重点:
类的继承、final关键字、多态、接口和抽象类、异常、包的定义和使用
难点及措施
教学难点:
类的继承、final关键字、多态和异常处理
教学方式
教学采用教师课堂讲授为主,使用教学PPT讲解
教
学
过
程
第一课时
(继承的概念、方法重写、super关键字、final关键字)
继承的概念
✧现实生活中的继承关系
在现实生活中,继承一般指的是子女继承父辈的财产。
在程序中,继承描述的是事物之间的所属关系,通过继承可以使多种事物之间形成一种关系体系。
例如猫和狗都属于动物,程序中便可以描述为猫和狗继承自动物,同理,波斯猫和巴厘猫继承自猫,而沙皮狗和斑点狗继承自狗。
这些动物之间会形成一个继承体系,如下图所示。
✧概念总结
在Java中,类的继承是指在一个现有类的基础上去构建一个新的类,构建出来的新类被称作子类,现有类被称作父类,子类会自动拥有父类所有可继承的属性和方法。
在程序中,如果想声明一个类继承另一个类,需要使用extends关键字,具体示例如下:
//定义Animal类
classAnimal{
Stringname;//定义name属性
//定义动物叫的方法
voidshout(){
System.out.println("动物发出叫声");
}
}
//定义Dog类继承Animal类
classDogextendsAnimal{
//定义一个打印name的方法
publicvoidprintName(){
System.out.println("name="+name);
}
}
上述示例代码中,Dog类通过extends关键字继承了Animal类,这样Dog类便是Animal类的子类。
✧需要注意的问题
在Java中,类的继承需要注意的问题,具体如下:
●类只支持单继承,不允许多重继承
●多个类可以继承一个父类
●多层继承是可以的,即一个类的父类可以再去继承另外的父类
●子类和父类是一种相对概念,也就是说一个类是某个类父类的同时,
也可以是另一个类的子类
方法重写
在继承关系中,子类会自动继承父类中定义的方法,但有时在子类中需要对继承的方法进行一些修改,即对父类的方法进行重写,具体示例如下:
//定义Animal类
classAnimal{
//定义动物叫的方法
voidshout(){
System.out.println("动物发出叫声");
}
}
//定义Dog类继承动物类
classDogextendsAnimal{
//定义狗叫的方法
voidshout(){
System.out.println("汪汪……");
}
}
以上示例代码中,定义了Dog类并且继承自Animal类,在子类Dog中定义了一个shout()方法对父类的方法进行重写。
super关键字
✧super关键字的概念
当子类重写父类的方法后,子类对象将无法访问父类被重写的方法,为了解决这个问题,在Java中专门提供了一个super关键字用于访问父类的成员。
✧super关键字的作用
●super关键字可以调用父类的成员变量和成员方法,格式如下:
super.成员变量
super.成员方法([参数1,参数2…])
●super关键字可以调用父类的构造方法,格式如下:
super([参数1,参数2…])
值得注意的是,在子类的构造方法中通过super指定调用父类的哪个构造方法,如果没有指定,在实例化子类对象时,会自动调用父类无参的构造方法。
final关键字
✧final关键字修饰类
Java中的类被final关键字修饰后,该类将不可以被继承,也就是不能够派生子类。
✧final关键字修饰方法
当一个类的方法被final关键字修饰后,这个类的子类将不能重写该方法。
✧final关键字修饰变量
Java中被final修饰的变量为常量,它只能被赋值一次,也就是说final修饰的变量一旦被赋值,其值不能改变。
第二课时
(抽象类、接口、多态、对象的类型转换)
抽象类
✧抽象类和抽象方法的概念
当定义一个类时,常常需要定义一些方法来描述该类的行为特征,但有时这些方法的实现方式是无法确定的。
这时,可以将该类定义为抽象类,即使用关键字abstract修饰的类。
例如:
abstractclassAnimal{
}
同理,使用关键字abstract修饰的方法称为抽象方法,抽象方法不包含方法体,例如:
abstractvoidshout();//定义抽象方法shout()
值得注意的是,包含抽象方法的类必须声明为抽象类,但抽象类可以不包含任何抽象方法,只需使用abstract关键字来修饰即可。
另外,抽象类是不可以被实例化的。
接口
✧接口的概念
如果一个抽象类中的所有方法都是抽象的,则可以将这个类用另外一种方式来定义,即接口。
在定义接口时,需要使用interface关键字来声明,具体示例如下:
interfaceAnimal{
intID=1;//定义全局常量
voidbreathe();//定义抽象方法
voidrun();
}
上面的代码中,Animal即为一个接口。
接口中定义的方法和变量都包含一些默认修饰符,方法默认使用“publicabstract”来修饰,即抽象方法。
变量默认使用“publicstaticfinal”来修饰,即全局常量。
✧接口的特点
为了加深对接口的认识,对接口的特点进行归纳,具体如下:
●接口中的方法都是抽象的,不能实例化对象。
●当一个类实现接口时,如果这个类是抽象类,则实现接口中的部分方
法即可,否则需要实现接口中的所有方法。
●一个类通过implements关键字实现接口时,可以实现多个接口,被实
现的多个接口之间要用逗号隔开。
●一个类在继承另一个类的同时还可以实现接口,此时,extends关键字
必须位于implements关键字之前。
●一个接口可以通过extends关键字继承多个接口,接口之间用逗号隔
开。
多态
在同一个方法中,这种由于参数类型不同而导致执行效果各异的现象就是多态。
在Java中为了实现多态,允许使用一个父类类型的变量来引用一个子类类型的对象,根据被引用子类对象特征的不同,得到不同的运行结果,接下来通过一个案例来演示,具体如下:
//定义接口Anmal
interfaceAnimal{
voidshout();//定义抽象shout()方法
}
//定义Cat类实现Animal接口
classCatimplementsAnimal{
//实现shout()方法
publicvoidshout(){
System.out.println("喵喵……");
}
}
//定义Dog类实现Animal接口
classDogimplementsAnimal{
//实现shout()方法
publicvoidshout(){
System.out.println("汪汪……");
}
}
//定义测试类
publicclassExample13{
publicstaticvoidmain(String[]args){
Animalan1=newCat();//创建Cat对象
Animalan2=newDog();//创建Dog对象
animalShout(an1);//将an1作为参数传入
animalShout(an2);//将an2作为参数传入
}
//定义静态的animalShout()方法,接收一个Animal类型的参数
publicstaticvoidanimalShout(Animalan){
an.shout();//调用实际参数的shout()方法
}
}
运行结果如下图所示。
从图中可以看到,将父类引用的两个不同子类对象分别传入,结果打印出了“喵喵”和“汪汪”。
由此可见,多态不仅解决了方法同名的问题,而且还使程序变的更加灵活,从而有效的提高程序的可扩展性和可维护性。
对象的类型转换
在多态的学习中,涉及到将子类对象当做父类类型使用的情况。
将子类对象当做父类使用时不需要任何显式地声明,在进行类型转换时可能出现错误。
这时,可以使用关键字instanceof,它可以判断一个对象是否为某个类(或接口)的实例或者子类实例,语法格式如下:
对象(或者对象引用变量)instanceof类(或接口)
第三课时
(Object类、匿名内部类、异常)
Object类
✧概述
在JDK中提供了一个Object类,它是所有类的父类,即每个类都直接或间接继承自该类。
✧toString()方法
Object类的toString()方法中的代码具体如下:
getClass().getName()+"@"+Integer.toHexString(hashCode());
✧重写toString()方法
在实际开发中,通常希望对象的toString()方法返回的不仅仅是基本信息,而是一些特有的信息,这时可以重写Object的toString()方法。
匿名内部类
匿名内部类可以实现接口,并进行实例化,语法格式如下:
new父类(参数列表)或父接口(){
//匿名内部类实现部分
}
异常
✧异常概述
在Java语言中,引入了异常,以异常类的形式对这些非正常情况进行封装,通过异常处理机制对程序运行时发生的各种问题进行处理。
✧异常继承体系
下图展示了Throwable类的继承体系:
从上图可以看出,Throwable有两个直接子类,具体如下:
●Error类:
称为错误类,它表示Java运行时产生的系统内部错误或资源耗尽的错误,是比较严重的,仅靠修改程序本身是不能恢复执行的。
●Exception类:
称为异常类,它表示程序本身可以处理的错误,在开发
Java程序中进行的异常处理,都是针对Excption类及其子类。
在Exception类的众多子类中有一个特殊的RuntimeException类,该类及其子类用于表示运行时异常,除了此类,Exception类下所有其它的子类都用于表示编译时异常。
✧try…catch和finally
由于发生了异常,程序立即终止,无法继续向下执行。
为了解决这样的问题,Java中提供了一种对异常进行处理的方式——异常捕获。
异常的捕获是通过try…catch语句完成,其语法格式如下所示:
try{
//程序代码块
}catch(ExceptionType(Exception类及其子类)e){
//对ExceptionType的处理
}
注意:
在try代码块中,发生异常语句后面的代码是不会被执行的。
✧finally
有时候我们希望有些语句无论程序是否发生异常都要执行,这时就可以在try…catch语句后,加一个finally代码块。
需要注意的是,finally中的代码块有一种情况下是不会执行的,那就是在try...catch中执行了System.exit(0)语句。
✧throws关键字
Java中允许在方法的后面使用throws关键字对外声明该方法有可能发生的异常,这样调用者在调用方法时,就明确地知道该方法有异常,并且必须在程序中对异常进行处理,throws关键字声明抛出异常的语法格式如下:
修饰符返回值类型方法名([参数1,参数2.....])throws
ExceptionType1[,ExceptionType2.....]{
}
注意:
如果不知道如何处理声明抛出的异常,也可以使用throws关键字继续将异常抛出。
✧编译时异常与运行时异常
●编译时异常
在Java中,Exception类中除了RuntimeException类及其的子类都是编译时异常。
编译时异常的特点是Java编译器会对其进行检查,如果出现异常就必须对异常进行处理,否则程序无法通过编译。
处理编译时期的异常有两种方式,具体如下:
(1)使用try…catch语句对异常进行捕获
(2)使用throws关键字声明抛出异常,调用者对其处理。
●运行时异常
RuntimeException类及其子类都是运行时异常。
运行时异常的特点是Java编译器不会对其进行检查,也就是说,当程序中出现这类异常时,即使没有使用try..catch语句捕获或使用throws关键字声明抛出,程序也能编译通过。
运行时异常一般是由于程序中的逻辑错误引起的,在程序运行时无法恢复。
✧自定义异常
JDK中定义了大量的异常类,虽然这些异常类可以描述编程时出现的大部分异常情况,但是在程序开发中有时可能需要描述程序中特有的异常情况。
为了解决这个问题,在Java中允许用户自定义异常,自定义的异常类必须继承自Exception或其子类。
自定义异常的使用需要用到throw关键字,throw关键字用于在方法中声明抛出异常的实例对象,其语法格式如下:
throwException异常对象
第四课时
(包的声明与使用、import语句、给Java应用打包、访问控制)
包的声明与使用
✧包的声明
在程序开发中,需要将编写的类分目录存放便于管理,为此,Java引入了包(package)机制,程序可以通过声明包的方式对Java类定义目录。
声明包的语法格式如下所示:
packagecn.itcast.chapter04;//使用package关键字声明包
publicclassExample01{…}
注意:
包的声明只能位于Java源文件的第一行。
✧包机制管理Java的类文件
当编译一个声明了包的Java源文件,需要使用命令生成与包名对应的目录,具体示例如下:
javac–d.Example01.java
其中,“-d”用来指定生成的类文件的位置,“.”表示在当前目录,整行命令表示生成带包目录的.class文件并存放在当前目录下,当然,生成的类文件还可以存放在其它目录下,这时只需要将“.”用其它路径替换即可。
具体示例如下:
javac–dD:
\cn\itcast\chapter04Example01.java
import语句
✧import语法
Java中提供了import关键字,使用import可以在程序中一次导入某个指定包下的类,具体格式如下所示:
import包名.类名;
注意:
import通常出现在package语句之后,类定义之前。
✧Java常用包
在JDK中,不同功能的类都放在不同的包中,其中Java的核心类主要放在java这个包以及其子包下,Java扩展的大部分类都放在javax包以及其子包下。
接下来简单介绍Java语言中的常用包,具体如下:
●java.util:
包含Java中大量工具类、集合类等
●:
包含Java网络编程相关的类和接口。
●java.io:
包含了Java输入、输出有关的类和接口。
●java.awt:
包含用于构建图形界面(GUI)的相关类和接口。
●java.lang:
包含Java语言的核心类,如String、Math、System和Thread
类等,使用这个包中的类无须使用import语句导入,系统会自动导入这个包下的所有类。
给Java应用打包
在JDK中提供了一个jar命令,使用这个命令能够将这些类打包成一个文件,这个文件的扩展名为.jar,被称为jar文件。
jar文件的全称是JavaArchiveFile,它是一种压缩文件,独立于任何操作系统平台,习惯上也将jar文件称为jar包。
将Java应用打包为Jar包,有很多好处,具体如下:
●安全:
可以对jar文件进行数字签名,让可识别数字签名的用户使用。
●可移植性:
只要有Java虚拟机,jar包就可以在任何平台上运行。
●节省空间:
当把.class文件打成jar压缩文件,会节省空间,如果将jar文件在网络上传输,也会加快传输速率。
访问控制
在Java中,针对类、成员方法和属性提供了四种访问级别,分别是private、default、protected和public。
接下来通过一个图将这四种控制级别由小到大依次列出,如下图所示。
图中展示的四种访问控制级别,具体介绍如下。
●private(类访问级别):
如果类的成员被private访问控制符来修饰,则这个成员只能被该类的其它成员访问,其它类无法直接访问。
类的良好封装就是通过private关键字来实现的。
●default(包访问级别):
如果一个类或者类的成员不使用任何访问控制符修饰,则称它为默认访问控制级别,这个类或者类的成员只能被本包中的其它类访问。
●protected(子类访问级别):
如果一个类的成员被protected访问控制符修饰,那么这个成员既能被同一包下的其它类访问,也能被不同包下该类的子类访问。
●public(公共访问级别):
这是一个最宽松的访问控制级别,如果一个
类或者类的成员被public访问控制符修饰,那么这个类或者类的成员能被所有的类访问,不管访问类与被访问类是否在同一个包中。
接下来通过一个表将这四种访问级别更加直观的表示出来,如下表所示。
访问范围
private
default
protected
public
同一类中
✓
✓
✓
✓
同一包中
✓
✓
✓
子类中
✓
✓
全局范围
✓
第五课时
上机练习(总结、测试题)
1、总结本章内容
2、通过题库发放相关测试题,检查学生掌握情况。
3、上机练习:
主要针对本章中需要重点掌握的知识点,以及在程序中容易出错的内容进行练习,通过上机练习可以考察同学对知识点的掌握情况,对代码的熟练程度。
上机一:
(考察知识点为类的继承)
请按照以下要求设计类。
要求如下:
1)设计Animal类。
类中定义一个成员变量animalName,表示动物的名称,变量animalName是String类型,默认初始值。
在该类中再定义一个成员方法shout(),表示动物发出叫声的行为,该方法能输出名称为name的动物发出叫声,例如输出“波斯猫发出叫声”。
2)设计Cat类。
使用关键字extends继承Animal类。
Cat类中定义一个public类型的构造方法,该构造方法拥有一个String类型的参数catName,通过该参数,为Cat类中继承自Animal类的animalName成员变量赋值
3)设计一个测试类。
类名为ExtendsTest,在main方法中定义一个String类型的name变量,并为它赋值为”波斯猫”,然后使用有参构造创建Cat类的对象,并使用对象的引用变量调用shout()方法
第六课时
上机练习(测试题)
上机一:
(考察知识点为接口的实现)
请按照以下要求设计类。
要求如下:
1)设计Inter接口,在接口中定义一初始值为20的num常量和method()抽象方法。
2)设计InterImpl类,使用关键字implements实现Inter接口,并在method()方法实现for循环,在循环体内输出num--的值,直到num=0。
3)设计一个测试类InterfaceTest,在main方法中创建InterImpl的实例对象,并调用method()方法。
思考题和习题
见教材第四章后的习题
教
学
后
记