第四章 对象与类 掌握面向对象程序设计语言的特点 理解对象、类,类和对象的关系 掌握类,成员变量,方法的定义 掌握构造方法的定义

Slides:



Advertisements
Similar presentations
第3章 使用类和对象编程 软 件 学 院 朱士明 副教授.
Advertisements

西南科技大学网络教育系列课程 高级语程序设计(Java) 第四章 类与对象.
第3章 面向对象的编程技术.
第四章 类 和 对 象.
第4章 类 和 对 象.
单元二:面向对象程序设计 任务二:借书卡程序设计.
Java软件开发基础 4. 面向对象的程序设计基础.
3.2 Java的类 Java 类库的概念 语言规则——程序的书写规范 Java语言 类库——已有的有特定功能的Java程序模块
第3章 面向对象程序设计.
配合< Java面向对象程序设计>例子源代码一起使用
JAVA 编 程 技 术 主编 贾振华 2010年1月.
Java的面向对象程序设计.
Java程序设计教程 第一讲 Java概述.
第4章 类与对象 本章导读 0. 面向对象编程 1. 类声明和类体 2. 类体的构成 3. 构造方法与对象的创建 4. 对象的引用与实体
Hello小程序的运行和编译 Java AppletJava小程序的构成 1、关键字
面向对象的程序设计(一).
第一章 面向对象程序设计.
第二章 JAVA语言基础.
第二部分 Java语言基础篇 第4章 Java语言与面向对象 (之一).
第五章 Java面向对象编程基础 类:现实世界中实体的抽象集合。 5.1定义类 定义类的过程就是定义类的属性和服务的过程;
第14章 c++中的代码重用.
类与对象 Java 实用技术4 类与对象
第10讲 Java面向对象编程基础(4) 教学目标 主要内容.
JAVA程序设计 (03) JAVA Programming
第5章 进一步讨论对象和类.
第六章 JAVA语言中的面向对象特性 6.1 类 6.2 对象 6.3 面向对象的特性 6.4 抽象类、接口和Inner Class.
第四章 Java面向对象程序设计.
第5章 Java中类、对象、接口 及包的概念 5.1 类的基本概念 5.2 类的继承概念 5.3 抽象类和接口 5.4 包.
Ch08 巢狀類別 物件導向程式設計(II).
2.1 基本資料型別 2.2 變數 2.3 運算式與運算子 2.4 輸出與輸入資料 2.5 資料型別轉換 2.6 實例
第5章 面向对象程序设计 本章要点 5.1 面向对象程序设计概述 5.2 Java语言的面向对象程序设计 5.3 方法的使用和对象数组
Classes Lecturer: 曾學文.
第六章 类的扩展与继承.
本單元介紹何謂變數,及說明變數的宣告方式。
程式設計實作.
CH09 套件 物件導向程式設計(II).
Java软件设计基础 5. 继承与多态.
管理信息结构SMI.
Java程序设计 第9章 继承和多态.
辅导课程六.
中国矿大计算机学院杨东平 第5章 接口和包 中国矿大计算机学院杨东平
3.1 数据类型 3.2 标识符与关键字 3.3 常量 3.4 变量 3.5 运算符与表达式 3.6 一个编程实例
Java程序设计 第2章 基本数据类型及操作.
第七章 操作符重载 胡昊 南京大学计算机系软件所.
JAVA 编 程 技 术 主编 贾振华 2010年1月.
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
简单介绍 用C++实现简单的模板数据结构 ArrayList(数组, 类似std::vector)
$9 泛型基础.
C++复习3 ----类的继承与派生.
C#面向对象程序设计 $6 深入理解类.
第二章 Java基本语法 讲师:复凡.
Interfaces and Packages
C++语言程序设计 C++语言程序设计 第九章 类的特殊成员 第十一组 C++语言程序设计.
本节内容 类成员的访问控制 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
第二章 Java语法基础.
3.5 Java的包与访问控制符.
Review 1~3.
多层循环 Private Sub Command1_Click() Dim i As Integer, j As Integer
C++语言程序设计 C++语言程序设计 第八章 继承 C++语言程序设计.
辅导课程十五.
第二章 Java基本语法 讲师:复凡.
C++语言程序设计 C++语言程序设计 第一章 C++语言概述 第十一组 C++语言程序设计.
C++语言程序设计 C++语言程序设计 第九章 类的特殊成员 第十一组 C++语言程序设计.
C++语言程序设计 C++语言程序设计 第九章 类的特殊成员 第十一组 C++语言程序设计.
JAVA 程式設計與資料結構 第三章 物件的設計.
第2章 Java语言基础.
第二章 Java基础语法 北京传智播客教育
C++语言程序设计 C++语言程序设计 第九章 类的特殊成员 第十一组 C++语言程序设计.
第6章 继承和多态 伍孝金
Summary
Presentation transcript:

第四章 对象与类 掌握面向对象程序设计语言的特点 理解对象、类,类和对象的关系 掌握类,成员变量,方法的定义 掌握构造方法的定义 掌握访问权限修饰符如何影响成员的可见性? 掌握实例成员与类(静态)成员的区别 掌握包的定义、导入、及Java寻包机制

面向对象程序设计语言的特点 封装—将数据和处理数据方法组合在一起,并可以控制成员的可见性。 继承—拓展现存的类来生成专有类,继承原来类的状态和行为的能力 多态—同名的方法具有不同的功能.

类间关系 USE-A: B类操控了A类的成员,则称B类USE-A HAS-A: B类拥有A类的成员(包含关系) IS-A: B类是A类的子类(继承关系)

对象(Object) 一切都是对象。 对象:1.属性(状态); 2.行为. 属性: 颜色,排量,价钱,速度,生产厂家… 一切都是对象。 对象:1.属性(状态); 2.行为. 属性: 颜色,排量,价钱,速度,生产厂家… 属性:姓名,生日,籍贯,学院 … 属性: 颜色,年龄,体长 行为: 启动,加速,减速,刹车,开灯,鸣笛… 行为: 跑,叫,踢,摇尾… 行为: 上课,运动,…

对象(续) 定义:对象是变量和相关方法的软件组合。 用变量来描述和维护其状态(属性) 用方法来实现其行为

类(Class) 类是描述对象的蓝图,它定义了一类对象所共有的变量和方法。 类的实例是对象。 E在面向对象的程序设计中,类是程序的基本单元,一个类是定义一种对象的模板。它规定了对象的数据结构,以及用于那些数据的操作。类还是创建对象的“工厂”。类确定了对象的能力。

类的定义 public class Student{//类的声明 private String name;//变量的定义 private int age; public String getName(){//方法的定义 return Name; } public Student(String n, int a){//构造函数 name = n; age = a; } }

类的声明 class MyClass { //成员变量和方法 } public 类是公共访问权限 abstract 类不能实例化 final 该类不能作为其它类的父类 Class NameOfClass 类的名字 extends Super 指明父类 implements Interface 声明实现哪些接口 { 类体 } 类体的定义

类的修饰符 public:说明类可以被其它类使用。如果没有public关键字,则定义的类只能被同一包中的类访问。 abstract:说明此类为抽象类,它不能被实例化,抽象类可以包含没有实现的抽象方法。抽象方法一般在其子类中被实现。 abstract class shape{ int color; abstract void draw(); } final:声明类不能够被继承,即该类不能是其它类的父类。

成员变量的声明 class Student{ String name; } acessLevel 表明变量的访问级别 static 表明这是一个类变量 final 表明变量是一个常量 transient 用来声明一个暂时性变量 volatile 声明一个共享变量 type name 变量的类型和名称

成员变量的修饰符 acessLevel:public, protected, package(无关键字), private之一。控制哪些类可以访问成员变量。 static:声明这是一个类变量,而非实例变量。类变量的值对于所有的实例来说都是相同的。 StaticVarDemo.java final:表明这个成员是一个常量。 final double PI=3.1415926;

构造函数(构造器) 变量的初始化是程序正确运行的保证。 构造函数是一种特殊的方法,它在一个对象创建后自动调用。用于初始化类的新对象。 构造函数与类同名,它们没有返回类型(不能声明为void),不能在构造器中使用return语句。 一个方法如果声明为void,他可以使用不带何参数的return语句。 构造函数由new操作符调用,new操作符返回新创建的对象。 Student stu = new Student(“张三”,18);

构造函数(续1) 每一个类至少有一个构造函数,如果一个类没有编写构造函数的代码,编译器会自动创建一个默认构造函数(没有参数的构造函数)。 class Rectangle{ int width,height; Rectangle(){} } class Rectangle{ int width,height; } 如果已经定义了一个构造函数,则编译器不会创建默认构造函数 Rectangle(int a, int b){ width=a; height=b; } //new Rectangle(); new Rectangle(3,4)

构造函数(续2) 创建对象必须调用类的构造函数来创建。 //new Retangle; new Retangle(); new Retangle(3,4); 构造函数可以重载,这样可以调用不同的构造函数来创建对象 Retangle(){ width=3; height=4; } Retangle(int a, int b){ width=a; height=b; } new Retangle(); new Retangle(7,8)

构造函数(续3) 若某个基本数据类型属于一个类成员,则即使不显式进行初始化,编译器会为其分配默认值。 对象成员被初始化成null 基本类型 boolean false int char ‘\u0000’(null) long 0L byte (byte)0 float 0.0f short (short)0 double 0.0D 对象成员被初始化成null

方法的声明与实现 class Rectangle{double w, len; double area(){return w*len};} acessLevel 此方法的访问级别 static 这是一个类方法 abstract 未实现这个方法 final 方法不能被覆盖 native 方法以另一种语言实现 synchronized 运行方法需要一个监视器 returnType methodName 返回类型和方法名称 (paramlist) 参数列表 throws exceptions 这个方法抛出的异常

方法的修饰符 acessLevel:public, protected, package(无关键字), private之一。控制哪些类可以访问此方法。 static:声明这是一个类方法,而非实例方法。 注意:由于静态方法不是对类的实例进行操作,所以它只能访问和操作静态变量(类变量)。 类方法的调用格式:类名.静态方法名(参数列表) StaticMethodDemo.java final:方法不能被子类覆盖。 native:使用另一种语言实现的方法。 synchronized:并发线程常常调用在相同的数据上进行操作的方法,加上synchronized关键字可以确保线程安全地访问。使用这种机制可以保证对象不会被两个方法或代码同时访问。

returnType:声明返回值的数据类型。如果没有返回值,必须声明为void.(构造函数没有返回值) methodName:方法名可以是任何合法的标识符。 (paramlist):方法的参数

方法的重载 重载指的是同一个类中有两个或多个方法具有相同名字,(但不同的参数表),从而他们作为该类的不同方法共同存在; 【例】 class Math{ static double abs(double x){ return x>=0?x:-x;} static int abs(int x){return x>=0?x:-x;} static long abs(long x){return x>0?x:-x;} }

方法的返回类型 方法必须声明返回类型。如无返回值则必须声明为void. 如果返回类型为基本类型,则返回值必须和返回类型相匹配。(注意:值域小的可以自动向值域大的转化,如声明返回类型为double, 则可以return 整型数据(byte, int, long等)。) 如果返回类型为引用类型,则返回值可以是该类,也可以是他的子类。

方法的参数传递 Java语言的参数是“按值传递”的. 当方法或构造函数被调用时,它们接受被传递的变量的引用。() 当参数是基本数据类型时,方法不能改变他们的值。 当参数是引用类型时,方法不能改变该对象的引用,但可以调用对象的方法并修改对象中的可访问成员。 【例】Param.java E在方法体中,最好不要通过传递的参数变量来改变参数的值或参数的引用,以免造成误解

方法体 方法体即为方法的实现部分。 方法中的局部变量没有默认值,必须初始化。 null用于指代某个还没有相应实例的对象。 null常用于对对象进行初始化。 【例】Stack stack = null;

创建对象 对象声明: 格式:类名 对象名; 【例】 Student stu; 创建对象: 格式:对象名=new 构造函数名([参数列表]); 【例】 stu=new Student(“张三”,18); Student stu=new Student(“张三”,18); 使用对象 对象名.成员变量; 对象名.成员方法;例:stu. getName();

实例成员与静态成员(类成员) 类的成员变量和方法必须声明为static. static int staticInt; static double sin(double){…} 所有的类变量都共享同一内存区域。类的成员变量和方法可以直接通过类名.类变量名,类名.方法名()来引用。在类方法里面不可以直接访问实例成员。 【例】StaticVarDemo.java StaticMethoDemo.java 没有static关键字的修饰成员都属于实例成员。实例成员必须通过类的对象来引用。

this关键字 this关键字代表当前对象。 this关键字一般用在以下几种情况 返回当前对象给方法 return this;

包(package) 包是一个相关类和接口的集合,它可以提供访问保护和名称空间管理。 //in the Graphic.java file public abstract class Graphic{ … } //in the Draggable.java file public interface Draggable{ … } //in the Circle.java file public class Circle extends Graphic implements Draggagle{ … } //in the Retangle.java file public class Retangle extends Graphic implements Draggagle{ … }

命名包 格式:package 包名; 命名包的语句必须作为程序的第一行非注释语句。 为防止包名冲突,在给包命名时,通常使用公司的Internet域名(Email)的反序形式作为前缀。 我的Email:wanlh@szu.edu.cn package cn.edu.szu.wanlh.graphics; 相同名称的类存在于不同的包中时,通过全名来访问类的成员不会造成冲突。 全名由“包名”+“类名” 组成,相互之间用“.”隔开。 graphics.Rectangle a=new graphics.Rectangle(); java.awt.Rectangle b= java.awt.Rectangle();

包中类文件的存放 包名称中的每一个成分对应于一个子目录,应将字节码存在与包名称相对应的子目录中,子目录应位于CLASSPATH环境变量能够搜索到的目录下。 //Retangle.java package cn.edu.szu.graphics; public class Retagle{ … } cn\edu\szu\graphics\Retangle.class

包的使用 只有包中的public成员可以从定义它们的包外访问,要从包外访问public成员,可以采用如下三种方法: 导入一个类或接口。 导入整个包。 使用类的全名来引用它。

导入一个类或接口 语法: import pacakgeName.ClassName; 【例】 import java.awt.Graphics; import java.awt.Color; import graphics.Rectangle; import语句位于package语句(如果有的话)之后,第一个类的定义之前。 【例】 package graphics; import java.graphics.Rectangle; public class Square extends Rectangle{ … }

导入整个包 语法:import packageName.*; 【例】import java.awt.*; import java.awt.event.*; import语句中的‘*’号只能用于指定一个包中的所有public类或接口,不能用于匹配包中类的子集。 【例】//import java.awt.A*; //impot java.graphics.R*; import 只导入指定包中的类,并不会导入嵌套包中的类. Java运行时系统将自动导入以下三个完整的包: (1)默认包。 (2)java.lang (3)当前包

用全名来引用包中的成员 使用 包名.类名 或 包名.接口名 来引用其它包中的类或接口。 【例】 graphics.Rectangle rect1 = new graphics.Rectangle(); 【例1.2】 import java.applet.Applet; import java.awt.Graphics; public class HelloApplet extends Applet{ … } 可以改为: import java.awt.Graphics; public class HelloApplet extends java.applet.Applet{ … }

消除名称的二义性 如果两个包中的成员同名,而这两个包都被导入了,那么必须用全名来引用这些同名的成员。 【例】 import graphics.*; import java.awt.*; … //Rectangle rect = new Rectangle(); graphics.Rectangle rect1=new graphics.Rectangle(); java.awt.Rectangle rect2 =new java.awt.Rectangle(); …

编译器寻找包的机制 包中所有文件必须位于和包名对应的子目录中,这一子目录只要能从CLASSPATH环境变量所定义的所搜索的路径开始分支即可。 导入包中的文件时,需要的是编译后的.class文件,不是.java源文件 【例】 CLASSPATH=c:\java\bin;c:\java\lib\tools.jar;\java\lib\dt.jar;.;e:\wanlh\java; //packageDemo.java import graphics.*; … Rectangle rect1=new Rectangle(); …

类属于包时程序的编译和运行 编译-d选项. javac –d <dir> filename.java -d选项会在<dir>所指定的目录下按照包名来创建目录,并将编译后的的.class文件放在相应的目录下。<dir> 必须是CLASSPATH环境变量所指定的路径中的一个。 运行位于包中的java程序: java 包名.类名 【例】java graphics.Rectangle

用jar打包和jar文件的使用 如果包中有多个类或接口,在将这些类给其他人使用时,通常先用jar打包。命令格式如下: jar –c[v]f[m] 目标文件.jar [MANIFEST.MF] 源文件(目录) jar文件其实就是zip文件 使用别人编写的类(网上下载的类)时,需要将.jar文件加入CLASSPATH环境变量。 运行jar文件 java –jar myapp.jar 如果是图形界面程序:则可双击jar文件运行

MANIFEST.MF Manifest-Version: 1.0 Created-By: 1.6.0_12 (Sun Microsystems Inc.) Main-Class: cn.edu.szu.wanlh.Win Name: MyApp Class-Path: lib/dom4j.jar

类的访问控制符 类的访问控制符: public:公共访问控制符 该类可以被其他所有的类访问和引用。 注意:每个文件只能包含一个public类。 (package):默认访问权限控制符 该类只可以同一包中的类访问和引用。

对象成员的访问控制 private:被private修饰的成员只能被它所定义的类访问。 在类中,该类的对象可以访问另一个同类型对象的private成员。 Class Alpha{ private int iAmPrivate; private bool isEqual(Alpha b){ if(this.iAmPrivate==b.iAmPrivate) return true; else return false; }

对象成员的访问控制(续) protect修饰的成员允许类本身,类的子类,以及相同包中的类访问这个成员。 public修饰的成员允许所有的类访问这个成员。 无关键字修饰的成员默认为包一级的访问控制。即允许类本身和相同包中的类和方法访问。

对象成员的访问控制(续二) 说明符 类 包 子类 所有类 private Y N 无说明符 protected public

选择访问级别 尽可能对成员使用最严格的访问级别,如果没有充分的理由,就使用private. 除了常量外,对所有成员尽量避免使用public.

设计类的原则 尽量将数据设为private. 尽量对变量进行初始化。 尽量减少类中的原始数据类型。如果类定义中有较多的原始数据类型的变量,最好将它们组合成一个新类,以新的类型变量充当数据类的成员。 类的功能尽量单一 取有意义的名字 private String name; private int age; private int salary; Employee