790 likes | 1.03k Views
数据结构( Java 语言版). —— 第 2 章 Java 语言基本知识. 返回. 【 知识要点 】 面向对象程序设计思想; Java 语言基础知识; Java 程序的设计、编辑、编译和运行; Java 的“指针”实现。. 返回. 实例引入. 【学习任务】 通过实例分析,了解 Java 语言和 C 语言描述算法的区别,重点理解面向对象程序设计语言描述数据结构的直观性。 【例 2.1】 人事信息管理系统 某企业建设人事信息管理系统,其中某个数据库中各字段设置包括:姓名、性别、年龄等信息,对其操作的方法有插入、显示等。. 返回.
E N D
数据结构(Java语言版) ——第2章 Java语言基本知识
返回 【知识要点】 • 面向对象程序设计思想; • Java语言基础知识; • Java程序的设计、编辑、编译和运行; • Java的“指针”实现。
返回 实例引入 • 【学习任务】 通过实例分析,了解Java语言和C语言描述算法的区别,重点理解面向对象程序设计语言描述数据结构的直观性。 • 【例2.1】人事信息管理系统 某企业建设人事信息管理系统,其中某个数据库中各字段设置包括:姓名、性别、年龄等信息,对其操作的方法有插入、显示等。
返回 若用C语言实现,表示如下: struct testman{ char name[]; char sex[]; int age; …… }; 用C面向过程的程序设计语言实现插入和显示等操作时,都需要单独自定义函数来完成。
返回 若用Java实现,表示如下: pubic class Testman{ String name; String sex; int age; //设置插入方法 public void Insert(String name, String sex, int age){ …… } //显示方法 public void display(String name, int age){ …… } …… } 用Java面向对象程序设计语言实现算法时,将数据成员和对成员操作的方法都封装在类中,其表现形式和数据结构的抽象数据类型的定义形式是一致,因此Java语言更有利于实现数据结构中逻辑结构、存储结构以及算法的实现。
返回 Java语言概述 • 【学习任务】了解Java语言的简单发展及特点,重点了解其面向对象程序设计的特点。 • Java是Sun Microsystems公司的James Gosling领导的开发组开发的。自Java语言问世以来,Java语言以其面向对象、简单高效、与平台无关、支持多线程、具有安全性和健壮性等特点,已成为目前最有吸引力且发展趋势迅猛的计算机高级程序设计语言之一。还有其丰富的API文档和包罗万象类库,可广泛用于面向对象的事件描述、处理和综合应用等面向对象的开发。实际上,Java是程序设计平台,是开发环境,又是应用环境。所以,Java语言的基本概念可以表示为: • Java语言=面向对象的程序设计语言+与机器无关的二进制格式的类文件 • +Java虚拟机+完整的软件程序包
返回 面向对象程序设计简述 • 【学习任务】掌握面向对象程序设计的基本概念及其基本特征,注意理解面向对象程序设计语言描述的数据结构。 • 在结构化程序设计中,数据的描述用数据类型表示,对数据的操作用过程或函数表示。例如,在描述栈时,先定义栈的数据类型,再用过程实现对栈的操作,这种方式是可行的,但不符合面向对象的程序设计思想。因为对数据的描述和对数据的操作两者是分离的,这将导致程序的重用性差、可移植性差、数据维护困难等缺点。在数据结构的理论中,数据的逻辑结构、存储结构和对数据的操作三者是一体的,是相互依存的,所以用面向对象程序设计的特性,即封装、继承和多态等特性能够更深入的描述和刻画数据结构。
返回 • 1面向对象程序设计的基本概念 面向对象的设计(Object Oriented Programming,简称OOP)思想是在原来结构化程序方法基础上的一个质的飞跃,是一种新的程序设计理念,是软件开发的一种方法,其本质是把数据和处理数据的过程当成一个整体——对象。
返回 面向对象程序设计的基本概念 • 1.1对象(Object) 从概念上讲,对象代表着正在创建的系统中的一个实体。在日常生活中,对象是认识世界的基本单元,对象是现实世界中的一个实体,整个世界就是由各种各样的对象构成的。在面向对象概念中,描述对象的状态和性质称为属性,用数据来描述;描述对象的行为及其操作称为方法。所以,程序中的对象是数据和方法的一个封装体,是程序运行时的基本实体。可用公式表示成: 对象=数据+方法(作用于这些数据上的操作)
返回 面向对象程序设计的基本概念 • 1.2类(class) 类是对象的模板,是对一组具有共同的属性特征和行为特征的对象的抽象。抽象是一种从一般的观点看待事物的方法,它要求集中于事物的本质特征,而非具体细节或具体实现。因此,类和对象之间的关系是抽象和具体的关系。即对象的抽象是类,类的具体化就是对象。类也具有属性,它是对象状态的抽象,用数据结构来描述;类也具有方法,它是对象行为的抽象,用方法名和方法体来描述。
返回 面向对象程序设计的基本概念 • 1.3消息(message)和方法(method) 对象之间进行通信的结构叫做消息。对象是通过传送消息给其他对象来达到交互和沟通的。在对象的操作中,当一个消息发送给某个对象时,消息包含接收对象去执行某种操作的信息。
返回 实例 类:副教授 抽象 对象:刘阳 姓名 性别 属性:年龄 单位 职称 工资 刘阳 男 状态:40 计算机系 教授 3000 数 据 结 构 数 据 值 调工资 操作:评职称 聘任 调工资 行为:评职称 聘任 方法名 (参数) 执行的操作 方法: 调工资 {计算公式} 评职称 {步骤,条件} 刘阳 调工资(……) 评职称(……) 方法体 面向对象程序设计的基本概念 • 类中操作的实现过程叫做方法,一个方法具有方法名、参数、方法体。消息传递如图所示。
返回 • 2面向对象程序设计的基本特征 面向对象程序设计三大基本特征是:封装、继承和多态 面向对象封装是把表示属性的数据和对数据的操作包装成一个对象类型,使得对数据的存取只能通过封装提供的接口进行 继承是类与类之间存在的一种关系,它使程序员可在已有类的基础上定义和实现新类。继承是构造可复用软件构件的有效机制。 面向对象程序设计中的多态性是指不同的对象收到相同的消息时所产生多种不同的行为方式
返回 Java 语言基础知识 • 【学习任务】掌握Java语言基础知识和Java程序设计、编辑、编译和运行,学会利用Java面向对象程序设计语言,更深入的描述和刻画数据结构。 • Java许多方面的优点、丰富的API文档和功能强大的类库,使程序员的开发工作可以在一个较高层次上展开
返回 Java程序中的每一条语句都以“;”结尾。利用“{”和“}”将一组语句括起来构成复合语句。在Java中一行注释以“//”标记;一行或多行注释可介于“/*”和“*/”之间。 【例2.2】一个简单的Java程序。
返回 在一个Java源程序文件中,至少必须包含一个类,但只能包含一个public类。若该类能独立运行必须包含惟一的main方法。对【例2.2】名为Area.java的文件而言,Area就是该文件中定义为public类的类名。每个Java源程序都将被编译为 *.class的类文件,即Area.java经过编译就产生Area.class类文件。main(String[] args)是程序执行的入口。程序运行可以以命令行的方式运行,也可在集成开发环境中运行.
返回 • 1 数据类型 在Java语言中,数据类型包括8种基本数据类型和3个引用数据类型。他们的分类及关键字如图2.2所示。
返回 • 下面是基本数据类型数据在内存中所占的存储空间及其取值范围。 表2.1 各类数据类型数据存储空间及其取值范围
返回 • 2 运算符 在Java语言中,运算符包括算术运算符,关系运算符,逻辑运算符和位运算符四类 运算符的优先级及其结合性
返回 入口 入口 逻辑表达式 true false 语句1 语句1 语句2 入口 语句2 出口 逻辑表达式 false 出口 (a)顺序结构 (b)双分支结构 (c)循环结构 true 语句 出口 • 3 流程控制 • 计算机高级程序设计语言中,按程序的执行流程,分为三种流程控制结构,分别是:顺序结构、分支结构和循环结构。
返回 • 3.1分支语句 Java 中有两种语句可用于分支结构,一种是 if 条件语句,另一种是 switch 多路分支语句。 (1)if语句 if语句的格式如下: if (<条件表达式>) <语句1>; [else <语句2>;] (2)switch语句 switch语句是根据表达式的取值来决定分支的选择。即switch语句先求表达式的值,再根据该值把控制流程转移到与之匹配的case后的“语句”开始执行,一直执行到下一个break处或者switch的末尾。如果都不匹配,而且存在 default 子句,那么执行default后面的语句。switch语句的格式如下: switch (<表达式>) { case <常量表达式1>: <语句1>; break; case <常量表达式2>: <语句2>; break; …… case <常量表达式n>: <语句n>; break; default: <语句>; }
返回 • 3.2循环语句 Java 中的循环语句包括:for 循环、while 循环、do-while 循环。它们的共同点是,根据循环条件来判断是否执行循环体。除此之外,每个循环语句都有自己的特点,应根据不同的问题选择合适的循环语句。 • 与while循环不同的是,do-while 循环首先执行一次循环体,当循环条件满足时则继续进行下一次循环。
返回 • 3.3特殊的流程控制语句 • Java语言还提供了三种无条件转移语句:即return,break和continue。break语句立即结束包含它的最内层循环,通常与if语句和switch语句一起使用。而continue语句只结束当次循环继续执行下一次循环(执行下一次循环前先判断循环条件是否满足)。Java中的return语句有两个作用:一个是返回方法指定类型的值,一个是结束方法的执行。
返回 • 【例2.3】显示金字塔型数字。
返回 • 程序如下: public class Ex0102{ public static void main(String[] args){ final int LINE=9; int row,column,num; for(row=1;row<=LINE;row++){ //外层循环 for(column=0;column<LINE-row;column++) //前导空格 System.out.print(" "); for(num=row;num>=1;num--) //前面的数字 System.out.print(num+" "); for(num=2;num<=row;num++) //后面的数字 System.out.print(num+" "); System.out.println(); //换行 } } } 该程序中System.out.println()和System.out.print()都是向控制台显示字符串;前者是在显示字符串之后将光标移向下一行,即换行,而后者是执行完输出显示后不换行
返回 • 4 数组(Array) 数组是一组具有相同数据类型的数据集合。数组中的每个数据称为数据元素。每个元素均有惟一的编号 • 4.1一维数组 格式如下: <数据类型> [ ] <数组名>; 或者 <数据类型> <数组名>[ ];
返回 • 使用new创建一维数组的格式如下: <数组名> = new <数据类型>[<长度>]; • 声明数组变量和创建数组,可以组合为一条语句。格式如下: <数据类型> [ ] <数组名>= new <数据类型> [<长度>]; 或者 <数据类型> <数组名>[ ] = new <数据类型> [<长度>];
返回 • 4.2二维数组 二维数组是由数组元素组成,每个元素又是一个一维数组。三维数组是二维数组的数组,其中每个二维数组又是一维数组的数组。所以,声明二维数组变量并创建二维数组的方法可以被推广,用来声明n维数组变量和创建n维数组。 • 【例2.4】 输出循环移位方阵。 假设一维数组table中元素的值分别为: 2 4 9 1 输出如下形式的方阵: 2 4 9 1 4 9 1 2 9 1 2 4 1 2 4 9
返回 • 程序如下: public class Ex0103{ public static void main(String[] args){ int i=0,j=0,n=4; int[] table=new int[n]; int[][] table1=new int[n][n]; for(i=0;i<table.length;i++) //产生n个随机数初始化一维数组赋值 table[i]=(int)(Math.random()*10); for(i=0;i<table.length;i++){//把一维数组的数值赋值于二维数组 for(j=0;j<table.length;j++) table1[i][j]=table[(i+j)%n]; } for(i=0;i<table1.length;i++){ //输出二维数组 for(j=0;j<table1[i].length;j++) System.out.print(table1[i][j]+" "); System.out.println(); } } }
返回 • 本例将产生的n个随机数存放在一维数组table中,然后,将一维数组中数据元素的值赋值于二维数组table1,最后输出二维数组。 • 思考:其实将存放在一维数组table中的数据,运用循环,每次输出一维数组的结果不同,也可以实现该功能。请读者试着写出该程序。
返回 • 5 类与对象 • 类是定义相同类型对象的结构,是抽象数据类型的实现。对象是类的实例化,在类定义中指明了类包含对象的属性和方法。 • 5.1类的声明 Java中,类声明的格式如下: [<修饰符>] class <类名>[extends <父类名> [implements<接口名>]] { <成员变量的声明>; <成员方法的声明及实现>; }
返回 • 5.2构造方法(Constructor) • 在Java程序中,构造方法是一个特殊的类方法,它可以用来初始化对象的属性数据。构造方法具有与定义类完全相同的名称,与方法一样,构造方法可以被重载,它没有返回类型。 【例2.5】 创建构造方法示例。 public class Person { private int age; //成员变量 private int weight; //带一个参数的构造方法 public Person(int person_age){ age=person_age; } //带两个参数的构造方法 public Person(int person_age,int person_weight){ age=person_age; weight=person_weight; } }
返回 • 每个类都必须至少有一个构造方法。如果在类中没有定义任何构造方法,系统会自动为类生成一个默认的构造方法。默认构造方法的参数列表为空。如果程序定义了一个或多个构造方法,则系统会自动屏蔽默认构造方法。构造方法不能继承。
返回 • 5.3创建对象和使用 • 正确的声明了Java类之后,就可以在其他的类或应用程序中使用该类了。对象成员是指对象所属类中声明的所有属性和方法。对象是类的实例,对象声明的格式如下: <类名><对象名>; 用new运算符来创建对象,并为之分配的存储空间。声明对象的同时可以使用new操作符创建对象,其格式如下: <类名><对象名> = new <类名>([<参数列表>]); 例如, Person name = new Person(); 等价于下面两条语句: Person name; • name = new Person();
返回 【例2.6】 创建对象及其使用实例。 class Student{ String name; String sex; int age; //设置“name”的方法 public void setName(String student_name){ name = student_name; } //获取“name” 的方法 public String getName() { return name; } public void setSex(String student_sex){ sex = student_sex; } public String getSex(){ return sex; }
返回 public void setAge(int student_age){ age = student_age; } public int getAge(){ return age; } } public class StudentTest { public static void main(String[] args){ Student s = new Student(); //创建对象 s.setName("刘阳"); s.sex="男"; s.setAge(18); System.out.print(s.name+"同学,年龄" + s.getAge()+"岁,性别" + s.getSex()+"。"); } }
返回 • 程序运行的结果为: 刘阳同学,年龄18岁,性别男。 • 该程序中,对成员方法的定义都很简单,每个成员变量都有相应的设置(set)方法和获取(get)方法,设置方法将传入的参数赋给对象的成员变量,而获取方法取得对象的参数值。
返回 • 5.4与OOP有关的关键字 • (1)访问权限修饰符 • 访问权限修饰符包括public、private、protected和默认的四种,既可以修饰类,又可以修饰类中的成员(成员变量和成员方法),它决定所修饰成员在程序运行时被处理的方式。 • public:用public修饰的成员是公有的,也就是它可以被其他任何对象访问。 • private:表示是私有的,类中限定为private的成员只能被该类访问,在类外不可见。 • protected:用protected修饰的成员是受保护的,只可以被同一类及其子类的实例对象访问。 • 默认的:如果不表明上述三种访问权限修饰符,其成员可以被所在包的各个类访问。
返回 • (2)存储方式修饰符 • static既可修饰成员变量,又可以修饰成员方法,表明所说明的对象是静态的。用关键字static修饰的变量称为类变量或静态变量,系统运行时,只为该类的第一个对象分配存储单元,其后不论创建了多少个对象,都可被类的所有对象所共享。类中定义的公有静态变量相当于全局变量。例如, public static int counter=0; //声明静态变量 • 用关键字static修饰的方法称为类方法或静态方法。类方法体只能访问类成员。类方法既可通过对象来调用,也可以通过类名来调用。
返回 • (3)与继承有关的关键字 • final:用final修饰的类不能再派生子类,它已经达到类层次中的最低层。它可以修饰类、方法或变量,表明类、方法或变量不可被改变。 • abstract:用abstract修饰类或成员方法,表明所修饰的类或成员方法是抽象的。和final完全不同,抽象类一定要派生子类,父类中的抽象方法可以在子类中实现,也可以在子类中继续说明为抽象的。
返回 • (4)this和super • 在Java中,每个对象都具有对自身访问的权利,即this引用。每个对象都可以对父类的成员访问,即super引用。this指代本类,super指代父类,它们可以引用或调用类的成员方法。
返回 • 6 类的封装性(encapsulation) • 封装是面向对象的重要特性之一,它有两个涵义:一是指对象的属性数据和对数据的操作结合在一起,形成一个统一体,也就是对象;另一方面是,尽可能地隐藏对象的内部细节,只保留有限的对外接口,对数据的操作都需通过这些接口实现。即类的设计者把类设计成一个黑匣子,使用者只能看见类中定义的公共方法,而看不见方法的实现细节,也不能直接对类中的数据进行操作。这样可以防止外部的干扰和误用。即使改变了类中数据的定义,只要方法名不改变,就不会对使用该类的程序产生任何影响。这就是类的抽象性、隐藏性和封装性。
返回 • 7 类的继承性(inheritance) • 继承是面向对象的重要特征之一。面向对象程序设计允许从现有的类派生出新类,这称为继承。使用关键字extends,可以从类继承另一个类,即从现有类出发,定义一个新类,即新类继承了现有的类。被继承(inherited)的现有的类称为父类,也称为超类(superclass),继承的新类称为子类(subclass)。 • 在Java中,通过在声明类时说明类的父类,来创建子类的。声明类格式如下: public class <子类名> extends <父类名> • instanceof对象操作符用来测试一个指定的对象是否为指定类或指定类的子类的实例,如果是则返回true,否则返回false。
返回 • 8 类的多态性(polymorphism)\多态,意味着一个名字可具有多种语义。对象的多态性就是该对象可以具有“多种形式”。在Java中,多态是指一个方法可能有多个不同的形式,一次单独的方法调用,可能是这些形式中的任何一种方法。即实现“一个接口,多个方法”。 • 8.1方法重载(method overloading) • 在Java程序中,如果同一个类中有两个相同的方法(方法名相同,返回值相同,参数列表相同)是不行的。即一个类中可以拥有许多同名而不同参数的方法,这种情况是允许的,称这种行为为方法重载。例如,在Java中,函数abs()是返回某个数的绝对值,参数的类型有四种:
返回 • static int abs(int a) • static long abs(long a) • static float abs(float a) • static double abs(double a) 在进行方法重载时,必须遵守以下四条原则: • 方法名相同 • 参数必须不同,可以是参数个数不同或类型不同 • 返回值可以相同,也可以不同 • 可以相互调用 • 重载的价值在于,它允许通过使用一个普通的方法来访问一系列相关的方法。当调用一个方法时,具体执行哪一个方法根据调用方法的参数决定,Java运行系统仅执行与调用的参数相匹配的重载方法。
返回 • 8.2方法覆盖 • 当子类继承了父类时,它就继承了父类的属性和方法,就可以直接使用父类的成员和方法;如果父类的方法不能满足子类的需求,则可以在子类中对父类的方法进行“改造”,这个“改造”的过程在Java中称为覆盖(override) • 进行方法覆盖时,应注意以下3方面: • 子类不能覆盖父类中声明为final的方法 • 子类必须覆盖父类中声明为abstract的方法,或者子类方法也声明为abstract • 子类覆盖父类中同名方法时,子类方法声明必须与父类被覆盖方法的声明一样
返回 • 9 抽象类和内部类 • 9.1抽象类(abstract)和最终类 • 一个抽象类是通过关键字abstract修饰的类,关键字abstract用于标识一个抽象类或抽象方法。一个抽象方法是指一个仅有方法定义,而没有方法体的方法。当声明一个方法为抽象方法时,就意味着这个方法必须被子类的方法覆盖。在声明类时除了可以说明类的父类,还可以说明最终类和抽象类等
返回 • 当声明了一个抽象类时,只声明了该类描述的数据结构,而不实现每个方法。这个抽象类可以作为一个父类被它的所有子类共享,而其中的方法由每一个子类去实现。子类必须实现父类中的所有抽象方法,或者将自己方法也声明为抽象的。以下任一条件成立时,类必须声明为抽象类: • 类中至少有一个抽象方法; • 类继承了父类中的抽象方法,但是至少有一个抽象方法没有实现; • 类实现了某个接口,但没有全部实现接口中的方法(关于接口,后续给予介绍)。
返回 • 9.2内部类(inner class)和外部类 • 在Java中,如果一个类嵌套定义在另一个类中,则嵌套定义在另一个类中的类称为内部类。包含了内部类的类称为外部类。与一般的类型相同,内部类可以具有成员变量和成员方法。引入内部类主要是考虑:内部类对象能访问他所处类的私有成员变量和成员方法;内部类能够隐藏起来不被同一个包中的其他类访问。
返回 • 10 接口(interface) • 在Java中,除了可以使用抽象类来实现一定程度的抽象外,还可以定义一种特殊的“抽象类”——接口。接口是没有实现的方法和常量的集合。在接口中所有的方法都是抽象方法(只有方法定义,没有方法体)。在抽象类中,有些方法被实现,而有些方法只有方法的声明,没有方法的具体实现,而在接口中,所有的方法都没有被实现。和抽象类中的抽象方法不一样,这些没有被实现的方法不需要加上关键字abstract来将它们声明为抽象方法。定义接口和定义类不同,定义接口使用关键字interface