870 likes | 1k Views
第五章 Java 面向对象程序设计. §5.1 面向对象程序设计的基本概念 §5.2 对象 §5.3 类 §5.4 类的继承 §5.5 接口与包 §5.6 内部类 §5.7 java 类库. §5.1 面向对象程序设计的基本概念. 类与对象 状态:变量 现实世界的对象 OOP 的对象 行为 :方法 对象是面向对象的程序设计模式,它由描述状态 的变量和用来实现对象行为的方法组成。 对象的典型的生存周期:创建,使用,释放. §5.1 面向对象程序设计的基本概念.
E N D
第五章 Java面向对象程序设计 §5.1 面向对象程序设计的基本概念 §5.2 对象 §5.3 类 §5.4 类的继承 §5.5 接口与包 §5.6 内部类 §5.7 java类库
§5.1 面向对象程序设计的基本概念 • 类与对象 状态:变量 现实世界的对象 OOP的对象 行为 :方法 对象是面向对象的程序设计模式,它由描述状态 的变量和用来实现对象行为的方法组成。 对象的典型的生存周期:创建,使用,释放
§5.1 面向对象程序设计的基本概念 • 类与对象 类是一组具有相同基本成分的对象的集合,是用来 创建对象的模板。 类也是一种数据类型,用户先根据需要定义一种 类,然后才能用这种类来定义对象。而基本的数据类型 是由系统预先定义的,用户可以直接使用它们。 类的组成:类的声明{ 变量 构造器 类体 方法 }
§5.1 面向对象程序设计的基本概念 2. 消息与方法 程序的执行是靠在对象间传递消息来完成的。 一个由发送消息的对象发送的消息包含三个方面的内容; • 接收消息的对象 • 接收对象应采用的方法 • 方法所需用的参数 方法是该类对象具有的各种操作。
§5.1 面向对象程序设计的基本概念 3. 封装性,继承性,多态性 • 封装是一种信息隐藏技术,用户或其他对象只能看到对象封装界面上的信息,对象内部对用户是隐藏的。 • 继承是一个类直接使用另一个类的所有属性和方法(权限为私有的除外)。Java 采用单一继承的方式。 • 多态性可用“一个对外界面,多个内在实现形式”来表示。Java通过方法重载和方法重写以及接口来实现。
§5.2 对象 • 创建对象(生成对象) Rectangle myrect = new Rectangle(0,0,100,200); • 定义对象变量: 类名 对象名; • 分配内存: new运算符 • 初始化对象:即初始化对象中的实例变量。实例变量的初始化采用方式: • 采用默认的初始值 • 在声明变量时初始化 • 使用初始化块 • 使用构造方法(构造器) • 定义一个初始化方法
§5.2 对象 2.使用对象 例:移动Rectangle 对象到一个新位置。 • 访问对象的成员 • 引用对象变量:myrect.x = 15; • 调用对象的方法:Myrect.move(15,37); • 对象做类的成员 • 方法中使用对象:方法参数和返回值 • 数组元素 • 释放对象:自动垃圾回收(标记);finalize()
§5.3 类 • 类是java中一种复合的数据类型,创建一个新类,就是创建一种新的数据类型。 • 实例化一个类,就得到一个对象。 • 类有两种基本成分:变量和方法,成为成员变量和成员方法。 • 类的成员变量可以是基本数据类型的数据或数组或类的实例。 • 方法在类中定义,调用方法是完成消息传递。 • 类提供外界访问其成员的权限。
§5.3 类—类的定义 classDeclaration{ classbody } • 类说明 • 关键字class • 类名 • 类的属性 • 类的超类 • 类中实现的接口 • 类是否为抽象的,最终的,以及访问权限
§5.3 类—类的定义 • 类体 • 成员变量说明 • 成员方法的定义和实现
§5.3 类—类的定义:类说明 类说明的完整格式: [类修饰符] class 新类名 [extends 超类名] [implement 接口名列表] 访问权限+抽象最终 最终类:不能再有子类的类 (final) 抽象类:不能直接创建对象的类 (abstract) public:可以被任何类使用 缺省:该类只能被同一包中的其它类使用
§5.3 类—类的定义:类体 类体的完整格式: 类说明{ 类的成员变量说明; 类的成员方法的定义和实现; } [成员变量修饰符] 类型 变量[=初始值][,变量]; 变量的访问权限:public,protected,default, private 类变量还是实例变量:static 是否为常量:final 暂时性变量:transient
§5.3 类—类的定义:类体 共享变量(多个线程共享):volatile [访问权限][类变量][常量][transient][volatile] 类型 变量/常量 [=初始值][,变量];
§5.3 类—成员方法 [方法修饰符] 方法的返回值类型 方法名称([参数1,参数2 …]){ …//方法体 } 一﹑方法说明 二﹑ 方法体 三﹑特殊方法
§5.3 类—成员方法:方法说明 方法说明: [public|protected|private][static][final|abstract][native][synchronized] returnType methodName([type name[,type name…]])[throw exceptionlist] • 方法的修饰符 • 返回值类型 • 方法名 • 参数的类型和数目
§5.3 类—类变量和类方法的定义使用 class Ahem{ int i; static int j: static int arr[]=new int[12]; static{ for (int i=0;i<arr.lenth;i++) arr[i]=i; } void seti(int i){ this.i=i; } static void setj(int j){ Ahem.j=j; }
§5.3 类—类变量和类方法的定义使用 static void dearThroat(){ Ahem a=new Ahem(); Ahem.j=2; a.j=3; Ahem.setj(4); a.setj(5); a.i=3; a.seti(3); } }
§5.3 类—方法说明:返回值类型 • 方法没有返回值,则其返回值类型为void • 返回值可以是任一种数据类型: 基本类型和复合类型 • 除了void外,方法中必须包含return语句
§5.3 类—方法说明:方法名 • Java的合法标识符 • 方法名的几种特殊情况 • 方法重载: 即多个方法可以共用一个名字,同名的方法利用参数的数目和类型来区分 • 方法的置换(重写): 子类中可以再实现超类中的方法 • 方法名与类名相同的方法是构造方法,与NEW一起初始化对象
§5.3 类—方法说明:参数的类型和数目 • 参数名 • 方法的参数名可以和类的成员变量同名 • Class circle{int x,y,radius; public circle(int x,int y,int radius){ this.x=x; this.y=y; this.radius=radius;}} • 参数类型 • 任何合法的数据类型传递到方法中 • 不能将一个方法作为参数传给另一个方法
§5.3 类—方法说明:参数的类型和数目 • 传值与传地址(引用) • 在方法中,简单数据类型的参数是传值的,而不是引用变量本身。好处是带来一定的安全性,使方法不能随意改变作用域外的变量。缺点是:有时需要改变一个或多个参数的值,用return也只能返回一个值。 • 所以必须引用对象。因为对象的引用是对象在内存中的地址,从而使方法中的局部变量与调用者中的变量指向了同一个内存位置。
§5.3 类—方法说明:传值 方法段: class pen{ int redvalue=2,geenvalue=2,bluevalue=2; static void getRGBcolor(int red,int green, int blue){ red=redvalue; green=greenvalue; blue=bluevalue; } }
§5.3 类—方法说明:传值 调用代码段: int r=-1,g=-1,b=-1; pen.getRGBcolor(r,g,b); System.out.println(“red=”+r+ “, green= ”+g+ “,blue= ”+b);
class pen{ int redvalue=2,geenvalue=2,bluevalue=2; static void getRGBcolor(int red,int green, int blue){ red=redvalue; green=greenvalue; blue=bluevalue; } } int r=-1,g=-1,b=-1; pen.getRGBcolor(r,g,b); System.out.println(“red=”+r+ “, green= ”+g+ “,blue= ”+b);
§5.3 类—方法说明:传地址 方法段: class pen{ int redvalue=2,geenvalue=2,bluevalue=2; static void getRGBcolor(RGBcolor acolor){ acolor.red=redvalue; acolor.green=greenvalue; acolor.blue=bluevalue;}} class RGBcolor{ public int red=-1,green=-1, blue=-1; }
§5.3 类—方法说明:传地址 调用代码段: RGBcolor pencolor=new RGBcolor(); pen.getRGBcolor(pencolor); System.out.println(“red=”+pencolor.red+ “, green= ”+pencolor.green+ “,blue= ”+pencolor.blue);
class pen{ int redvalue=2,geenvalue=2,bluevalue=2; static void getRGBcolor(RGBcolor acolor){ acolor.red=redvalue; acolor.green=greenvalue; acolor.blue=bluevalue; } } class RGBcolor{ public int red=-1,green=-1,blue=-1;} RGBcolor pencolor=new RGBcolor(); pen.getRGBcolor(pencolor); System.out.println(“red=”+pencolor.red+ “, green= ”+pencolor.green+“,blue= ”+pencolor.blue);
§5.3 类—成员方法:方法体 方法体中包含所有JAVA代码 两个特殊变量(类方法中不能使用) this:指向当前的对象 类的成员变量名 方法的参数名 同名 清楚 方法的局部变量 super:超类中的变量和方法 子类成员变量和方法 同名,隐藏超类中 超类成员变量和方法 this super
§5.3 类—特殊方法 结束方法 为了有效的进行垃圾收集而引入的一个特殊方法(必要时辅助工作)。 protected void finalize(){ } main方法 public static void main(String args[]){…} 构造方法
§5.3 类—特殊方法 构造方法是用来初始化新创建对象的特殊方法。 构造方法没有自己独立的名字,与类名相同。 构造方法不能从超类中继承(若没定义构造方法,则隐含构造方法是超类中没有参数的构造方法,没有则出错) 必须和new一起使用 修饰符只能是访问控制指示符(public、protected、private)
§5.3 类—特殊方法 方法说明(如java.awt.Rectangle类) public Rectangle() public Rectangle(int,int) public Rectangle(int,int,int,int) public Rectangle(PointObject) public Rectangle(DimensionObject) public Rectangle(PointObject, DimensionObject)
§5.3 类—特殊方法 方法体 {[this([Argumentlist]);] [super([Argumentlist]);] Blockbody }
程序示例 • 自定义方法 • 方法重载 • 类的定义
例1:自定义方法(平方) // SquareInt.java import java.applet.Applet; public class SquareInt extends Applet { public void init(){ int result; for ( int x = 1; x <= 10; x++ ) { result = square( x ); System.out.println("The square of " + x + " is " + result); } } public int square( int y ) { return y * y } }
例2:方法重载(平方) // MethodOverload.java import java.applet.Applet; public class SquareInt extends Applet { public void init(){ int result; for ( int x = 1; x <= 10; x++ ) { result = square( x ); System.out.println("The square of " + x + " is " + result); } }
例2:方法重载 public int square( int y ) { return y * y } public double square( double y ) { return y * y; } }
例3:类的定义(圆) // Circle.java public class Circle{ protected int x, y; protected double radius; public Circle() { setRadius( 0.0 ); } public Circle( double r, int a, int b ) { setA( a ) ; setB( b ) ; setRadius( r ); } public void setA( int a ) { x = a; }
例3:类的定义(圆) public void setB( int b ) { y = b ; } public void setRadius( double r ) { radius = r; } public int getA() { return x; } public int getB() { return y; } public double getRadius() { return radius; } public double area() { return Math.PI * radius * radius; } }
§5.4 类的继承 派生 超类 子类 继承 • 子类 可直接使用超类中定义的变量和方法,具体的继承情况依赖于访问权限 • 子类可重新定义超类的变量和方法 • 变量的隐藏 • 方法的置换 • 子类可增加超类中没有的 • 变量和方法;
§5.4 类的继承 • 最终类、最终方法、抽象类、抽象方法 • 编译时多态(方法重载),运行时多态(方法重 写, instanceof) • 简单数据类型转换(自动和强制) • 类引用类型 • 自动:将一个子类对象赋给一个父类对象 • 强制(造型):将一个父类对象赋给一个子类对象
§5.4 类的继承示例:点,圆 // Point.java public class Point { protected int x, y; public Point() { setPoint( 0, 0 ); } public Point( int a, int b ) { setPoint( a, b ); } public void setPoint( int a, int b ) { x = a; y = b; }
§5.4 类的继承示例:点,圆 public int getX() { return x; } public int getY() { return y; } public String toString() { return "[" + x + ", " + y + "]"; } }
§5.4 类的继承示例:点,圆 // Circle.java public class Circle extends Point { protected double radius; public Circle() { setRadius( 0 ); } public Circle( double r, int a, int b ) { super( a, b ); setRadius( r ); } public void setRadius( double r ) { radius = ( r >= 0.0 ? r : 0.0 ); }
§5.4 类的继承示例:点,圆 public double getRadius() { return radius; } public double area() { return Math.PI * radius * radius; } public String toString() {return "Center = " + "[" + x + ", " + y + "]" +"; Radius = " + radius; } }
§5.4 类的继承示例:点,圆 // InheritanceTest.java import java.text.DecimalFormat; public class InheritanceTest { public static void main( String args[] ) { Point pointRef, p; Circle circleRef, c; p = new Point( 30, 50 ); c = new Circle( 2.7, 120, 89 ); System.out.println("Point p: " + p.toString() + "\nCircle c: " + c.toString());
§5.4 类的继承示例:点,圆 pointRef = c; System.out.println("\n\nCircle c (via pointRef): " + pointRef.toString()); circleRef = (Circle) pointRef; System.out.println("\n\nCircle c (via circleRef): " + circleRef.toString()); DecimalFormat precision2 = new DecimalFormat( "0.00" ); System.out.println("\nArea of c (via circleRef): " + precision2.format( circleRef.area() ) );
§5.4 类的继承示例:点,圆 if ( p instanceof Circle ) { circleRef = (Circle) p; System.out.println(\n\ncast successful); } else System.out.println(\n\np does not refer to a Circle) ; } }
§5.5 接口与包 • 接口的概念 是一组方法定义和常量的集合。若想为几个类创建一些类似功能,而这些功能在每一个类中都还有特定的实现时,就可以使用接口。(Runnable接口)
§5.5 接口与包 • 声明接口 [public] interface InterfaceName [extends 接口列表] 大写字母开头,以able,ible结尾 • 接口体 interface Countable{ 常量说明;//public\final\static 方法定义;//public\abstract } • 实现接口(implements)
基本的继承实例 // Shape.java // Definition of abstract base class Shape public abstract class Shape { public double area() { return 0.0; } public double volume() { return 0.0; } public abstract String getName(); }