31
第第第 第第第 JAVA JAVA 第第第第第第第第第第 第第第第第第第第第第 6.1 类 6.2 类类 6.3 类类类类类类类 6.4 类类类 类类类 Inner Class

第六章 JAVA 语言中的面向对象特性

  • Upload
    varen

  • View
    107

  • Download
    6

Embed Size (px)

DESCRIPTION

第六章 JAVA 语言中的面向对象特性. 6.1 类 6.2 对象 6.3 面向对象的特性 6.4 抽象类、接口和 Inner Class. 6.1 类. 6.1.1 类的创建. 6.1.2 成员变量. [ 修饰符 ][static][final] 变量类型 变量名 ;. 修饰符: public, protected, private 表示访问控制。 static : 表示变量是静态变量。可以有类直接调用,并被所有的 类的实例共享。 final : 表示变量是一个常量。在程序中不能被修改。 - PowerPoint PPT Presentation

Citation preview

Page 1: 第六章 JAVA 语言中的面向对象特性

第六章第六章 JAVAJAVA 语言中的面向对象特性语言中的面向对象特性6.1 类6.2 对象6.3 面向对象的特性6.4 抽象类、接口和 Inner Class

Page 2: 第六章 JAVA 语言中的面向对象特性

6.1 类

Page 3: 第六章 JAVA 语言中的面向对象特性

6.1.1 6.1.1 类的创建类的创建

Page 4: 第六章 JAVA 语言中的面向对象特性

6.1.2 6.1.2 成员变量成员变量[ 修饰符 ] [static][final] 变量类型 变量名 ;

修饰符: public, protected, private 表示访问控制。static : 表示变量是静态变量。可以有类直接调用,并被所有的 类的实例共享。final : 表示变量是一个常量。在程序中不能被修改。transient 、 volatile : 用的很少,了解其用途。举例:举例: public static int num ;

Page 5: 第六章 JAVA 语言中的面向对象特性

6.1.3 6.1.3 成员方法成员方法[ 修饰符 ] [static][final | abstract] [native] 返回类型 方法名(参数列表)throws 异常列表 ;

修饰符: public, protected, private 表示访问控制。static : 表示该方法是静态方法。可以有类直接调用。final : 表示该方法不能被重载。abstract : 表示该方法。native : 表示该方法由其他程序语言完成。如 C++

举例:举例: public static void IncrNum(){ num++ ; }

Page 6: 第六章 JAVA 语言中的面向对象特性

类的举例:类的举例:public class Car{public class Car{

public String color;public String color; //// 成员变量成员变量public int speed;public int speed;

public static int saleNum ; public static int saleNum ; //// 静态变量静态变量public Car(){public Car(){ //// 构造方法构造方法

color=“Red”;color=“Red”; speed=100;speed=100;}}public void turnLeft(){public void turnLeft(){ //// 成员方法成员方法

…………}}public void turnRight(){public void turnRight(){

…………}}public static void incrSaleNum(){public static void incrSaleNum(){ //// 静态方法静态方法

saleNum++ ;saleNum++ ;}}

}}

Page 7: 第六章 JAVA 语言中的面向对象特性

6.1.4 6.1.4 方法重载方法重载概念:多个方法具有相同的方法名,但参数表不同。

如:public void turnLeft(float angle){

……}public void turnLeft(float angle, int speed){

……}

Page 8: 第六章 JAVA 语言中的面向对象特性

6.1.5 6.1.5 构造方法构造方法 是一个特殊的方法,每个类都有 用来实例化该类,生成一个对象 构造方法和类同名,且无返回值 构造方法可以不显式写出,有 JAVA 系统提供缺省的构造方法 构造方法也可以显式写出,并可以被重载。 构造方法只能由 new 操作符调用,不能有类、对象调用 构造方法举例 Point.java

Page 9: 第六章 JAVA 语言中的面向对象特性

构造函数的多态构造函数的多态

Page 10: 第六章 JAVA 语言中的面向对象特性

6.2 对象对象是类的实例,其生命周期为:生成、使用和清除

6.2.1 6.2.1 对象的生成对象的生成1. 格式:

Type objectName = new Type( 参数表 ) ;2. 说明:

1 ) Type objectName 声明了一个类型为 Type 的对象,但并没有 分配内存空间2 ) new 操作符为 objectName 分配内存空间,并返回该对象的一个 引用。3 )调用构造方法 Type( 参数表 ) ,进行初始化。

Page 11: 第六章 JAVA 语言中的面向对象特性

6.2.2 6.2.2 对象的使用对象的使用1. 格式:对象名 . 变量; 对象名 . 方法;2. 举例见 PointUsing.java

6.2.2 6.2.2 对象的清除对象的清除JAVA 的垃圾回收机制负责对象的清除。

Page 12: 第六章 JAVA 语言中的面向对象特性

在编程中,包可以分为在编程中,包可以分为两个部分两个部分:: JAVAJAVA 系统包、程序 系统包、程序 员编制的包。员编制的包。

在在 JAVAJAVA 中,包的概念和其他编程语言中的中,包的概念和其他编程语言中的函数库函数库的概的概 念是相同的,也可以称为类库。如念是相同的,也可以称为类库。如 ::

java.io.*;java.io.*; java.util.*; java.util.*; com.mypackage.db.*;com.mypackage.db.*; 包是包是类和接口的集合类和接口的集合,通常将功能相似的类放在一个,通常将功能相似的类放在一个

包里,如同把包里,如同把 mp3mp3 文件放到一个文件放到一个 musicmusic 目录下。这样目录下。这样 使得程序功能清楚,结构分明。使得程序功能清楚,结构分明。

包是一种包是一种松散的类的集合松散的类的集合(没有明确的命名、存放规(没有明确的命名、存放规 则)。但是为了统一、一般采用约定俗成的规则。则)。但是为了统一、一般采用约定俗成的规则。

6.3 6.3 包包

Page 13: 第六章 JAVA 语言中的面向对象特性

6.3.1 6.3.1 创建包创建包创建包的格式:创建包的格式:

packagepackage 包名包名 .. 子包名子包名 ;;

该语句必须放在该语句必须放在 .java.java 文件的第一个非注释行。文件的第一个非注释行。创建包就是在当前文件夹下创建一个子文件夹。如:创建包就是在当前文件夹下创建一个子文件夹。如:

package MyPackage;package MyPackage;

package MyPackage.SubPackage;package MyPackage.SubPackage;

Page 14: 第六章 JAVA 语言中的面向对象特性

6.2.2 6.2.2 程序包的引用(程序包的引用( importimport 语句)语句)通常一个类只能引用与它在同一个包中的类。如果通常一个类只能引用与它在同一个包中的类。如果要使用其他包中的要使用其他包中的 publicpublic 类,则可以使用以下类,则可以使用以下 44 种方法:种方法:

使用包名、类名前缀使用包名、类名前缀java.util.Date d = new java.util.Date();java.util.Date d = new java.util.Date();

加载需要使用的类加载需要使用的类import java.util.Date;import java.util.Date;Date d = new Date();Date d = new Date();

加载整个包加载整个包import java.util.*;import java.util.*;Date d = new Date();Date d = new Date();Vector v = new Vector();Vector v = new Vector();

Page 15: 第六章 JAVA 语言中的面向对象特性

使用使用 CLASSPATHCLASSPATHCLASSPATHCLASSPATH 类似于类似于 DOSDOS 中的中的 PATHPATH ,从形式上,从形式上看就是一系列的目录。它指明了所有类的默认存放的根路看就是一系列的目录。它指明了所有类的默认存放的根路径。径。类的存放路径 类的存放路径 = CLASSPATH= CLASSPATH 中的路径 中的路径 + + 包中指定的路径 包中指定的路径 在程序需要装载某个类时,在程序需要装载某个类时, JDKJDK 就到系统中搜索这个类。就到系统中搜索这个类。

JDKJDK.G:\2000java\src…

Cs2000.hfut.ch6Cs2000.hfut.ch6

Page 16: 第六章 JAVA 语言中的面向对象特性

6.4 6.4 面向对象的特性面向对象的特性1.1.封装性封装性2.2.继承性继承性3.3.多态性多态性4.4.其他特性其他特性

Page 17: 第六章 JAVA 语言中的面向对象特性

6.4.1 6.4.1 封装性封装性JAVAJAVA 中对象就是一组变量和方法的封装。中对象就是一组变量和方法的封装。封装实现了使用者和设计者的分离。提高了程序的重用性。封装实现了使用者和设计者的分离。提高了程序的重用性。通过封装,实现了模块化和信息隐藏。通过封装,实现了模块化和信息隐藏。JAVAJAVA 中的访问控制修饰符中的访问控制修饰符 (P54 Example)(P54 Example)public, protected, package, privatepublic, protected, package, private

修饰符修饰符 类类 包包 子类子类 所有类和包所有类和包privateprivate √√

packagepackage √√ √√

protectedprotected √√ √√ √√

publicpublic √√ √√ √√ √√

Page 18: 第六章 JAVA 语言中的面向对象特性

1. 1. 创建子类创建子类格式格式 :: [[ 修饰符修饰符 ] class ] class 类名类名 extends extends 父类 父类 {{

类体类体 ;; }}如如 ::public class MyApplet extends java.applet.Appletpublic class MyApplet extends java.applet.Appletpublic class MyApplication extends Framepublic class MyApplication extends Framepublic class MyApp1public class MyApp1

注意:注意:在父类的构建器中,在父类的构建器中, JavaJava 会自动插入对子类构建器的调用。会自动插入对子类构建器的调用。 见见 Cartoon.javaCartoon.java

6.2. 6.2. 继承性继承性

Page 19: 第六章 JAVA 语言中的面向对象特性

class A{class A{int a1=1;int a1=1;public int a2=2;public int a2=2;protected int a3=3;protected int a3=3;private int a4=4;private int a4=4;int geta4() {return a4;}int geta4() {return a4;}

}}class B extends A{class B extends A{

int b=5;int b=5;int sum() { return a1+a2+a3+geta4()+b; }int sum() { return a1+a2+a3+geta4()+b; }

}}public class ClassInheritance{public class ClassInheritance{

public static void main(String[] a){public static void main(String[] a){ A aa = new A();A aa = new A(); System.out.println(“A:”+aa.a1+”\t”+aa.a2+”\t”+aa.a3+”\t”+aa.geta4System.out.println(“A:”+aa.a1+”\t”+aa.a2+”\t”+aa.a3+”\t”+aa.geta4());()); B bb = new B();B bb = new B();System.out.println(“B:”+bb.a1+”\t”+bb.a2+”\t”+bb.a3+”\t”+aa.geta4()System.out.println(“B:”+bb.a1+”\t”+bb.a2+”\t”+bb.a3+”\t”+aa.geta4()++ ”\t”+bb.sum());”\t”+bb.sum());} }

}}

Page 20: 第六章 JAVA 语言中的面向对象特性

2. 2. 成员变量的隐藏和方法的重写成员变量的隐藏和方法的重写Class Point {Class Point {

int x,y;int x,y;void setPoint(int a,int b){void setPoint(int a,int b){

x=a;y=b;x=a;y=b;}}

}}Class Point3D Class Point3D extends Pointextends Point { {

int x,y,z;int x,y,z; //// 父类的变量被隐父类的变量被隐藏藏 void setPoint(int a,int b,int c){void setPoint(int a,int b,int c){ //// 父类的方法被重写父类的方法被重写

x=a;y=b;z=c;x=a;y=b;z=c;}}

}}

Page 21: 第六章 JAVA 语言中的面向对象特性

3. super3. super 在子类中需要调用父类的同名方法或使用父类的同名在子类中需要调用父类的同名方法或使用父类的同名变量时变量时 ,, 使用关键字使用关键字 supersuper 来指明当前调用的是父类的成员来指明当前调用的是父类的成员变量或方法。变量或方法。 见教材见教材 Chess.javaChess.java 示例示例

Page 22: 第六章 JAVA 语言中的面向对象特性

1. 1. 编译时多态编译时多态表现为方法名相同,而参数表不同。表现为方法名相同,而参数表不同。典型:典型: System.out.println();System.out.println(); 它底参数有很多种。它底参数有很多种。

6.3 6.3 多态性多态性

2.2. 运行时多态运行时多态取得一个对象句柄,并将其作为父类型句柄使用的行为就叫作“上溯造型” 1) Music.java2) Music2.java3) Shapes.java

Page 23: 第六章 JAVA 语言中的面向对象特性

Shapes.java 中类的结构图

Page 24: 第六章 JAVA 语言中的面向对象特性

3. 3. 对象状态的判断对象状态的判断由于子类对象可以作为父亲类对象使用。那么我们有时需要判断这个对象究竟属于哪由于子类对象可以作为父亲类对象使用。那么我们有时需要判断这个对象究竟属于哪个类。个类。 JAVAJAVA 提供提供 instanceofinstanceof 关键字。关键字。见见 InstanceofTest.javaInstanceofTest.java

Page 25: 第六章 JAVA 语言中的面向对象特性

4. final4. final 关键字关键字修饰变量修饰变量修饰方法修饰方法修饰类修饰类

5. static5. static 关键字关键字用用 staticstatic 修饰的变量、方法称为类变量、类方法修饰的变量、方法称为类变量、类方法类变量只有一个副本。所有的对象共享。类变量只有一个副本。所有的对象共享。类方法只能使用类变量类方法只能使用类变量类方法可以被类调用,也可以被对象调用类方法可以被类调用,也可以被对象调用Emaple P63Emaple P63

Page 26: 第六章 JAVA 语言中的面向对象特性

4. java.lang.Object4. java.lang.Object 类类

equals()equals()final getClass()final getClass()toString()toString()finalize()finalize()notify(),notifyAll()notify(),notifyAll() 和和 wait()wait()

是 JAVA 中所有类的父类(间接父类)。其中定义了所有对象基本的状态和方法。

Page 27: 第六章 JAVA 语言中的面向对象特性

6.5 6.5 抽象类和接口抽象类和接口6.5.1 抽象类

• 使用 abstract 修饰的类叫做抽象类• 使用 abstract 修饰的方法叫做抽象方法• 抽象类的意图是为从它派生出去的所有类都创建一个通用接口。 从而实现运行时多态。• 抽象类不一定要包含抽象方法。• 如果一个类中包含了一个以上的 abstract 方法,那么这个类必须 是 abstract 。• abstract 类不能被实例化,只能作为父类来派生子类。• 由抽象类派生的非抽象子类必须实现父类中的所有抽象方法。• 抽象类、抽象方法的表现形式。• 举例: Music4.java

Page 28: 第六章 JAVA 语言中的面向对象特性
Page 29: 第六章 JAVA 语言中的面向对象特性

6.5.2 接口• 是一个更“纯”的抽象类。(不能含有非 abstact 方法,变量)• 接口这样描述自己:“对于实现我的所有类,看起来都应该象我现在 这个样子”。• 接口只包含常量和方法的定义,没有变量和方法的实现。• 接口可以实现多重继承的功能。• 若使用接口,我们可以同时获得抽象类以及接口的好处。

1. 关于接口的几个问题

Page 30: 第六章 JAVA 语言中的面向对象特性

• 接口声明格式: [public] interface 接口名 extends 接口列表 {…

}• 接口体 接口体包含常量和方法的定义• 接口举例 InterfaceDmo.java

2. 接口的定义

3. 接口的实现• 使用使用 implementsimplements 关键字关键字• 举例举例 InterfaceTest.javaInterfaceTest.java

Page 31: 第六章 JAVA 语言中的面向对象特性

6.5 Inner Class6.5 Inner Class内部类:一个类内部嵌套另一个类的定义。

• Inner Class 可以使用包含它的类 (外层 ) 的静态和成员变量。• Inner Class 可以定义为 abstract , private 或 protected 。• Inner Class 若被声明为 static ,就不能使用成员变量。• Inner Class 不是 static ,就不能拥有 static 变量。• Inner Class 可以节省编译后字节码文件的大小,但使用 Inner Class 造成程序结构不清楚。