Java面向对象程序设计案例教程(第二版) 课件 第5章 面向对象编程(下)_第1页
Java面向对象程序设计案例教程(第二版) 课件 第5章 面向对象编程(下)_第2页
Java面向对象程序设计案例教程(第二版) 课件 第5章 面向对象编程(下)_第3页
Java面向对象程序设计案例教程(第二版) 课件 第5章 面向对象编程(下)_第4页
Java面向对象程序设计案例教程(第二版) 课件 第5章 面向对象编程(下)_第5页
已阅读5页,还剩49页未读 继续免费阅读

下载本文档

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

文档简介

第5章面向对象(下)《Java面向对象程序设计案例教程(第2版)》目录/Contents5.15.25.3继

承final关键字抽象类和接口5.4

态5.55.7

Object类

内部类5.6

包5.8

访问权限思政要点/Point团队协作与分工每个成员都需要明确自己的职责范围,并与其他成员协调一致,确保整个系统能够高效运行。适应性与灵活性

理2.需要具备适应性和灵活性,能够根据不同情况采取最合适的策略。。继

承5.1

在现实生活中,某些对象具有一些共性,可以把共性的部分提取出来,形成一个更加泛化的概念。例如,小轿车、货车、客车都可统称为汽车,它们具备汽车的共性,但是它们还有自身的特点;汽车、飞机、火车都可统称为交通工具,它们具备交通工具的共性,但是它们也有自身的特点。可以绘制继承关系类图,如图5-1所示。

图5-1把小轿车、货车、客车作为子类,汽车作为父类(也称为超类或基类)。子类继承了父类的所有属性和方法,同时又有自身特有的属性和方法,子类同时可以修改父类的属性或改写父类的方法。5.1继承图5-1继承关系图图5-2继承关系5.1继承在Java中,通常使用extends关键字来指明子类与父类之间的关系,如:publicclassAnimal{//父类属性和方法}publicclassDogextendsAnimal{//子类的属性和方法}extends关键字5.1.1继承的优点1.子类拥有了父类的诸多属性与方法。2.子类可进而增加自身新的属性与方法。3.子类可以覆盖(重写)父类的某个同名功能(方法、函数)。继承情况下的访问规则与访问权限修饰符有关,规则如下。子类可以直接访问父类public、protected的属性与方法。子类可以在同包下访问父类default的属性与方法。子类无法访问父类private的属性与方法。子类无法继承父类的构造方法,即不能用形式“new子类名(父类构造方法的参数列表)”来实例化,只能在子类的构造方法中用super(...)去调用父类的构造方法。5.1.1继承的优点继承情况下的访问规则修饰类本类同包子类(不同包)全局private可见default可见可见(无论是否为子类)protected可见可见可见public可见可见可见可见5.1.3super关键字super与this关键字的区别区别thissuper属性访问访问本类中的属性,如果本类中没有该属性,则从父类中查找直接访问父类中的属性方法访问本类中的方法,如果本类中没有该方法,则从父类中继续查找直接访问父类中的方法调用构造方法调用本类构造方法,必须放在构造方法的首行调用父类构造方法,必须放在子类构造方法的首行5.1.2方法的重写方法重写的条件如下。1.子类的方法名与父类的方法名相同。2.方法必须具有相同的参数列表项。3.子类方法的返回值类型与父类相同。4.子类方法不能比父类方法有更严格的访问权限。5.子类方法不能抛出比父类方法更多的异常。定

义方法重写(Override)指的是子类拥有与父类同名的方法且功能相似。方法重写的目的是子类用某个新的功能去替代父类同名方法原来的功能。5.1.2方法的重写publicclassAnimal{publicvoidwork(){System.out.println("Animalwork()");}}publicclassDogextendsAnimal{//子类Dog的work方法重写了父类Animal的work方法publicvoidwork(){System.out.println("Dogwork()");}}publicclassExample01{publicstaticvoidmain(String[]args){newDog().work();}}示例代码5.1.3super关键字1.使用super访问父类的成员变量和成员方法2.使用super关键字访问父类中指定的构造方法使用super关键字访问父类中指定的构造方法具体格式如下:

super.成员变量super.成员方法(参数1,参数2...)具体格式如下:

super(参数1,参数2...)5.1.3super关键字super与this关键字的区别区别thissuper属性访问访问本类中的属性,如果本类中没有该属性,则从父类中查找直接访问父类中的属性方法访问本类中的方法,如果本类中没有该方法,则从父类中继续查找直接访问父类中的方法调用构造方法调用本类构造方法,必须放在构造方法的首行调用父类构造方法,必须放在子类构造方法的首行final关键字5.2final的英文意思是“最终”。在Java中,可以使用final关键字声明类、属性、方法。在声明时需要注意以下几点:1.使用final修饰的类不能有子类。2.使用final修饰的方法不能被子类重写。使用final修饰的变量(成员变量和局部变量)是常量,常量不可修改。5.2final关键字Java中的类被final关键字修饰后,该类将不可以被继承,即不能派生子类。下面通过一个案例进行验证,示例代码如下。5.2.1final关键字修饰类//使用final关键字修饰Animal类finalclassAnimal{}//Dog类继承Animal类classDogextendsAnimal{ //定义测试类publicclassExample04{ publicstaticvoidmain(String[]args){ Dogdog=newDog(); //创建Dog类的实例对象 } }5.2.2final关键字修饰方法//定义Animal类classAnimal{//使用final关键宇修饰shout()方法publicfinalvoidshout(){}}//定义Dog类继承Animal类classDogextendsAnimal{ //重写Animal类的shout()方法publicvoidshout(){ }}当一个类的方法被final关键字修饰后,这个类的子类将不能重写该方法。下面通过一个案例进行验证,示例代码如下。//定义测试类publicclassExample05{publicstaticvoidmain(String[]args){Dogdog=newDog();//创建Dog类的实例对象}}5.2.3final关键字修饰变量Java中被final修饰的变量为常量,常量只能在声明时被赋值一次,在后面的程序中,其值不能被改变,如果再次对该常量赋值,则程序会在编译时报错。publicclassExample06{publicstaticvoidmain(String[]args){finalintAGE=18;//第一次可以赋值AGE=20;//再次赋值会报错}}抽象类和接口5.35.3.1抽象类

当定义一个类时,常常需要定义一些成员方法描述类的行为特征,但有时这些方法的实现方式是无法确定的。例如,前面在定义Animal类时,shout()方法用于描述动物的叫声,但是不同动物的叫声是不同的,因此在shout()方法中无法准确地描述动物的叫声。

针对上面描述的情况,Java提供了抽象方法来满足这种需求。抽象方法是使用abstract关键字修饰的成员方法,抽象方法在定义时不需要实现方法体。抽象方法的定义格式如下:abstract返回值类型方法名(参数); abstractclass抽象类名称{属性;访问权限返回值类型方法名称(参){//普通方法return[返回值];}访问权限abstract返回值类型抽象方法名称(参数); //抽象方法,无方法体 }

抽象类的定义格式如下:5.3.1

抽象类(1)包含抽象方法的类必须是抽象类。(2)抽象类和抽象方法都要使用abstract关键字声明。(3)抽象方法只需声明而不需要实现。(4)如果一个非抽象类继承了抽象类,那么该子类必须实现抽象类中的全部抽象方法。抽象类的定义规则如下5.3.1

抽象类//定义抽象类AnimalabstractclassAnimal{//定义抽象方法shout()abstractvoidshout();}//定义Dog类继承抽象类AnimalclassDogextendsAnimal{//实现抽象方法shout()voidshout(){System.out.println("汪汪……");}}示例代码//定义测试类publicclassExample07{publicstaticvoidmain(String[]args){Dogdog=newDog();//创建Dog类的实例对象dog.shout();//调用dog对象的shout()方法}}5.3.2

接口

如果一个抽象类的所有方法都是抽象的,则可以将这个类定义接口。接口是Java中最重要的概念之一。在JDK8中,接口中除了可以包括抽象方法外,还可以包括默认方法和静态方法(也叫类方法),默认使用default修饰,静态方法使用static修饰,且这两种方法都允许有方法体。接口使用interface关键字声明,语法格式如下:publicinterface接口名extends接口1,接口2...{

publicstaticfinal数据类型常量名=常量值;

publicabstract返回值类型抽象方法名称(参表);}5.3.2

接口

在很多Java程序中,经常看到编写接口中的方法时省略了public,有很多读者认为它的访问权限是default.这实际上是错误的。不管写不写访问权限,接口中方法的访问权限永远是public。与此类似,在接口中定常量时,可以省略前面的“publicstaticfinal”,此时,接口会默认为常量添加“publicstaticfinal”。注

在很多Java程序中,经常看到编写接口中的方法时省略了public,有很多读者认为它的访问权限是default.这实际上是错误的。不管写不写访问权限,接口中方法的访问权限永远是public。与此类似,在接口中定常量时,可以省略前面的“publicstaticfinal”,此时,接口会默认为常量添加“publicstaticfinal”。5.3.2

接口修饰符class类名implements接口1,接口2,...{...}1.定义接口的实现类2.一个类既要实现接口,又要继承抽象类修饰符class类名extends父类名implements接口1,接口2,...{...}多态5.45.4.多态多态性是面向对象思想中的一个非常重要的概念,在Java中,多态是指不同对象在调用同一个方法时表现出的多种不同行为,即“一个接口,多种实现”。例如,要实现一个动物叫的方法,由于每种动物的叫声是不同的,因此可以在方法中接收一个动物类型的参数,当传入猫类对象时就发出猫类的叫声,传入犬类对象时就发出犬类的叫声。在同一个法中,这种由于参数类型不同而导致执行效果不同的现象就是多态。Java中多态主要有以下两种形式。

(1)方法的重载。(2)对象的多态性(方法重写)。5.4.1

方法重载

方法重载(Overload)指的是同一个类中方法名称相同但功能不同的一种用法,其意义在于可以根据传入的不同参数对代码采取不同的措施。

方法重载的条件如下:(1)重载的方法在同一个类中。(2)方法的名称相同。(3)参数的类型或个数不同。5.4.1

方法重载

publicclassExample11{voidprint(){System.out.println("noparams");}voidprint(inti){System.out.println("inti="+i);}voidprint(Strings){System.out.println("Strings="+s);}示例代码

publicstaticvoidmain(String[]args){Example11t=newExample11();//通过不同的参数来匹配不同的重载方法t.print();t.print();t.print("hello");}}5.4.2

对象类型转换1.向上转型

向上转型指的是子类对象转换成父类对象,可以自动进行转换。//Animal是Dog的父类Animalanimal=newDog("柯基","比熊",10);2.向下转型

向下转型指的是父类对象转换成子类对象(或两个看似不相关的类型之间的转换),书写时需用“强制”转型,如“Dogdog=(Dog)animal;”。在运行时,必须类型匹配,否则会报“ClassCastException”异常。所谓“类型匹配”是指实例本身就是目标类型,如这里的animal原本就是由一个Dog对象转换而来的。强制转换的书写格式如下:(目标类型)变量名。5.4.3instanceof关键字Java中可以使用instanceof关键子判断一个对象是否是某个类(或接口)的实例,语法格式如下:对象instanceof类(或接口)Object类5.55.5

Object类Java提供了一个Object类,它是所有类的父类,每个类都直接或间接继承Object类,因此Object类通常称为超类。当定义一个类时,如果没有使用extends关键字为这个类显式指定父类,那么该类会默认继承Object类。Object类中定义了一些方法,常用方法如表5-3所示。方法名称方法说明booleanequals()判断两个对象是否相等inthashCode()返回对象的散列码值StringtoString()返回对象的字符串表现形式5.5

Object类Java提供了一个Object类,它是所有类的父类,每个类都直接或间接继承Object类,因此Object类通常称为超类。当定义一个类时,如果没有使用extends关键字为这个类显式指定父类,那么该类会默认继承Object类。Object类中定义了一些方法,常用方法如表5-3所示。方法名称方法说明booleanequals()判断两个对象是否相等inthashCode()返回对象的散列码值StringtoString()返回对象的字符串表现形式5.5

Object类下面通过一个示例演示Object类中toString()方法的使用。//定义Animal类 classAnimal{//定义动物叫的方法 voidshout(){ System.out.println("动物叫!"); } }//定义测试类publicclassExample14{ publicstaticvoidmain(String[]args){ Animalanimal=newAnimal();//创建Animal类对象System.out.println(animal.toString());//调用toString()方法并打印}}内部类5.65.6

内部类

在Java中,允许在一个类的内部定义类,这样的类成为内部类,内部类所在的类成为外部类。在实际开发中,根据内部类的位置、修饰符和定义方式的不同,内部类可分为成员内部类、局部内部类、静态内部类和匿名内部类4种。下面将对这4种形式的内部类进行讲解。5.6.1

成员内部类

成员内部类是在另一个类的成员位置定义的类。它类似于类中的一个方法或变量,但它的作用域和生命周期与外部类是分开的。成员内部类可以访问外部类的所有成员(包括私有成员),并且可以在外部类的实例存在的情况下独立存在。

成员内部类通常用于表示与外部类紧密相关的概念或对象。例如,如果外部类表示一个设备,成员内部类可以表示该设备的各种配置选项。值得注意的是、在成员内部类中使用this关键字表示的是内部类的对象,如果要在成员内部类中用外部类的对象,则需要使用“外部类的类名.this”的格式5.6.1

成员内部类

publicclassOuter{privatestaticinti=0;privateStrings="hello";publicclassInner{publicvoidprint(){//可以调用任何外部类的内容System.out.println(i+s);System.out.println(this);//this表示内部类对象System.out.println(Outer.this);//this表示外部类对象}}示例代码

publicclassOuter{privatestaticinti=0;privateStrings="hello";publicclassInner{publicvoidprint(){//可以调用任何外部类的内容System.out.println(i+s);System.out.println(this);//this表示内部类对象System.out.println(Outer.this);//this表示外部类对象}}5.6.2

局部内部类

局部内部类通常定义在方法中,其作用域为方法体内部。局部内部类是使用得最少的一种内部类,与局部变量类似,局部内部类不能被权限修饰符以及static关键字修饰。局部内部类访问所在方法的局部变量时,要给外部方法的局部变量增加final关键字修饰。局部内部类可以通过方法的返回值而“突破”生命周期。5.6.2

局部内部类

publicclassOuter{publicvoidtestMethod(){finalStringtext="如果不加final,内部类将无法访问";classInner{publicvoidprint(){System.out.println(text);}}//只能在方法内部访问Innerinner=newInner();inner.print();}}示例代码5.6.3

静态内部类

静态内部类是最简单的一种内部类形式,需要使用static关键字修饰。与静态方法类似,静态内部类相当于外部类的一个静态部分,因此静态内部类只能访问外部类的静态成员与静态方法,包括私有的静态成员与静态方法。5.6.3

静态内部类

publicclassOuter{privatestaticinti=0;publicstaticclassInner{publicvoidprint(){//如果i不是静态变量,则这里将无法通过编译System.out.println(i);}}}}示例代码

classTest{publicstaticvoidmain(String[]args){//静态内部类的实例化Outer.Innerinner=newOuter.Inner();inner.print();}}5.6.4

匿名内部类

匿名内部类就是没有名称的局部内部类,不适用于关键字class、extends、implements等,是一种简洁到极致的内部类。匿名内部类隐式地继承了一个父类(或实现了一个接口)。匿名内部类对象通常作为方法的参数进行传递。在以下几种情况下,可以考虑使用匿名内部类。

①只用到类的一个实例。②类定义后马上用到。③类非常小。④给类命名不会使代码更容易被理解。这里补充匿名内部类在使用中的几个原则。①匿名内部类中不能有构造方法。②匿名内部类中不能定义任何静态代码、方法与类。③不能使用public、protected、private与static关键字修饰匿名内部类。④只能创建匿名内部类的一个实例。5.6.4

匿名内部类publicclassTest{publicstaticvoidmain(String[]args){//使用匿名内部类实例化对象//一个没有名称的类隐式地继承了Car类并实现了car类中的抽象方driveCarc=newCar(){@Overridevoiddrive(){System.out.println("汽车开走了");}}c.drive();}}abstractclassCar{abstractvoiddrive();}示例代码包5.75.7.1

包的概念

Java中的包package就是电脑中的文件夹。在平时的工作中,当电脑中的

温馨提示

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

评论

0/150

提交评论