第6章 对象和类.

Slides:



Advertisements
Similar presentations
第五章 类的继承和派生 Inheritance/extends/derive. 教学目标 理解继承的概念和作用 派生类的定义 理解访问修饰符 protected 方法的重写 继承下的构造函数的使用 继承下的 finalize 方法的使用 理解超类和子类的关系.
Advertisements

第一章 Java 程序设计技术 概述  什么是 Java 语言  一个简单的 Java 程序  程序的编译和运行  常见错误  使用 Java 核心 API 文档.
系統分析與設計 楊子青 H-1 H 、物件導向技術 n 物件導向的基本概念 – 物件、類別 – 封裝、繼承 – 同名異式 ( 多型 ) 、超荷 ( 過載 ) n 物件導向分析與設計及塑模工具 n UML 塑模工具.
单元二:面向对象程序设计 任务二:借书卡程序设计.
第四章 类、对象和接口.
第三讲 面向对象(上).
3.2 Java的类 Java 类库的概念 语言规则——程序的书写规范 Java语言 类库——已有的有特定功能的Java程序模块
JAVA 编 程 技 术 主编 贾振华 2010年1月.
第 9 章 物件的建構.
6. 6 Overloading methods and constructors 6
项目6 通用堆栈.
面向对象的程序设计(一).
第一章 面向对象程序设计.
设计模式可以帮助我们改善系统的设计,增强 系统的健壮性、可扩展性,为以后铺平道路。
第二章 JAVA语言基础.
類別與物件 Class & Object.
Ch07 介面與多重繼承 物件導向程式設計(II).
JAVA程序设计 (03) JAVA Programming
1 Department of Computing.
第5章 Java中类、对象、接口 及包的概念 5.1 类的基本概念 5.2 类的继承概念 5.3 抽象类和接口 5.4 包.
Ch02 視窗Swing套件 物件導向系統實務.
第5章 面向对象程序设计 本章要点 5.1 面向对象程序设计概述 5.2 Java语言的面向对象程序设计 5.3 方法的使用和对象数组
H、物件導向技術 物件導向的基本概念 物件、類別 封裝、繼承 同名異式(多型) 、超荷(過載) 物件導向分析與設計及塑模工具 UML塑模工具.
物件導向程式設計 (Object-Oriented rogramming)
Classes Lecturer: 曾學文.
CHAPTER 9 建構方法 ROBERT.
程序與函數的類別方法 目的:模組化程式設計 方法:由上而下設計 注意事項:(1)獨立性 (2)結合問題 (3)子問題間的溝通.
第六章 类的扩展与继承.
程式敘述執行順序的轉移 控制與重複、方法 Lecturer:曾學文.
程式設計實作.
CH09 套件 物件導向程式設計(II).
Java软件设计基础 5. 继承与多态.
Java程序设计 第9章 继承和多态.
软件建模与UML.
類別的繼承 Vehicle Car.
SPOTO TM JAVA课程 JAVA中的OO语法
中国矿大计算机学院杨东平 第5章 接口和包 中国矿大计算机学院杨东平
辅导课程九.
3.1 数据类型 3.2 标识符与关键字 3.3 常量 3.4 变量 3.5 运算符与表达式 3.6 一个编程实例
2019/1/16 Java语言程序设计-类与对象 教师:段鹏飞.
Java程序设计 第2章 基本数据类型及操作.
第5讲 使用类和对象编程(三) 内部类 实例 程序控制结构 选择语句.
Java程序设计 第7章 对象和类.
Ch02-基礎語法.
C/C++/Java 哪些值不是头等程序对象
$10 可空类型.
第16章 虛擬與多形 16-1 虛擬函數 16-2 純虛擬函數與抽象類別 16-3 多形 16-4 虛擬繼承與虛擬解構子.
第二章Java基本程序设计.
第二章 Java基本语法 讲师:复凡.
C#程序设计基础 $3 成员、变量和常量.
CH10. 屬性與方法.
第二章 Java基本语法 讲师:复凡.
Java程式初體驗大綱 大綱 在學程式之前及本書常用名詞解釋 Hello Java!程式 在Dos下編譯、執行程式
Interfaces and Packages
第三章 数据抽象.
Object-Oriented Programming in C++ 第二章 类和对象
第二章 Java语法基础.
C++语言程序设计 C++语言程序设计 第十章 多态 第十一组 C++语言程序设计.
第二章 Java基本语法 讲师:复凡.
Review 1~3.
第二章 Java基本语法 讲师:复凡.
方法進階及物件導向基礎 Lecturer: 楊昌樺.
C++语言程序设计 C++语言程序设计 第八章 继承 C++语言程序设计.
JAVA 程式設計與資料結構 第三章 物件的設計.
第2章 Java语言基础.
第4讲 类和对象、异常处理 ggao.
對於成員(member)存取權的限制 成員的資料被毫無限制的存取,任誰都可以指定任意值給成員,Java語言為了防止這種現象的產生,規定:有一種成員的資料不能任由類別外部的任何人隨意存取。
第二章 Java基础语法 北京传智播客教育
第6章 继承和多态 伍孝金
Summary
Presentation transcript:

第6章 对象和类

学习目标 理解对象和类以及它们之间的关系 掌握如何定义类并创建类的对象 了解类和对象的UML表示 理解构造函数的作用 理解对象引用,掌握如何向方法传递对象引用 掌握getter、setter方法,掌握this的含义和使用 理解实例变量和方法,静态变量、常量和方法 理解类中变量的作用域 使用对象作为数组元素 掌握package和import语句

面向对象的程序 C语言的面向过程的语言。面向过程的核心: Java语言是面向对象的语言。面对对象的核心: 数据结构 算法 数据加工 封装 继承 多态 对象协作

类和对象 对象(object)表示现实世界中可以明确识别的实体。例如,学生、圆、按钮等。对象具有状态和行为。 类(class)定义了同一类对象共有的属性和方法。 类是对象的模板、蓝图。对象是类的实例。 学习 姓名:张三 行为 (方法) 状态 (变量) 工作 学号:0001 身高:1.73 娱乐

示例 下面是一个圆类: class Circle { double radius = 1.0; Circle() { } Circle(double r) { radius = r; double findArea() { return radius * radius * 3.14159; } } 数据字段 构造函数 方法

类和对象的UML表示 类的UML表示 类名 数据字段 构造函数 方法 对象的UML表示 对象名:类名 数据字段值

构造函数 构造函数(constructor)是一段初始化代码,在new操作符返回新创建对象引用之前,在实例变量被赋予默认初值,并显示初始化之后执行。 语法 constructorDeclaration : modifieropt className (parameterList) { statementsopt } 如果类未定义任何类型的构造函数,编译器会自动提供一个不带参数的构造函数。如果已存在带参数的构造函数,则不会提供不带参数的构造函数。

创建对象 使用new操作符创建对象。 Java虚拟机为新创建的对象分配内存空间,并返回对象的引用。 语法: new ClassName(actualParameterListopt); 例如: new Circle(); //调用无参构造函数 new Circle(5); //调用带有一个参数的构造函数 Java虚拟机为新创建的对象分配内存空间,并返回对象的引用。

引用变量 对象通过引用变量(reference variable)进行访问,引用变量存放的是对象的引用。 声明 引用对象 ClassName objectRefVar; 例如: Circle myCircle; 引用对象 objectRefVar = new ClassName(); myCircle = new Circle();

在一条语句中声明变量和创建对象 合并为一句 ClassName objectReference = new ClassName(); 例如: Circle myCircle = new Circle(); 2.创建对象,返回对象的引用 3.将对象的引用赋值给变量myCircle 1.声明变量,变量类型为Circle,变量名为myCircle

访问对象的实例变量和实例方法 访问对象的实例变量 调用对象的实例方法 objectRefVar.data 例如: myCircle.radius访问对象的radius数据字段 调用对象的实例方法 objectRefVar.method(arguments) myCircle.findArea()调用对象的findArea方法

例6.1 声明类并创建对象 编写程序,定义Circle类,创建Circle对象。 创建一个半径为5的圆。 创建一个半径为1的圆。 显示两个圆的半径和面积。 将第二个圆的半径改为100,显示其半径和面积。 Example:v1/TestCircle.java, v1/Circle.java

基本类型变量和引用类型变量的区别 每个变量表示存储数据的内存单元。 基本类型变量存储的是基本类型的值。 引用类型变量存储的是对象的引用。当变量未引用任何对象时,它是值为null。 基本类型 int i = 1; 引用类型 Circle c = new Circle(); i 1 c 对象的引用

赋值的区别 当进行变量赋值时 基本类型变量赋值时,变量的实际值赋值给另一个变量。 引用类型变量赋值时,对象的引用赋值给另一个变量。 基本类型 i c1 1 对象的引用 赋值前 c2 j 对象的引用 2 不再被引用的对象,将被运行时系统自动回收 i = j; c1 = c2; i c1 2 对象的引用 赋值后 j c2 2 对象的引用

例6.2 使用Java类库中的类 使用javax.swing程序包中的JFrame类创建两个窗体。设置窗体的标题、大小和位置,并显示。 Example:TestFrame.java

类成员访问控制符 类中代码可以访问自身的所有成员。 其它类中的代码访问成员,受访问控制符的限制: private 只能当前类自身可以访问。 package 声明时不带访问修饰符的成员,只有相同包中的代码可以访问。 protected 子类、同一包中的类可以访问。 public 所有其它类都可以访问。 访问控制是在类的层次上进行的,而不是在每个对象上。

Getter和Setter方法 通常为私有(private)域提供Getter和Setter方法。 如果域为datetype propertyName Getter方法用于获取域的值,通常有以下形式的签名: public datatype getPropertyName() Setter方法用于设置域的值,通常有以下形式的签名: public void setPropertyName(datatype value) Example:v2/TestCircle.java, v2/Circle.java

将对象传递给方法 与传递数组一样,传递对象实际是传递对象的引用。 基本数据类型传递的是实际值的拷贝,修改形参,不影响实参。 引用类型变量传递的是对象的引用,通过形参修改对象,将改变实参引用的对象。 实参 : 1 形参 : 1 copy 基本类型 实参 : ref 形参 : ref copy object 引用类型 Example:v2/TestPassObject.java

静态变量 实例变量(instance variable)属于类的具体实例,不能在相同类的实例间共享。 静态变量(static variable)是用static修饰的变量,在一个类的所有实例间共享,也称类变量。 静态变量可以通过类名引用。 1 5 2 radius numberOfObject 表示private + 表示public 下划线 表示static

静态常量 静态常量是用static final修饰的变量。例如,Math类中的常量PI定义为: public static final double PI = 3.14159265358979323846;

静态方法 静态方法(static method)是用static修饰的方法。例如: 静态方法可以通过类名引用。 main JOptionPane.showMessageDialog JOptionPane.showInputDialog Math.random 静态方法可以通过类名引用。 静态方法只能访问类的静态方法和静态变量,不能访问类中的实例变量。

例6.3 使用实例、静态的变量和方法 为v2.Circle添加一个静态变量,保存创建Circle对象的数量。 在main方法中创建circle1和circle2两个对象。 修改实例和静态变量,并查看修改的结果。 Example:v3/TestCircle.java, v3/Circle.java

变量的作用域 成员变量(实例变量和静态变量)的作用域是整个类,与声明的位置无关。 如果一个变量的初始化依赖于另一个变量,则另一个变量必须在前面声明 例如: public class Foo { int i; int j = i + 1; } 如果一个局部变量具有与类中的变量相同的名称,那么局部变量优先,成员变量被隐藏。

this关键字 在实例方法中,实例变量被局部变量或方法参数隐藏,可以通过this.instanceVariable引用实例变量。this表示当前对象。 调用当前类的其它构造函数。 Example:v4/TestCircle.java, v4/Circle.java

对象数组 与基本数据类型一样,可以声明并创建对象数组。 当创建对象数组时,数组元素的缺省初值为null。 Circle[] circleArray = new Circle[10]; for(int i = 0; i < circleArray.length; i++) { circleArray[i] = new Circle(); } 当创建对象数组时,数组元素的缺省初值为null。 circleArray circleArray[0] Circle对象0 数组的引用 circleArray[1] Circle对象1 … … circleArray[9] Circle对象9

例6.7 汇总圆的面积 编写程序,将一个Circle数组的面积相加。 程序创建由10个Circle对象组成的数组 然后以随机数初始化圆的半径 显示数组中所有圆的总面积 Example:v4/TotalArea.java

例6.9 使用Loan类 编写程序,实现一个下面的类并测试。 Example:Loan.java, TestLoanClass.java 年利率,缺省值为2.5 贷款年数,缺省值为1 贷款金额,缺省值为1000 贷款日期 构建缺省的Loan对象 使用给定的值,构建Loan对象 获取年利率 获取贷款年数 获取贷款金额 获取贷款日期 设置年利率 设置贷款年数 设置贷款金额 设置贷款日期 计算月还款额 计算年还款额 Example:Loan.java, TestLoanClass.java

例6.10 整数栈 编写程序,实现整数栈的数据结构。 capacity-1 … 85 10 21 size-1 1 栈顶 42 Example:StackOfIntegers.java, TestStackOfIntegers.java

包 包(package)是相关类和接口的集合,它可以提供访问保护和名称空间管理。 语法 组织功能:将相关的类和接口组织在一起,便于识别和管理 防止命名冲突:不同包中的相同命名,不会产生冲突 访问控制:控制包间的类型的可访问性 语法 package packagename; package语句必须位于源文件的第一条语句,源文件中定义的所有类和接口都属于指定的包。如果没有使用package语句,那么类和接口被放在缺省包(default package)中,缺省包是一个没有名称的包。

包的命名 使用组织的internet域名的反序形式命名包。一个组织内部发生的命名冲突需要由组织内部的约定来处理,通常在组织名称后面包含项目名称。 组织 北京师范大学信息技术与软件工程学院 域名 www.bnuitse.com 包名 com.bnuitse.put com.bnuitse.put.model com.bnuitse.put.view 组织 World Wide Web Consortium 域名 www.w3c.org 包名 org.w3c.dom org.w3c.dom.bootstrap org.w3c.dom.events 组织 The Apache Software Foundation 域名 www.apache.org 包名 org.apache.tools.ant org.apache.tools.ant.helper org.apache.catalina org.apache.catalina.core

引用包成员 用简单名称引用包成员。 Rectangle myRect = new Rectangle(); 用完全限定名称引用包成员 代码与要使用的成员位于相同的包 成员所属的包已经被导入 Rectangle myRect = new Rectangle(); 用完全限定名称引用包成员 使用另一个包中的成员,而且此包未被导入 导入多个包时,出现命名冲突 graphics.Rectangle myRect = new graphics.Rectangle();

导入包成员 将特定成员导入到当前文件中,在文件开始处,类和接口定义之前,package语句之后,加入import语句。 // Painter.java package graphics.app; import graphics.Rectangle; import graphics.Circle; public class Painter { Rectangle myRect = new Rectangle(); Circle myCircle = new Circle(); … }

导入整个包 要导入某个包中的所有的类和接口,应使用具有通配符(*)的import语句。 package graphics.app; // Painter.java package graphics.app; import graphics.*; public class Painter { Rectangle myRect = new Rectangle(); Circle myCircle = new Circle(); … }

静态导入语句 语法 导入类型中的静态成员 import static TypeName.Identifier; Example:StaticImportTest.java, StaticImportOnDemandTest.java

类型查找顺序 当前类型 显式导入的类型 同一包中的其它类型 隐式导入的类型 java.lang Example:graphics/*.java

包的访问 包中顶级类和接口的可访问性 用public修饰的类和接口对包外代码可见 没有用public修饰的类和接口只对包内代码可见