370 likes | 676 Views
沈傲东 东南大学影像科学与技术实验室. JAVA 面向对象程序设计. 对象和类. 类与对象的 JAVA 基础 JAVA 面向对象特性 重载 【Overload】 覆盖 【Override】 继承 / 扩展 【Inherit/Extend】 UML 表示. 类和对象. 实物. 分类. 能吃的. 吃好的. 能坐的. 坐好的. 对象 --- 类. 最好用的. 能穿的. 最好用不完的. 穿好的. 类是具有 共同属性和行为 的对象的 抽象 。 类可以定义为 数据和方法 的集合。 类也称为模板,因为它们提供了对象的基本框架。.
E N D
沈傲东 东南大学影像科学与技术实验室 JAVA面向对象程序设计
对象和类 • 类与对象的JAVA基础 • JAVA面向对象特性 • 重载【Overload】 • 覆盖【Override】 • 继承/扩展【Inherit/Extend】 • UML表示
类和对象 实物 分类 能吃的 吃好的 能坐的 坐好的 对象---类 最好用的 能穿的 最好用不完的 穿好的
类是具有共同属性和行为的对象的抽象。 类可以定义为数据和方法的集合。 类也称为模板,因为它们提供了对象的基本框架。 封装的实体=数据+方法 数据或变量 类 方法 实例化 抽象 属性或状态 对象 操作或行为
在类中,属性是通过成员变量体现的,而操作是用成员函数(又称为方法)实现的。在类中,属性是通过成员变量体现的,而操作是用成员函数(又称为方法)实现的。 创建类 class name { type variable1; … type variableN; type methodname1(parameter-list){ //方法体 } … type methodnameN(parameter-list){ //方法体 } } Java中定义类的通用格式: 成员变量(对象属性) 成员方法 (对象行为或操作)
发往某个对象的消息对应于一个方法调用。作为对消息的响应,对象将执行一个类似于过程体的方法。方法是包含在类中的函数。发往某个对象的消息对应于一个方法调用。作为对消息的响应,对象将执行一个类似于过程体的方法。方法是包含在类中的函数。 方法名称 修饰符,可选 返回类型 参数列表,可选 定义方法 • 定义方法的一般格式: [access] type methodname1([parameter-list]){ //方法体 } • 举例: • public void setBirthday(intday, int month, int year){ • day=23; month=7; year=2003; • }
JAVA类设计 • 形式 • 主类(含有main函数的类) • 非主类 • 构成 • 访问权限、类名、类体 • 允许内部类、匿名类 • 与字节码文件(一一对应) • 与源文件的关系(*.java) • 源文件可以包含多个类 • 源文件中至多有一个public类 • 源文件名要与public类名相同 • 一个源文件中尽量只定义一个类 • 所有类都应处于包中 DEMO
构造函数 • 构造函数名称与类名称相同 • 构造函数没有返回类型 • 其任务是在创建对象时初始化其内部状态 class Fruit { booleanseedLess; boolean seasonal; float price; Fruit(boolean seed, boolean season, float p) { seedLess = seed; seasonal = season; price = p; } }
关键字 this 与对象关联 • 它用于指示当前对象 this引用 public class PassTest { int x; PassTest(int x) { this.x=x; } public void passingValue(){ System.out.println(“x 等于" +x); } public static void main(String args[]) { PassTest test = new PassTest(10); test.passingValue(); } } 指明此对象的变量 x 应赋值为通过构造函数传递的自变量 x 的值。
public 声明的数据成员和成员函数可从类外部的任何地方访问。 而private 数据将被隐藏,在类外不可见,这就实现了数据封装的思想。 要从类外操纵private 成员,只能通过类的public或protected成员来实现。 访问修饰符
类的修饰符 • 内部类与外部类 class Outer{ class Inner{ } } • 修饰内部类 • protected • private • static
当对象作为函数参数时,在函数中只能改变该对象的状态,但不能改变该对象的引用当对象作为函数参数时,在函数中只能改变该对象的状态,但不能改变该对象的引用 obj1 obj2 x x y y Day Day 2003,7,23 2002,5,30 对象作为参数 class Test{ int a,b; Test(int i,int j) { a=i; b=j; } //可以在函数中改变对象状态 void change(Test obj) { obj.a=50; obj.b=40; } } void swapobj(Day x,Day y){ Day temp=y; y=x; x=temp; } 引用本身 按值传递 改变对象状态 调用swapobj(obj1,obj2)
类与对象的JAVA基础 JAVA面向对象特性 重载 覆盖 继承 UML表示 对象和类
聚合 封装 继承 多态 面向对象特性 Encapsulation 融合数据和代码 “是一个”is a “有一个”Has a Polymorphism 高度抽象到一般抽象 同一行为的不同表现 Inheritance 构建类系,实现抽象 Aggregation 功能复用,部分组合
继承是面向对象编程技术的一块基石,它允许创建分等级层次的类。运用继承,可以创建一个通用类定义一系列一般特性。该类可以被更具体的类继承继承是面向对象编程技术的一块基石,它允许创建分等级层次的类。运用继承,可以创建一个通用类定义一系列一般特性。该类可以被更具体的类继承 Emoloyee类: name sex Officer类: empClass vehicle Worker类: category dressAllowance 继承 • 被继承的类称为超类 • 继承父类的类称为子类 • 执行继承时,子类将获得父类的属性,并具有自身特有的属性。 职员类,具 有姓名和性 别两个属性 工人类,继承了父 类的姓名和性别属 性外还包含类别和 是否有服装津贴属性 主任类,还包含 级别和是否配备 交通工具属性
extends关键字 • extends关键字用于继承类。 • 声明一个继承父类的类的通常形式如下: class SubclassNameextends SuperclassName { //类体 } • 没有extends,默认父类为Object • 只能有一个父类,即单继承 • 子类继承父类的全部成员 注意
super关键字 • super关键字用来解决如何直接访问或初始化从父类继承来的属性。 • super有两种通用形式:调用父类的构造函数、用来访问被子类的成员覆盖的父类成员。 • 它用在对象的构造函数中,将构造细节通过继承链往上传递。 • super()必须是在子类构造函数中的第一个执行语句。
继承示例 class Employee { String name; //姓名 char sex; //性别 Employee(String n, char s){ name = n; sex = s; } public String getName() { return name; } public char getSex(){ return sex;}} class InheDemo { public static void main(String args[]) { Worker w = new Worker("M.John",'M','B',true); System.out.println("工人信息"); System.out.println("姓名: "+w.getName()); System.out.println("性别:"+w.getSex()); System.out.println("类别: "+w.getCategory()); if(w.getAll()) System.out.println("提供服装津贴"); else System.out.println(“未提供服装津贴”); } } class Worker extends Employee { char category;//类别 boolean dressAllowance; //是否提供服装津贴 Worker(String n,char s,char c,boolean d){ super(n,s); category = c; dressAllowance = d; } public char getCategory(){return category;} public boolean getAll(){ return dressAllowance; } }
方法覆盖(override) • 方法覆盖是Java实现多态性机制的另一种方式。 • 在类层次结构中,如果子类中的一个方法与父类中的方法有相同的方法名并具有相同数量和类型的参数列表,这种情况称为方法覆盖。 • 当一个覆盖方法通过父类引用被调用,Java根据当前被引用对象的类型来决定执行哪个版本的方法。 • 可以通过super关键字调用直属父类中被覆盖的方法版本。
方法覆盖示例 class SuperClass { int a; SuperClass(){ a = 10; } public void printA(){System.out.println("父类中a ="+a);} } class SubClass extends SuperClass { int a; SubClass(int a){ this.a = a; } public void printA(){ System.out.println("子类中a = "+a); } } public class OverrideDemo { public static void main(String args[]) { SuperClass s1 = new SubClass(10); s1.printA(); } } 将调用子类的printA方法
方法重载(overloading) • 方法重载是Java实现面向对象的多态性机制的一种方式。 • 同一个类中多个方法有相同的名字,不同的参数列表,这种情况称为方法重载。 • 返回类型不同并不足以构成方法重载。 • 当重载方法被调用时,编译器根据参数的类型和数量来确定实际调用哪个重载方法的版本。
方法重载示例 class Calculation { public void add( int a, int b) { int c = a + b; System.out.println("两个整数相加得 "+ c); } public void add( float a, float b){ float c = a + b; System.out.println("两个浮点数相加得"+c); } public void add( String a, String b) { String c = a + b; System.out.println("两个字符串相加得 "+ c); } } class CalculationDemo { public static void main(String args[]) { Calculation c = new Calculation(); c.add(10,20); c.add(40.0F, 35.65F); c.add("早上", "好"); } } 编译器决定调用版本
重载构造函数 • Java 为每一个类自动提供缺省构造函数 • 缺省构造函数将成员变量的值初始化为缺省值 • 一旦创建了自己的构造函数,缺省的构造函数将不复存在。 • 重载构造函数提供了一组创建对象的方式,可以根据需要决定是否带初始参数。 public class constructOverload { int x; constructOverload() { x=0; System.out.println("不带参数的构造函数"); } constructOverload(int x){ this.x=x; System.out.println("带一个参数的构造函数"); } }
多态性 • 静态(编译时) • 方法重载 • 同一类中 • 动态(运行时) • 方法覆盖 • 层次类中 • 接口 • 抽象类 • 抽象方法等 取经人 void 除妖();
类与对象的JAVA基础 JAVA面向对象特性 重载 覆盖 继承 UML表示 对象和类
UML 简介 • 统一建模语言UML(Unified Modeling Language)是一种绘制软件蓝图的标准语言。 • 可以用UML对软件密集型系统进行可视化、详述、构造和文档化。 • 从企业信息系统到基于Web的分布式应用,甚至严格的实时嵌入式系统都适合于用UML来建模。 • 它是一种富有表达力的语言,可以描述开发所需要的各种视图,然后以此为基础开发系统。
UML的特点 标准统一 面向对象 概念清晰 简单易用 独立于过程 http://www.uml.org http://www.uml.org.cn
类 属性 操作 依赖 构件名 泛化 关联 聚集 (关联的一种形式) 用例名 模型元素
类HelloWorld 第一行表示类名 第二行为空,因为该类中不需要属性 第三行由类包含的操作或方法构成
Applet Graphics 类的关系 泛化关系 依赖关系
applet awt lang 用包来组织类 包被表示为带有标签的文件夹 java HelloWorld 有向的虚线段描述了对象与包之间的依赖关系
HelloWorld.java Hello.html Hello.jpg HelloWorld.class HelloWorld.java的构件图
作业 • 构建动物、猫、老虎的类系结构 • 使用UML和代码分别表示