《面向对象基础》PPT课件.ppt_第1页
《面向对象基础》PPT课件.ppt_第2页
《面向对象基础》PPT课件.ppt_第3页
《面向对象基础》PPT课件.ppt_第4页
《面向对象基础》PPT课件.ppt_第5页
已阅读5页,还剩91页未读 继续免费阅读

下载本文档

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

文档简介

Java实用教程,第4章 面向对象基础,第 4 章 面向对象基础,4.1 面向对象程序设计 4.2 类 和 对 象 4.3 包 4.4 继 承 4.5 多 态 4.6 特 殊 类 4.7 接 口,面向过程 在一个结构体中定义窗口的大小,位置,颜色,背景等属性,对窗口操作的函数与窗口本身的定义没有任何关系,如HideWindow,MoveWindow,MinimizeWindow,这些函数都需要接受一个代表要被操作的窗口参数 ,是一种谓语与宾语的关系 。 面向对象 定义窗口时,除了要指定在面向过程中规定的那些属性,如大小,位置,颜色,背景等外,还要指定该窗口可能具有的动作 ,如隐藏,移动,最小化等。这些函数被调用时,都是以某个窗口要隐藏,某个窗口要移动的语法格式来使用的 ,这是一种主语与谓语的关系。 面向对象的三大特征 封装 (Encapsulation) 继承 (Inheritance) 多态 (Polymorphism),程序设计所面对的问题域客观世界,是由许多事物构成的,这些事物既可以是有形的(比如一辆汽车),也可以是无形的(比如一次会议)。 把客观世界中的事物映射到面向对象的程序设计中就是对象。对象是面向对象程序设计中用来描述客观事物的程序单位。客观世界中的许多对象,无论其属性还是其行为常常有许多共同性,抽象出这些对象的共同性便可以构成类。所以,类是对象的抽象和归纳,对象是类的实例。,4.1.1. 面向对象的基本概念,只要仔细研究程序设计所面对的问题域客观世界,我们就可以看到:客观世界是由一些具体的事物构成的,每个事物都具有自己的一组静态特征(属性)和一组动态特征(行为)。 例如,一辆汽车有颜色、型号、马力、生产厂家等静态特征,又具有行驶、转弯、停车等动态特征。把客观世界的这一事实映射到面向对象的程序设计中,则把问题域中的事物抽象成了对象(Object),事物的静态特征(属性)用一组数据来描述,事物的动态特征(行为)则用一组方法来刻画。,4.1.2 对象,(1) 对象标识:即对象的名字,是用户和系统识别它的唯一标志。例如,汽车的牌照可作为每一辆汽车对象的标识。对象标识有“外部标识”和“内部标识”之分。外部标识供对象的定义者或使用者用,内部标识供系统内部唯一地识别每一个对象。在计算机世界中,我们可以把对象看成计算机存储器中一块可标识的区域,它能保存固定或可变数目的数据(或数据的集合)。,4.1.2 对象特征,(2) 属性:即一组数据,用来描述对象的静态特征。例如,汽车的颜色、型号、马力、生产厂家等。在Java程序中,把这一组数据称为数据成员。 (3) 方法:也称为服务或操作,它是对象动态特征(行为)的描述。每一个方法确定对象的一种行为或功能。例如,汽车的行驶、转弯、停车等动作可分别用move( )、rotate( )、stop( )等方法来描述。为避免混淆,本书中把方法称为成员方法。,4.1.2 对象特征,在Java程序中,类是创建对象的模板,对象是类的实例,任何一个对象都是隶属于某个类的。Java程序设计是从类的设计开始的,所以,在进一步讲述对象的知识之前,必须先掌握类的概念。,4.1.2 对象特征,对象是对事物的抽象,而类是对对象的抽象和归纳。找出事物的共性,把具有共同性质的事物归结为一类,得出一个抽象的概念类。 在面向对象的编程语言中,类是一个独立的程序单位,是具有相同属性和方法的一组对象的集合。类的概念使我们能对属于该类的全部对象进行统一的描述。例如,“树具有树根、树干、树枝和树叶,它能进行光合作用”。,4.1.3 类,描述一个类需要指明下述三个方面内容: (1) 类标识:类的一个有别于其他类的名字。这是必不可少的。 (2) 属性说明:用来描述相同对象的静态特征。 (3) 方法说明:用来描述相同对象的动态特征。,4.1.3 类,例如,下面是对dog类进行的描述: class dog / class指出这是一个类,dog是类标识 String name; int AverageWeight; 类的属性(静态特征) int AverageHeight; public void move( ) 类的方法(动态特征) public void ShowDog( ) ,dog类,4.2 类 和 对 象,Java语言与其他面向对象语言一样,引入了类和对象的概念,类是用来创建对象的模板,它包含被创建对象的属性和方法的定义。因此,要学习Java编程就必须学会怎样去编写类,即怎样用Java的语法去描述一类事物共有的属性和行为。 对象的属性通过变量来刻画,而对象的行为通过方法来体现。方法可以操作属性形成一定的算法来实现一个具体的功能。类把属性和方法封装成一个整体。,类是对某一类事物的描述,是抽象的、概念上的定义;对象是实际存在的该类事物的每个个体,因而也称实例(instance)。,如果将对象比作汽车,那么类就是汽车的设计图纸。所以面向对象程序设计的重点是类的设计,而不是对象的设计。,4.2 类 和 对 象,4.2.1 定义类,在Java语言中,类是基本的构成要素,是对象的模板,Java程序中所有的对象都是由类创建的。一个Java类主要包括以下两部分: 类的声明 类的主体,类的声明,在类声明中,需要定义类的名称、对该类的访问权限、该类与其他类的关系等。类声明的格式如下: 修饰符用于指定类的访问权限,可选值为public、abstract和final。,修饰符 class extends 父类名 implements 接口列表 ,类的声明,类名用于指定类的名称,类名必须是合法的Java标识符。一般情况下,要求首字母大写。 extends 父类名用于指定要继承参数。 implements 接口列表用于指定该类实现的所有接口。,类 体,类声明部分大括号中的内容为类体。类体主要由以下两部分构成: (1)成员变量的定义; (2)成员方法的定义。 在程序设计过程中,编写一个能完全描述客观事物的类是不现实的。 比如,构建一个Apple类,该类可以拥有很多很多的属性(即成员变量),在定义该类时,选取程序需要的必要属性和行为就可以了。,类的定义,class Person int age; void shout() System.out.println(“my age is “ + age); age是类的属性 ,也叫类成员变量 。 shout是方法也叫类的成员函数。 shout方法可以直接访问同一个类中的age变量 ,如果一个方法中有与成员变量同名的局部变量,该方法中对这个变量名的访问是局部变量,而不再是成员变量。,4.2.2 了解成员方法,Java中类的行为由类的成员方法来实现。类的成员方法由方法声明和方法体两部分组成。其一般格式如下:,修饰符 ( 参数列表) 方法体 ,4.2.2 了解成员方法,修饰符用于指定方法的访问权限,可选值为public、protected和private。 方法返回值的类型用于指定该方法的返回值的类型,如果该方法没有返回值,必须使用关键字void进行标识。方法返回值的类型可以是任何Java数据类型。,了解成员方法,方法名用于指定成员方法的名称,方法名必须是合法的Java标识符。 参数列表用于指定方法中所需的参数。当存在多个参数时,各参数之间应使用逗号分隔。方法的参数可以是任何Java数据类型。,了解成员方法,方法体是方法的实现部分,在方法体中可以完成指定的工作,可以只打印一句话,也可以省略方法体,使方法什么都不做。需要注意的是:当省略方法体时,其外面的大括号一定不能省略。,4.2.3 成员变量和局部变量,在类体中所声明的变量称为类的成员变量,而在方法体中声明的变量和方法的参数则称为局部变量。 现在我们来看一下,如何声明成员变量和局部变量,以及变量的有效范围。,声明成员变量,Java用成员变量来表示类的状态和属性,声明成员变量的基本语法格式如下: 修饰符:可选参数,用于指定变量的被访问权限,可选值为public、protected和private。 static:可选,用于指定该成员变量为静态变量,可以直接通过类名访问。如果省略该关键字,则表示该成员变量为实例变量。,修饰符 static final ;,声明成员变量,final:可选,用于指定该成员变量为取值不会改变的常量。 变量类型:必选:用于指定变量的数据类型,其值可以为Java中的任何一种数据类型。 变量名:必选,用于指定成员变量的名称,变量名必须是合法的Java标识符。,1访问控制权限,(1)public 公共变量 由public修饰的变量称为公共变量,可被任何包中的任何类访问,只有在确认任何外部访问都不会带来不良后果的情况下才将成员声明为公共的。公共变量对任何类都是可见的,因此它没有秘密可言,不具有数据保护功能。 (2)private私有变量 由private修饰的变量称为私有变量,只能被声明它的类所使用,拒绝任何外部类的访问。私有变量是不公开的,它们得到了最好的保护,这是对类进行封装时使用的主要方法。,(3)protected 受保护变量 由protected修饰的变量称为受保护变量,可被声明它的类和派生的子类以及同一个包中的类访问。 (4)package包变量 由package修饰的变量称为包变量,在声明时常常省略package关键字,即没有修饰符的成员被视为包成员。包成员可被声明它的类和同一个包中的其它类(包括派生子类)所访问,在其它包中的子类则不能访问父类的包成员。,2static 静态变量,static声明的成员变量被视为类的成员变量,而不把它当作实例对象的成员变量。换句话说,静态变量是类固有的,可以直接引用,其它成员变量仅仅被声明,生成实例对象后才存在,才可以被引用。基于这样的事实,也把静态变量称为类变量,非静态变量称为实例变量。相应地,静态方法称为类方法,非静态方法称为实例方法。,从输出结果中可以得出以下几点结论 :,类的静态变量可以直接引用,例如在程序中直接使用了StaticDemo.getX(),而非静态变量则不行。类的静态变量相当于某些程序语言的全局变量。 静态方法只能使用静态变量,不能使用实例变量。 类的静态变量只有一个版本,所有实例对象引用的都是同一个版本。 对象实例化后,每个实例变量都被制作了一个副本,它们之间互不影响。,3final 最终变量,一旦成员变量被声明为final,在程序运行中将不能被改变。这样的成员变量就是一个常量。例如: final double PI=3.14159; 该语句声明一个常量PI,如果在后面试图重新对它赋值,将产生编译错误。另外,常量名一般用大写字母。常量和直接量一样不占用内存空间。,声明成员变量,例如,在类中声明3个成员变量。,public class Apple public String color; /声明公共变量color public static int count; /声明静态变量count public final boolean MATURE=true; /声明常量MATURE并赋值 public static void main(String args) System.out.println(Apple.count); Apple apple=new Apple(); System.out.println(apple.color); System.out.println(apple.MATURE); ,声明局部变量,例如,在grow()成员方法中声明两个局部变量。,public void grow() final boolean STATE; /声明常量STATE int age; /声明局部变量age ,变量的有效范围,变量的有效范围是指该变量在程序代码中的作用区域,在该区域外不能直接访问变量。有效范围决定了变量的生命周期,变量的生命周期是指从声明一个变量并分配内存空间、使用变量,然后释放该变量并清除所占用内存空间的一个过程。进行变量声明的位置,决定了变量的有效范围,根据有效范围的不同,可将变量分为以下两种。,变量的有效范围,(1)成员变量:在类中声明,在整个类中有效。 (2)局部变量:在方法内或方法内的复合代码块( “”与“”之间的代码)中声明的变量。在复合代码块声明的变量,只在当前复合代码块中有效;在复合代码块外、方法内声明的变量在整个方法内都有效。,变量的有效范围,例如下面的实例:,public class Olympics private int medal_All=800; /成员变量 public void China() int medal_CN=100; /方法的局部变量 if(medal_CN1000) /代码块 int gold=50; /代码块的局部变量 medal_CN+=50; /允许访问 medal_All-=150; /允许访问 ,4.2.5 对象生命周期,在Java语言中,把任何事物都看做对象,例如一个人、一个动物,或者没有生命体的轮船、汽车、飞机,甚至概念性的抽象,例如公司业绩。 一个对象在Java语言中的生命周期包括3个阶段: 创建对象 使用对象 销毁对象,创建对象,对象是类的实例。Java定义任何变量都需要指定变量类型,因此,在创建对象之前,一定要先声明该对象。声明对象的一般格式如下: 类名:用于指定一个已经定义的类。 对象名:用于指定对象名称,对象名必须是合法的Java标识符。,类名 对象名;,创建对象,例如声明Apple类的一个对象redApple的代码如下:,Person p1;,创建对象,在声明对象时,只是在内存中为其建立一个引用,并置初值为null,表示不指向任何内存空间。 声明对象以后,需要为对象分配内存,这个过程也称为实例化对象。在Java中使用关键字new来实例化对象,具体语法格式如下:,对象名=new 构造方法名(参数列表);,创建对象,对象名:必选,用于指定已经声明的对象名。 类名:必选,用于指定构造方法名,即类名,因为构造方法与类名相同。 参数列表:可选参数,用于指定构造方法的入口参数。如果构造方法无参数,则可以省略。,创建对象,在声明Apple类的一个对象redApple后,可以通过以下代码为对象redApple分配内存(即创建该对象): 在声明对象时,也可以直接实例化该对象: 这相当于同时执行了对象声明和创建对象:,Person p1=new Person();,p1=new Person();,Person p1; p1=new Person();,Person p1 = new Person(); 执行完后的内存状态,创建对象,当一个对象被创建时,会对其中各种类型的成员变量自动进行初始化赋值。除了基本数据类型之外的都是变量类型都是引用类型,如上面的Person及前面讲过的数组。,创建对象,使用对象,创建对象后,就可以访问对象的成员变量,并改变成员变量的值了,而且还可以调用对象的成员方法。通过使用运算符“.”实现对成员变量的访问和成员方法的调用。 语法格式为:,对象.成员变量 对象.成员方法(),创建新的对象之后,我们就可以使用“ 对象名.对象成员 ”的格式,来访问对象的成员(包括属性和方法) class TestPerson public static void main(String args) Person p1 = new Person(); Person p2 =new Person(); p1.age = -30; p1.shout(); p2.shout(); ,使用对象,上面程序运行的内存布局如下图,使用对象,对象的生命周期,销毁对象,在许多程序设计语言中,需要手动释放对象所占用的内存,但是,在Java中则不需要手动完成这项工作。Java提供的垃圾回收机制可以自动判断对象是否还在使用,并能够自动销毁不再使用的对象,收回对象所占用的资源。 Java提供了一个名为finalize()的方法,用于在对象被垃圾回收机制销毁之前执行一些资源回收工作,由垃圾回收系统调用,可以重写该方法。但是垃圾回收系统的运行是不可预测的。finalize()方法没有任何参数和返回值,每个类有且只有一个finalize()方法。,实现类的封装性,如果外面的程序可以随意修改一个类的成员变量,会造成不可预料的程序错误,就象一个人的身高,不能被外部随意修改,只能通过各种摄取营养的方法去修改这个属性。 在定义一个类的成员(包括变量和方法)时,使用private关键字说明这个成员的访问权限,这个成员成了类的私有成员,只能被这个类的其他成员方法调用,而不能被其他的类中的方法所调用。,为了实现良好的封装性,我们通常将类的成员变量声明为private,再通过public的方法来对这个变量进行访问。对一个变量的操作,一般都有读取和赋值操作,我们分别定义两个方法来实现这两种操作,一个是getXxx()(Xxx表示要访问的成员变量的名字),用来读取这个成员变量操作,另外一个是setXxx()用来对这个成员变量赋值。,实现类的封装性,一个类通常就是一个小的模块,我们应该让模块仅仅公开必须要让外界知道的内容,而隐藏其它一切内容。我们在进行程序的详细设计时,应尽量避免一个模块直接修改或操作另一个模块的数据,模块设计追求强内聚(许多功能尽量在类的内部独立完成,不让外面干预),弱耦合(提供给外部尽量少的方法调用)。用总统指挥一支军队的例子来说明这种效果。,实现类的封装性,类的封装所带来的优点,隐藏类的实现细节; 让使用者只能通过事先定制好的方法来访问数据,可以方便地加入控制逻辑,限制对属性的不合理操作; 便于修改,增强代码的可维护性;,我们在一个类中定义了一个private类型的成员变量,接着产生了这个类的两个实例对象,请问第一个对象的方法中,能否以“第二个对象.成员”的格式访问第二个对象中的那个private成员变量?,类的封装编程试验,4.2.4 构造方法的概念及用途,构造方法是一种特殊的方法,它的名字必须与它所在类的名字完全相同,并且没有返回值,也不需要使用关键字void进行标识。,public class Apple public Apple() / 构造方法 ,4.2.4 构造方法的概念及用途,构造方法用于对对象中的所有成员变量进行初始化,在创建对象时立即被调用。 【例4-2】定义Apple类,在该类的构造方法中初识化成员变量,然后在main()主方法中创建Apple类的实例对象并输出所有成员变量值。,构造方法的重载,和一般的方法重载一样,重载的构造方法具有不同个数或不同类型的参数,编译器就可以根据这一点判断出用new 关键字产生对象时,该调用哪个构造方法了。 产生对象的格式是:new 类名(参数列表) ;,构造方法的重载,重载构造方法可以完成不同初始化的操作, 如:p3=new Person(“Tom”,18);语句,会做这样几件事: 创建指定类的新实例对象, 在堆内存中为实例对象分配内存空间,并调用指定类的构造方法, 最后将实例对象的首地址赋值给引用变量p3。,p3=new Person(“Tom”,18) 的内存状态变化过程分析,构造方法的一些细节,在java每个类里都至少有一个构造方法,如果程序员没有在一个类里定义构造方法,系统会自动为这个类产生一个默认的构造方法,这个默认构造方法没有参数,在其方法体中也没有任何代码,即什么也不做。 由于系统提供的默认构造方法往往不能满足编程者的需求,我们可以自己定义类的构造方法,来满足我们的需要,一旦编程者为该类定义了构造方法,系统就不再提供默认的构造方法了。 声明构造方法,如无特殊需要,应使用public关键字,在我们前面例子中,可以使用private访问修饰符吗?,4.3 包,Java要求文件名和类名相同,所以如果将多个类放在一起时,很可能出现文件名冲突的情况,这时Java提供了一种解决该问题的方法,那就是使用包将类进行分组。下面将对Java中的包进行详细介绍。,4.3.1 包的概念,包(package)是Java提供的一种区别类的命名空间的机制,是类的组织方式,是一组相关类和接口的集合,它提供了访问权限和命名的管理机制。Java中提供的包主要有以下3种用途。 (1)将功能相近的类放在同一个包中,可以方便查找与使用。 (2)由于在不同包中可以存在同名类,所以使用包在一定程度上可以避免命名冲突。 (3)在Java中,某此访问权限是以包为单位的。,4.3.2 创建包,创建包可以通过在类或接口的源文件中使用package语句实现,package语句的语法格式如下: 包名:必选,用于指定包的名称,包的名称必须为合法的Java标识符。当包中还有子包时,可以使用“包1.包2.包n”进行指定,其中,包1为最外层的包,而包n则为最内层的包。,package 包名;,4.3.3 使用包中的类,类可以访问其所在包中的所有类,还可以使用其他包中的所有public类。访问其他包中的public类可以有以下两种方法。 (1)使用长名引用包中的类 使用长名引用包中的类比较简单,只需要在每个类名前面加上完整的包名即可。例如,创建Round类(保存在com.lzw包中)的对象并实例化该对象的代码如下:,com.lzw.Round round=new com.lzw.Round();,使用包中的类,(2)使用import语句引入包中的类 由于采用使用长名引用包中的类的方法比较繁琐,所以Java提供了import语句来引入包中的类。import语句的基本语法格式如下: 当存在多个包名时,各个包名之间使用“.”分隔,同时包名与类名之间也使用“.”分隔。*:表示包中所有的类。 例如,引入com.lzw包中的Round类的代码如下: 可以引入该包下的全部类:,import 包名1.包名2.类名 * ;,import com.lzw.Round;,import com.lzw.*;,4.4 继 承,在面向对象程序设计中,继承是不可或缺的一部分。通过继承可以实现代码的重用,提高程序的可维护性。,4.4.2 子类的创建,在类的声明中,可以通过使用关键字extends来显式地指明其父类。 语法格式为: 修饰符:可选,用于指定类的访问权限,可选值为public、abstract和final。 子类名:必选,用于指定子类的名称,类名必须是合法的Java标识符。一般情况下,要求首字母大写。 extends 父类名:必选,用于指定要定义的子类继承于哪个父类。,修饰符 class 子类名 extends 父类名,子类的创建,例如定义一个Cattle类,该类继承于父类Animal,即Cattle类是Animal类的子类:,abstract class Cattle extends Animal /此处省略了类体的代码 ,4.4.3 继承的使用原则,子类可以继承父类中所有可被子类访问的成员变量和成员方法,但必须遵循以下原则: (1)子类能够继承父类中被声明为public和protected的成员变量和成员方法,但不能继承被声明为private的成员变量和成员方法; (2)子类能够继承在同一个包中的由默认修饰符修饰的成员变量和成员方法;,4.4.3 继承的使用原则,子类可以继承父类中所有可被子类访问的成员变量和成员方法,但必须遵循以下原则: (3)如果子类声明了一个与父类的成员变量同名的成员变量,则子类不能继承父类的成员变量,此时称子类的成员变量隐藏了父类的成员变量; (4)如果子类声明了一个与父类的成员方法同名的成员方法,则子类不能继承父类的成员方法,此时称子类的成员方法覆盖了父类的成员方法。,继承的使用原则,【例4-4】 定义一个动物类Animal 及它的子类Bird。 动物园Zoo,4.4.4 使用this关键字,当局部变量和成员变量的名字相同时,成员变量就会被隐藏,这时如果想在成员方法中使用成员变量,则必须使用关键字this。 语法格式为: 【例4-5】,this.成员变量名 this.成员方法名(),4.4.5 使用super关键字,子类可以继承父类的非私有成员变量和成员方法(不是以private关键字修饰的),但是,如果子类中声明的成员变量与父类的成员变量同名,那么父类的成员变量将被隐藏。如果子类中声明的成员方法与父类的成员方法同名,并且参数个数、类型和顺序也相同,那么称子类的成员方法覆盖了父类的成员方法。这时,如果想在子类中访问父类中被子类隐藏的成员方法或变量时,就可以使用super关键字。,使用super关键字,super关键字主要有以下两种用途。 (1)调用父类的构造方法 (2)操作被隐藏的成员变量和被覆盖的成员方法,调用父类的构造方法,子类可以调用父类的构造方法。但是必须在子类的构造方法中使用super关键字来调用。其语法格式如下: 如果父类的构造方法中包括参数,则参数列表为必选项,用于指定父类构造方法的入口参数。 例如下面的代码在Animal类中添加一个默认的构造方法和一个带参数的构造方法:,super(参数列表);,public Animal() public Animal(String strSkin) skin=strSkin; ,调用父类的构造方法,这时,如果想在子类Bird中使用父类的带参数的构造方法,则需要在子类Bird的构造方法中通过以下代码进行调用:,public Bird() super(“羽毛“); ,操作被隐藏的成员变量 和被覆盖的成员方法,如果想在子类中操作父类中被隐藏的成员变量和被覆盖的成员方法,也可以使用super关键字。 如果想在子类Bird的方法中改变父类Animal的成员变量skin的值可以使用以下代码: 如果想在子类Bird的方法中使用父类Animal的成员方法move()可以使用以下代码:,super.成员变量名 super.成员方法名(参数列表),super.skin=“羽毛“;,super.move();,4.5 多 态,多态是面向对象程序设计的重要部分,是面向对象的3个基本特性之一。在Java语言中,通常使用方法的重载(Overloading)和覆盖(Overriding)实现类的多态性。,4.5.1 方法的重载,方法的重载是指在一个类中,出现多个方法名相同,但参数个数或参数类型不同的方法,则称为方法的重载。Java在执行具有重载关系的方法时,将根据调用参数的个数和类型区分具体执行的是哪个方法。 【例4-6】,4.5.1 方法的重载,方法的重载是指在一个类中,出现多个方法名相同,但参数个数或参数类型不同的方法,则称为方法的重载。Java在执行具有重载关系的方法时,将根据调用参数的个数和类型区分具体执行的是哪个方法。 重载的方法之间并不一定必须有联系,但是为了提高程序的可读性,一般只重载功能相似的方法。,4.5.1 方法的重载,【例4-7】 注意:在方法重载时,方法返回值的类型不能作为区分方法重载的标志。,4.6 特 殊 类,Java语言中还包含一些特殊的类定义方式,例如: 抽象类 final类 它们都属于Java类的高级特性。,4.6.1 抽象类和抽象方法,所谓抽象类就是只声明方法的存在而不去具体实现它的类。抽象类不能被实例化,也就是不能创建其对象。在定义抽象类时,要在关键字class前面加上关键字abstract。语法格式为: 例如定义一个名称为Fruit的抽象类:,abstract class 类名 类体 ,abstract class Fruit /定义抽象类 public String color; /定义颜色成员变量 public Fruit() /定义构造方法 color=“绿色“; /对变量color进行初始化 ,抽象方法,在抽象类中创建的、没有实现的、必须要子类重写的方法称为抽象方法。抽象方法只有方法的声明,而没有方法的实现,用关键字abstract进行修饰。 方法返回值类型:必选,用于指定方法的返回值类型,如果该方法没有返回值,可以使用关键字void进行标识。 方法名:必选,用于指定抽象方法的名称。 参数列表:可选,用于指定方法中所需的参数。当存在多个参数时,各参数之间应使用逗号分隔。 在抽象类中添加一个抽象方法,可使用如下代码:,abstract 方法名(参数列表);,public abstract void harvest(); /收获的方法,抽象方法,包含一个或多个抽象方法的类必须被声明为抽象类。这是因为抽象方法没有定义方法的实现部分,如果不声明为抽象类,这个类将可以生成对象,这时当用户调用抽象方法时,程序就不知道如何处理了。 【例4-9】 注意:抽象方法不能使用private或static关键字进行修饰。,4.4.2 final类,使用关键字final修饰的类称为final类,该类不能被继承,即不能有子类。有时为了程序的安全性,可以将一些重要的类声明为final类。例如,Java语言提供的System类和String类都是Final类。 定义final类的语法格式为:,final class 类名 类体 ,4.6.3 内部类,Java语言允许在类中定义内部类,内部类就是在其他类内部定义的子类。 一般格式为: 内部类有以下4种形式: 成员内部类 局部内部类 静态内部类 匿名内部类,public class Zoo class Wolf / 内部类Wolf ,成员内部类,成员内部类和成员变量一样,属于类的全局成员。 一般格式为: 注意:成员变量id定义为公有属性public,但是内部类Inner不可以使用public修饰符,因为公共类的名称必须与类文件同名,所以每个Java类文件中只允许存在一个public公共类。,public class Sample public int id; / 成员变量 class Inner / 成员内部类 ,成员内部类,Inner内部类和变量id都被定义为Sample类的成员,但是Inner成员内部类的使用要比id成员变量复杂一些。 一般格式为: 只有创建了成员内部类的实例,才能使用成员内部类的变量和方法。 【例4-10】,Sample sample = new Sample(); Sample.Inner inner = sample.new Inner();,4.7 接 口,Java只支持单重继承,不支持多重继承,即一个类只能有一个父类。但是在实际应用中,又经常需要使用多重继承来解决问题。为了解决该问题,Java提供了接口来实现类的多重继承功能。,4.7.1 定义接口,Java语言使用关键字interface来定义一个接口。接口定义与类的定义类似,也是分为接口的声明的接口体,其中接口体由常量定义和方法定义两部分组成。 语法格式如下:,修饰

温馨提示

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

评论

0/150

提交评论