Java面向对象的程序设计.ppt_第1页
Java面向对象的程序设计.ppt_第2页
Java面向对象的程序设计.ppt_第3页
Java面向对象的程序设计.ppt_第4页
Java面向对象的程序设计.ppt_第5页
已阅读5页,还剩69页未读 继续免费阅读

下载本文档

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

文档简介

第六章 Java语言中的面向对象特征,第六章 Java语言中的面向对象特征,6.1 类 6.2 对象 6.3 包 6.4 面向对象特征 6.5 抽象类和接口,6.1 类,6.1.1 类的声明 6.1.2 成员变量 6.1.3 成员方法 6.1.4 方法重载 6.1.5 构造方法 6.1.6 finalize()方法,6.1 类,从程序设计的角度看,类是面向对象程序中最基本的程序单元。类实质上定义的是一种数据类型。类中包含一组变量和一组方法(函数),利用它可以创建对象。 类是对象的模板(template),对象是类的一个实例(instance)。,6.1.1 类的声明,格式:属性 class 继承说明 接口说明 类体 类的属性: public abstract | final 继承说明: extends 接口说明: implements 类 体: 成员变量 成员方法 ,6.1.2 成员变量,格式:修饰符 变量类型 变量名称=初值; 变量类型:简单类型、类、接口、数组 修饰符: public | protected | private static final transient volatile 说明: 访问控制修饰符 :public protected private 非访问控制修饰符 static:类变量(或称静态变量),否则为实例变量 final:常量 transient:暂时性变量(和序列化有关) volatile:共享变量(和线程有关),6.1 类,6.1.3 成员方法,1.方法声明格式: 修饰符 返回类型 方法名(参数列表)例外抛出声明 方法体 说明: 返回类型:简单类型、类、接口、数组(必须写出) 修饰符: public | protected | private static final | abstract native synchronized 参数列表:(任意)类型 名称 ,类型 名称 例外抛出声明:throws 例外类型 方法体:局部变量定义以及Java语句,6.1 类,6.1.4 方法的重载(overload),重载构成的条件:方法的名称相同,但参数类型或参数个数不同,才能构成方法的重载。 注意:方法类型不参与匹配。通常只有功能相似的方法重载才有价值,6.1 类,6.1.4 方法的重载,class MethodOverloading void receive(int i) System.out.println(“received int data:” + i); void receive(String s) System.out.println(“received string data:” + s); void receive(int i, int j) System.out.println(“received two int datas:” + i + ” “ + j); class MethodOverloadingTest public static void main(String args ) MethodOverloading mo=new MethodOverloading(); mo.receive(1); mo.receive(“1”); mo.receive(1,2); ,结果(编译、执行): received int data:1 received string data:1 received two int datas:1 2,6.1 类,6.1.4 方法重载,注意事项: 只有返回类型不同,不能实现重载(编译出错) 如: void receive( int i ) int receive( int i ) return(1); 如果调用不存在的方法,编译出错 如:receive(1.23),6.1 类,6.1.5 构造方法,构造方法:是一种特殊方法,其主要功能是对创建的对象进行初始化。 构造方法特点: 方法的名字必须和所在类同名,而且没有返回类型。 构造方法主要用于为类的对象定义初始化状态。 我们不能直接调用构造方法,必须通过new关键字来自动调用,从而创建类的实例。 Java的类都要求有构造方法,如果没有定义构造方法,java编译器会为我们提供一个缺省的构造方法,也就是不带参数的构造方法。,缺省构造方法,当我们用缺省的构造方法初始化对象时,系统用默认值初始化对象的成员变量。 各种数据类型的默认值为: 数值型 0 boolean false char 0 对象 null,例(方法名、重载、this): class Point int x,y; Point() x=0; y=0; Point(int x,int y) this.x=x; this.y=y; ,特殊变量this,this变量代表对象本身 当类中有两个同名变量,一个属于类(类的成员变量),而另一个属于某个特定的方法(方法中的局部变量),使用this区分成员变量和局部变量。 使用this简化构造函数的调用。,特殊变量this,关于实例方法和实例数据成员的进一步说明 一个类所有的实例(对象)调用的成员方法在内存中只有一份拷贝,尽管在内存中可能有多个对象,而数据成员在类的每个对象所在内存中都存在着一份拷贝。this变量允许相同的实例方法为不同的对象工作。每当调用一个实例方法时,this变量将被设置成引用该实例方法的特定的类对象。方法的代码接着会与this所代表的对象的特定数据建立关联。,6.1.6 finalize方法,finalize方法 对象被释放时自动调用的方法(类似于C+的析构方法),这种方法可以不定义。 类方法:在方法类型前加“static”定义 实例方法,6.1 类,注意,只有方法能对成员变量进行操作,成员变量在定义的同时可以赋初值; 实例方法可以操作实例变量和类变量,而类方法只能操作类变量; 一个类中的方法可以相互调用。,返回,6.2 对象,6.2.1 对象的生命周期:包括创建、使用和删除 1. 对象的创建过程: 包含三方面的内容:声明、实例化(内存分配)、初始化(调用构造方法) 定义格式:类名 对象名=new 类名(参数列表); new关键字的作用 为对象分配内存空间。 引起对象构造方法的调用。 为对象返回一个引用。 注意: Java语言中,对象的实例化必须通过new运算符,这点与C+语言明显不同,没有经过new运算符实例化的对象是空对象,其本质与空指针相同。,6.2 对象,2. 对象的使用:通过 . 运算符访问成员变量或方法。 例6.5:二维坐标上的点及其相关方法(取x、y坐标,移动,新建对称点) 3. 对象的清除:当不存在对一个对象的引用,该对象便成为无用对象,系统通过垃圾回收线程自动回收其所占用的内存区. 例如: Point pt=new Point(); pt=null; 或: Point pt1=new Point(); Point pt2=new Point(12,3); pt1=pt2; /原先的p1对象被自动回收,对象是引用型变量(类似指针) 或: void garbageCollection() Point pt=new Point(); /方法调用结束后Point对象被自动回收,6.2 对象,6.2 对象,内存分配 例: Point pt1=new Point(); Point pt2=new Point(12,3); Pt1=pt2;,0x99f311,0x334009,0,0,3,12,pt1,pt2,0x334009,6.2 对象,6.2.2 对象中的方法调用 当方法调用时,传递参数的类型既可以是简单数据类型,也可以是复合数据类型(数组、类或接口)。 在Java中,传参时,都是以传值的方式进行。 对于基本数据类型,传递的是数据的拷贝;对于复合类型,传递的引用的拷贝。,例:(书中例6.1) public class PassTest void changeInt(int value) value=55; public static void main(String args) PassTest pt=new PassTest(); int val=11; pt.changeInt(val); System.out.println(“val=“+val); ,val,main,changeInt,11(55),value,11,例:(与上例对照) public class PassTest float ptValue; public void change(PassTest ref) ref.ptValue=99f; public static void main(String args) PassTest pt=new PassTest (); pt.ptValue=101f; System.out.println(“Original ptValue is”+pt.ptValue); pt.change(pt); System.out.println(“ptValue after Change is”+pt.Value); ,pt,main,change,栈内存,堆内存,PassTest类的对象,ref,0088:4660,0088:4660,0088:4660,6.3 包(package),问题:由于Java编译器为每个类生成一个字节码文件,且文件名与类名相同,因此同名的类有可能会发生冲突。 例:,6.3 包(package),解决方法:将编译得到的字节代码文件存放在不同的子文件夹中,并把相对路径和类名混合在一起,做为类的完整名。 例:,P1.SameName类,P2.SameName类,6.3.1 package语句,创建包使用package语句。格式为: package pkg1.pkg2.pkg3; 例如: package java.awt.image; 注意: package语句必须是文件中的第一条语句。也就是说,在package语句之前,除了空白和注释之外不能有任何语句。 如果不加package语句,则指定为缺省包或无名包。 包对应着文件系统的目录层次结构。 在package语句中,用“.”来指明包(目录)的层次。,6.3 包,在当前目录下生成包 javac d . Test.java 在指定目录下生成包 javac d d: Test.java,6.3.2 import语句,import语句用于引入需要的包。一般格式为: import pkg1.pkg2.pkg3.classname|*; 例如:引入包中的类 import java.io.File; 引入整个包 import java.io.*; 如果不用import语句,需要在使用类的地方书写完整的包名,所以一般不采用这种方法。 在同一包中的类可以互相引用,无需import语句,6.3 包,6.3.2 import语句,使用import语句可以引入类库中的类 例如: import java.util.*; class myDate extends Date 也可以直接引入该类: class myDate extends java.util.Date ,6.3 包,6.3.3 Java类库介绍,1. java.lang包 包含一些Java语言的基本类与核心类,如String、Math、Integer、System和Runtime,提供常用的功能,这个包中的所有类是被隐式导入的。 2. java.io包 包含一些用作输入输出(I/O)处理的类。 3. Java.util包 包含一些实用工具类和数据结构类。 4. java.awt包 包含一些用于编写与平台无关的图形界面(GUI)应用程序的类。 5. java.applet包 包含一些用于创建Java小应用程序的类。 6. 包 包含用于建立网络连接的类,与java.io同时使用完成与网络有关的读写。,6.3 包,返回,6.4 面向对象特性,Java语言中的面向对象特性: 封装性、继承性、多态性。,6.4.1 封装性(Encapsulation ),封装是一种信息隐藏技术,用户只能看到对象封装界面上的信息,而对象内部对于用户而言是隐藏的。这种“黑匣子”结构是面向对象编程的最基本思想。 封装:是通过对类、成员变量和成员方法施以一定的访问权限,使得其它类的代码必须通过适当的接口才能访问。,6.4 面向对象特性,6.4.1 封装性,类的访问说明符 (1) public (2)default(不加访问说明符时) 类中的成员变量和成员方法的访问说明符,有 (1)public (2)protected (3)default (不加访问说明符时) (4)private 其作用是对类的成员施以一定的访问权限限定,实现类中成员在一定范围内的信息隐藏。,6.4.1 封装性,例6.6 通过本例来说明上述的访问权限。,6.4 面向对象特性,不同 情形下,访问说明符,6.4.1 封装性,6.4 面向对象特性,不同 情形下,访问说明符,6.4.1 封装性,6.4 面向对象特性,不同 情形下,访问说明符,6.4.1 封装性,6.4 面向对象特性,不同 情形下,访问说明符,6.4.1 封装性,6.4 面向对象特性,不同 情形下,访问说明符,6.4.1 封装性,6.4 面向对象特性,6.4.1 封装性,有四种修饰符实现访问权限:private、默认、protected和public。 private:只能被类中的其他成员访问,不能被其他类,包括自身类的子类所访问。 默认(没有修饰符):具有包的访问性,可被同一包内的其他类所访问,但在包以外不能访问。 protected:用于类继承场合的访问控制,可以被同一包内其他类以及其他包中该类的子类访问。 public:可以被所有类访问。,6.4 面向对象特性,6.4.2 继承性(Inheritance ),继承:一个类获取另一个类的所有变量和方法的过程。被继承的类称为父类,由继承而得到的类称为子类。 1. 创建子类(实现继承) 使用关键字extends,声明子类,如: class 子类名 extends 父类名 子类体 如果没有继承任何类,Java默认其父类为 java.lang.Object 继承是实现代码复用的最主要手段。 Java中不允许多继承。,6.4 面向对象特性,6.4.2 继承性,2. 方法的重写和成员变量隐藏 方法重写:在子类中定义一个与父类同名、返回类型、参数类型均相同一个方法,称为方法的覆盖或方法重写。 覆盖发生在子类与父类之间。,6.4 面向对象特性,成员变量隐藏:如果在子类中,对从父类中继承过来的成员变量又重新定义,声明了与父类同名的变量,称为成员变量隐藏。 例如: class A int x=3; class B extends A int x=5; 处理成员变量隐藏的方法: 在子类执行继承父类的操作时,使用继承自父类的变量,子类执行自己定义的操作时,使用自己定义的变量。,6.4.2 继承性,6.4 面向对象特性,3. super 特殊变量super,提供了对父类的访问。 super的使用: (1)可以使用super访问父类被子类隐藏的变量或覆盖的方法。 访问父类被隐藏的成员变量,如 super. 用来调用父类中被重写的方法,如: super.(); (2)每个子类构造方法的第一条语句,都是隐含地调用super(),如果父类没有这种形式的构造函数,那么在编译的时候就会报错。 用来调用父类的构造方法,如: super();,6.4.2 继承性,6.4 面向对象特性,例:成员变量的隐藏和方法的重写,以及super的使用 class superClass int x; superClass( ) x=3; System.out.println(“in superClass:x=“+x); void doSomething( ) System.out.println(“in SuperClass.doSomething()“); class subClass extends superClass int x; /此行不定义,结果如何? subClass( ) x=5; System.out.println(“in subClass:x=“+x); void doSomething( ) super.doSomething(); System.out.println(“in SubClass.doSomething()“); System.out.println(“super.x=“+super.x+“ sub.x=“+x); ,/下面是对上述类的测试类 public class inheritance public static void main(String args) subClass subC=new subClass(); subC.doSomething(); ,6.4.2 继承性,继承的特点 继承具有传递性,即子类不仅继承父类的成员,还能继承父类的父类、父类的父类的父类的所有成员。 任何一个类都可以是另外一个类的子类,同时又可以是其它多个类的父类。即在Java语言中类的继承是单继承。,6.4 面向对象特性,6.4.3 多态性,多态性:由于方法重载和覆盖引起的方法同名不同功能现象。 静态(编译时)多态性:通过方法重载实现的多态。 动态(运行时)多态性: 通过覆盖父类的方法来实现,在运行时根据传递的对象引用,来调用相应的方法。,6.4.3 多态性(Polymorphism),当一个类的多个子类都覆盖同一个方法时,父类的某个对象根据其实例化方式,具有不同的行为。例如:,6.4 面向对象特性,6.4.3 多态性,动态多态实例 例: class A void callme() System.out.println(“Inside As callme()“); class B extends A void callme() System.out.println(“Inside Bs callme()“); class C extends A void callme() System.out.println(“Inside Cs callme()“); ,6.4 面向对象特性,6.4.3 多态性,public class Dispatch_1 public static void main(String args) A r; A a=new A(); B b=new B(); C c=new C(); r=a; r.callme(); r=b; r.callme(); r=c; r.callme(); ,运行结果: Inside As callme() Inside Bs callme() Inside Cs callme(),同一个对象r在运行过程中呈现不同的行为特征,这就是所谓的“运行时多态”。,6.4 面向对象特性,6.4.3 多态性,方法重写原则 重写后的方法不能有更严格的访问权限限制; 重写后的方法不能产生更多的例外,避免出现应该捕获而未捕获的例外。 对象类型的确定:由于多个子类都可以作为父类对象使用,所以判断实例对象到底属于哪个子类可以用instanceof操作符来进行。 如: static void testInstance(A aObject) if (aObject instanceof B) System.out.println(“Bs instance“); if (aObject instanceof C) System.out.println(“Cs instance“); ,6.4 面向对象特性,6.4.4 其他,1、关键字final final修饰变量:符号常量 例如:final int MAX=100; final修饰方法:不能被子类重写 格式:final 返回类型 方法名(参数表) 例如:class A final int abc( ) class B extends A int abc( ) /出错 final修饰类:不能被继承 格式:final class 类名 final类:通常是一些用来完成标准功能的类, 如String类,6.4 面向对象特性,6.4.4 其他,2.实例成员与类成员 (1)实例方法与类方法 方法声明中用关键字static修饰的称为静态方法,又称类方法。 不用static修饰的称为实例方法。 区别: 1:类方法属于类的,是随着类被加载到内存,为类方法分配入口地址。 实例方法属于对象的,当该类创建对象后,类中的实例方法才分配入口地址。,6.4.4 其他,区别: 2:类方法只能处理类变量和调用类方法,不能处理实例变量和实例方法,反之,则可以。 3: 类方法中不能使用this或super。 4:可以用类的对象obj去调用静态的方法method(),如:obj.method()。,6.4.4 其他,(2)实例变量和类变量: 一般将修饰为static的变量称为“类变量”或“静态变量”,而把没有static修饰的变量称作“实例变量”。 类变量的定义格式:static 类型 变量名; 区别: 当把一个类加载到内存时,就为类变量分配内存,而只有实例化一个对象时才为实例变量分配内存。 类变量对于同一个类所有对象来说是一个公用变量;而实例变量对于不同对象来说是不同的,每个对象的实例变量的存取不影响其他对象。,6.4.4 其他,(3)举例:熟悉程序关于类变量和类方法的定义和使用。 例6.12 文件名memberTest.java,6.4 面向对象特性,6.4.4 其他,3、java.lang.Object类: 所有类的祖先类,它定义了一些最基本的对象属性和行为。 Object类中定义了很多方法,常用的有:toString()和equals() 。所有对象都可以使用这些方法,就与自己定义的一样。如果有必要,定义一个新类时常重写这两个方法。,6.4 面向对象特性,6.4.4 其他,java.lang.Object类: equals():判断两个对象是否为同一个实例对象。 使用方法1:直接用对象的equals()方法 例如: Object obj1,obj2; obj1=new Object(); obj2=obj1; System.out.println(obj1.equals(obj2); obj2=new Object(); System.out.println(obj1.equals(obj2); 运行结果: true false,6.4.4 其他,使用方法2:在类中可以重写equals()方法,用来判断对象”值“是否相等。 例如:在前面定义的Point类(书中50页,例6.5)中的equal方法,其作用是判断两个点是否为同一点。可以改用本方法实现(原参数为简单类型,改为类类型)。 public boolean equals(Point p) if(this.x=p.x) If(p.equal(p1) ,6.4.4 其他,equals()方法 注意:对简单数据类型进行封装的Boolean、Byte、Char、Short、Integer、Long、Float、Double以及String,Date,File类把equals方法重写为判断 值 是否相等。 例 class Test public static void main(String args) Integer one=new Integer(1); Integer anotherOne=new Integer(1); System.out.println(one.equals(anotherOne); 结果: true /书中结果为false,这可能是作者的笔误,6.4 面向对象特性,6.4.4 其他,java.lang.Object类: toString()方法 用来返回对象的字符串表示 通常在一个类中重写toString()方法。 JDK源码: public String toString() 例如:在类Point中添加重写toString()方法 public String toString() return “ (“+x+“, “+y+“) “; 并在适当位置调用该方法,例如: Point p=new Point(10,20); System.out.println(“this point is “+p.toString();,6.4 面向对象特性,返回,6.5 抽象类和接口,6.5.1 抽象方法和抽象类 抽象方法: 格式如下: abstract 类型 方法名(参数表); 在类中没有方法体的方法,就是抽象方法,抽象方法用关键字“abstract”修饰。,6.5 抽象类和接口,抽象类 格式: abstract class 类名 类体 特点: 类中包含了abstract方法的类必须声明是抽象类。抽象类不能产生任何的对象,即这种类不能被直接实例化。 如果一个子类没有实现抽象基类中所有的抽象方法,则子类也成为一个抽象类。在实际应用中,抽象类一定有它的子类,而子类通常不是抽象类。 我们可以将一个没有任何抽象方法的类声明为abstract,避免由这个类产生任何的对象。 抽象类的作用在于概括了某类事物的共同属性,在其子类中描述其子类的特殊之处。,6.5.1 抽象类,抽象类实例:二维形状类及其子类 所有二维几何形状都具有面积和周长特性,但是没有具体说明是哪种形状之前,我们无法确定面积和周长的计算公式。 因此,我们首先定义一个父类Shape,充当抽象的二维几何形状类,并在其中定义抽象的面积和周长方法,并在它的子类(如三角形、圆形)中编写具体的代码。 /所有二维几何形状的父类,定义为抽象类 abstract class Shape abstract double area(); /面积 abstract double perimeter(); /周长 ,6.5 抽象类和接口,6.5.1 抽象类,/第一个子类,方形类 class Rectangle extends Shape double width,height; Rectangle(double w,double h) width=w; height=h; double area() return width*height; double perimeter() return (width+height)*2; ,6.5 抽象类和接口,6.5.1 抽象类,/第二个子类,圆形类 class Circle extends Shape double radius; /半径 Circle(double r) radius=r; double area() return Math.PI * Math.pow(radius,2); double perimeter() return 2 * Math.PI * radius; ,6.5 抽象类和接口,6.5.2 接口,接口是一种特殊的、”纯“抽象类,它只包含常量赋值和方法定义,而没有任何方法的实现 . 接口的定义及使用 public interface 接口名 extends 父接口列表 类型 常量名=常量值; 返回类型 方法名(参数列表); 说明: 接口中的变量默认具有public、final、static修饰符。 接口中的方法默认具有public和abstract修饰符。 在子接口中定义与父接口同名的常量或相同的方法,则父接口中的常量被隐藏、方法被重写。,6.5 抽象类和接口,/Math.java interface Math double PI=3.1415926; class Arithmetic implements Math double roundArea(double radius) return PI*radius*radius; class Student public static void main(String args) Arithmetic a=new Arithmetic(); System.out.println(a.roundArea(

温馨提示

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

评论

0/150

提交评论