已阅读5页,还剩83页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第五章对象和类 Java 类与对象的基本概念 类与对象对象初始化方法的使用类的组织访问控制常用工具类小结 5 1类与对象 什么是对象对象是现实世界中存在的事物 万事万物皆对象 每个对象是构成现实世界的一个独立的单位 具有自己的静态特征 状态 和动态特征 行为 程序中对象就是一组变量和相关方法的集合 其中变量表明对象的状态 方法表明对象所具有的行为 例如 人 Person 顾客 Customer 银行帐号 Bankaccount 钟表 Clock 及生日 BirthDate 都可以看成是现实生活中的对象 他们具有状态和行为 5 1 1类与对象 现实世界中的对象 程序中的类我们称现实世界中具有相同静态特征和动态特征的所有对象为 一类对象 对某类对象进行抽象可以形成类 class 在抽象的过程中我们会在该类对象的所有静态特征和动态特征中进行取舍 只抽取对我们 有用的 特征并在Java的类中加以描述 5 1 1类与对象 什么是类可以将现实生活中的对象经过抽象 映射为程序中的对象 对象在程序中是通过一种抽象数据类型来描述的 这种抽象数据类型称为类 Class 类是具有相同数据格式 属性 和相同操作功能 方法 的对象的集合与抽象 Java程序中类的声明语法形式如下 访问修饰符 class类名 零到多个类的属性声明 零到多个类的方法声明 零到多个构造方法的声明 其中 内的内容为可选项 类中各组成部分的含义如下 访问修饰符可用的有public abstract和final等关键字 用于说明定义的类有关方面的特性 Class也是java语言的关键字 表明这是一个类的定义 类名一般使用一个用于表示这个类的名词来表示 构造方法用于对象的初始化 类名要遵守一定的规定 不能使用java中的关键字不能包含任何嵌入的空格或点号 以及除下划线 等字符之外的特殊字符 不能以数字开头 5 1 2如何定义一个类 Java是一门纯粹面向对象的程序设计语言 所有的程序都是以类为组织单元 那么如何定义一个类 类定义了对象将会拥有的特征和行为 因此 定义一个类的步骤如下 定义类名 publicclass类名 编写类的属性 类中的属性和方法都称为类成员编写类方法 类的方法描述了类具有的行为 是类的成员方法 独立完成某个功能的单元模块 编写类的构造方法 累的构造方法用于对象的初始化 构造方法是一个类创建对象的基本途径 classPerson Stringname intage chargender voideat voidsleep voidwork 例1 定义个people类 例2定义一个house类 publicclasshouse Stringname intweight Stringcolor publicvoidsleep publicvoideat publicvoidrun 5 1 3属性的声明 类的定义中所包含的数据称为属性 也称为全局变量 比如people类中定义了三个属性 name age gender 属性声明的语法规则如下 访问修饰符 属性类型属性名 默认值 其中 访问修饰符 可用的有public 共有的 private 私有的 等用于说明该属性的访问权限 属性类型是该属性的数据类型 可以是任何合法的java数据类型 包括基本的数据类型和引用类型 属性名称属性名称只要是一个合法的标示符即可 但这只是从语法角度来说的 如果从程序的可读性来看 属性名称应该是由一个或多个具有意义的单词连缀而成的 第一个单词首字母小写 后面每个单词的首字母大写 其他字母全部小写 单词与单词之间不需要任何分隔符 默认值 定义属性还可以定义一个可选的默认值 5 1 4方法的申明 类的定义中还包含方法的声明 其语法规则如下 访问修饰符方法返回值类型方法名 参数列表 由零条到多条可执行语句组成的方法体 其中 访问修饰符 可用的有public 共有的 private 私有的 等用于说明该属性的访问权限 方法的返回值类型 可以使任何合法的Java数据类型 包括基本类型和引用类型 方法名 方法名的命名规则与属性的命名规则基本相同 通常建议方法名以英文中动词开头 方法的参数列表 用于定义该方法可以接受的参数 由零组到多组 参数类型参数名 组合而成 如有多个参数 中间用 号分隔 一旦定义方法时制定了参数列表 则调用该方法时必须传入对应它的参数 5 1 5构造方法的声明 构造方法是一个特殊的方法 这个方法用于创建类的实例 构造方法是JAVA语言中重要的创建类的实例的方法 publicclassschool StringschoolName 学校名称intclassNumber 教师数目intlabNumber 机房数目 定义构造方法publicschool StringschooName intclassNumber intlabNumber this schoolName schooName this classNumber classNumber this labNumber labNumber publicschool 定义展示校区的方法publicvoidshowCenter System out println schoolName 培训学员 n 配备 classNumber 教 labNumber 机 publicclassInitialSchool 创建校区对象 调用校区中学校的名称 教室数目 机房数目等属性 调用展示校区信息的方法 publicstaticvoidmain String args 初始化成员变量前schoolcenter newschool System out println 初始化成员变量前 调用展示校区信息的方法center showCenter 给School成员变量赋值center schoolName 北京校区 center classNumber 10 center labNumber 10 System out println n 初始化成员变量后 center showCenter 程序中的类 程序中的对象程序中的类是对现实世界中一类对象的描述 也是构造程序中对象的模板 对象是类的具体实例 程序中的类就如同建造大楼的设计图纸 程序中的对象 实例 就如同建造出的大楼 使用同一个设计图纸可以建造出很多大楼 类与对象 程序中的类 程序中的对象生成一个对象 类名实例名 new类名 参数列表 并在内存中为此对象分配内存空间 并返回对象的引用 reference 相当于对象的存储地址 程序中引用 reference 每个引用占据32位的内存空间 其值指向对象实际所在的内存中的位置 例如 Dated newDate 产生一个Date类型的对象 实例 d的值就指向该对象实际所在的内存空间 类与对象 为什么要使用类 采用简单数据类型表示现实世界中概念的局存在很大的限性 例如 采用int型数据表示一个日期概念 需要使用3个变量 intday month year 如果要表示2个人的生日 就要使用6个变量 并且在使用中必须时刻注意三者的联系和约束关系 同时在使用日期概念时要同时对三个变量进行访问 使用类可以把现实问题中的对象映射为程序中的一个整体 类 学生类 Student 类classStudent 类首部intid 定义学号Stringname 定义姓名doublegrade 定义成绩intage 定义年龄 类定义结束产生学生对象Studentstu1 newStudent Studentstu2 newStudent 例 Student1 java 类的成员变量声明的格式如下 修饰符 类型变量 初始值 说明 修饰符如public private为访问控制符 public即公有的 也就是它可以被其他任何对象访问 private即私有的 只能被这个类本身访问 在类外不可见 修饰符static指明这是一个类变量 静态成员变量或静态变量 例 Student1 java StudentTest1 java 在一些情况中程序采用的是直接访问Student类对象成员变量的策略 代码片段如下 s2 grade 90 s2 age 23 从表面上看 程序一切正常 如果有下面的代码片段 很快就会发现这不是一种好的设计方法 s2 grade 50 分数为负 s2 age 5 年龄为负 显然 学生成绩和年龄为负数是不符常理的 由于用户能直接访问对象的数据 所以无法限制其它应用程序在调用这些变量时 赋予其数值的范围 好的编程习惯一般不允许其它类直接存取或修改一个对象的成员变量 作为一条规则 把成员变量声明成private 把它们对其他对象隐藏起来 通过提供方法访问属性值 语法格式如下 修饰符 返回类型方法名 参数列表 方法体 例 Student2 java StudentTest2 java 封装把对象的所有组成部分组合在一起 必须注意方法的返回值publicStringgetName 表示该方法运行结束后会产生一个String类型的对象作为结果返回给调用者使用 publicvoidprintName 表示该方法运行结束后没有任何数据供调用者使用 方法的参数列表publicvoidsetName StringstuName 表示该方法运行时必须要接受一个String类型的数据 方法的调用 充实前面的Student类 加入性别 专业 年级 班级等属性 并定义相应的get set方法 然后定义测试类对各个属性进行赋值 显示等测试 练习 对象初始化 前面的例子 每创建一个Student对象都要调用一系列set方法来初始化类中的实例变量 这实在太繁琐 因此 在创建对象的同时就对对象进行初始化是一种简单而有效的解决方法 Java中有一种特殊的方法叫构造方法 Constructor 即产生对象时需要调用的方法 构造方法的形式如下 public类名 参数列表 语句体 说明 1 构造方法名必须为该类名 2 可以通过参数表和方法体来给你生成的对象的成员变量赋初值 3 构造方法没有任何返回值 4 构造方法不能通过调用普通方法的形式来调用 例 Student3 java StudentTest3 java 对象初始化 默认构造方法 DefaultConstructor 类被定义时如果没有显式地定义一个构造方法 那么编译器会自动创建一个默认构造方法 publicStudent 这使得能够通过使用newStudent 语句产生学生类的对象 但是一旦在类中自定义了构造方法 编译器就不会提供默认的构造方法了 例 Student4 java StudentTest4 java 对象初始化 publicclassStudent Stringschool NEUSOFT floatjava point getJavaPoint floatc point getCPoint floataverage getAvergePoint java point c point publicstaticfloatgetJavaPoint publicstaticfloatgetCPoint 例 StudentInit java 成员初始化 初始化顺序类的变量会在任何方法 包括构造方法 执行之前得到初始化 即被赋予初值 静态变量初始化在实例变量之前 例 OrderOfInit java 对象初始化 static补充用修饰符static修饰的变量称为类静态变量 也叫做静态变量或者类变量 静态变量是类的变量 不属于任何一个类的具体对象实例 它不保存在某个对象实例的内存空间中 而是保存在类的内存空间的公共存储单元中 也就是说 不论一个类具有多少个对象 静态变量只有一个 任何一个类的对象访问它 取得的都是相同的数值 同样地 任何一个类的对象去修改它 也都是在对同一个内存单元进行操作 静态变量可以通过类名直接访问 也可以通过对象来调用 采用这两种方法取得的结果是相同的 例 StaticTest java StaticInit java 对象初始化 创建一个桌子 Table 类 该类中有桌子名称 重量 桌面宽度 长度和桌子高度属性 以及以下几个方法 1 构造方法 初始化所有成员变量 2 area 计算桌面的面积 3 display 在屏幕上输出所有成员变量的值 4 changeWeight intw 改变桌子重量 在测试类的main 方法中实现创建一个桌子对象 计算桌面的面积 改变桌子重量 并在屏幕上输出所有桌子属性的值 练习 方法的使用 Java语言允许方法重载 overloading 为解决这类问题提供了很好的解决方案 方法重载指一个类中有两个或两个以上同名的方法 但参数表不同 在类中 对重要的方法进行重载 这将为用户使用这些方法提供方便 例 Student5 java StudentTest5 java 构造方法的重载方法重载的最主要的作用其实是实现同名的构造方法可以接受不同的参数 例 StudentTest6 java注意 其中Student类中的toString 方法用于输出学生的信息 当把对象引用放在打印语句中时会自动调用对象的toString 方法 如 System out println s1 等效于System out println s1 toString 方法的使用 为之前练习中的类Student与Table添加进多个构造方法 并分别添加toString 方法用于显示对象的属性值 练习 this关键字this表示调用这个方法的对象的引用 在类的构造方法和实例方法中解决局部变量与实例变量同名的问题 在构造方法中使用this调用另一个构造方法 例 Leaf Java Flower java 方法的使用 定义一个名为Dog的类 具有方法bark 此方法应根据不同的基本数据类型进行重载 并根据被调用的版本 打印出不同类型的狗吠 baying 嚎叫 howling 等消息 编写main 方法来测试 改写上题的程序 让两个重载函数都有两个参数 类型不同 但二者顺序恰好相反 然后增加一个方法调用前两个方法 调用第一个不用this 调用第二个使用this 最后在main 方法里调用第三个方法 练习 声明一个MathUtil类 提供 方法total inti 返回1到i的累加和 如果传入的参数为0或负数则返回 1 方法factorial inti 返回i的阶乘结果 如果传入的参数为负数则返回 1 方法prime inti 打印1 i之间的所有质数 如果传入的参数为0或负数则返回 输入错误 练习 方法的递归调用递归是常用的编程技术 其基本思想是 自己调用自己 数学上最常见的递归问题就是自然数的阶乘 n 1 n 1 n 1 n n n 1 例 Recursion Java 方法的使用 练习Fibonacci数列 13世纪意大利著名数学家斐波那契 Fibonacci 在他的著作 算盘书 中 记载着这样一个有趣的问题 由一对兔子开始 一年后可以繁殖成多少对兔子 假设免子的生殖力是这样的 每对兔子每一个月可以生一对兔子 并且兔子在出生两个月后就具有生殖后代的能力 该数列特征如下 如 1 1 2 3 5 8 13 21 34 F1 F2 1 Fn Fn 1 Fn 2 n 3 编写方法求该数列的第n项的值 n值由参数传入 方法的使用 类的组织 包 package 作用与Windows系统中的文件夹类似 它不具有任何特别的功能 只是用来存放一个或者多个类和接口的空间 使用包可以避免同名类发生冲突 使类的管理更清晰 更有条理 包可以嵌套使用 一个包中可以再有多个包 就像一个文件夹内可以含有多个子文件夹一样 包 package 定义包 package包名 定义包的语句必须放在源程序有效代码的第一行 使用这个语句就可以创建具有指定名字的包 并且当前程序中的所有类都属于这个包 如果在package语句的包名中含有符号 则代表了目录分隔符 在这种情况下 需要按照包名分割的顺序 依次创建子文件夹中的子文件夹 注意 Javapackage的命名习惯是所有字母全部小写 例如 packagepeople person managers 类的组织 导入包当需要使用另一个包中的类时 需要先导入该包 导入的形式为 import包名 类名 其中 包名可以使用符号 来表明包的层次 如果要从一个包中引入多个类 则可以用符号 来代替类名 例如 importjava awt 注意 只能表示本层次包中的所有类 不包括子包中的类 所以必须多次使用import语句导入所有需要的类 包 package 例如 importjava awt importjava awt event 例 Package Java 程序员能很容易确定同一包的类是相互关联的 程序员能很方便地了解到在哪里可以找到能完成特定功能的类 避免产生类名冲突 比如Java标准类库中的常见包名 提供与网络编程有关的类和接口 java io 提供与输入输出编程有关的类和接口 java lang 提供Java编程语言的基础类 使用包的好处 访问控制 类的访问控制只有public 公共 及无修饰符 缺省 两种 当使用public修饰符时 表示所有其它的类都可以使用此类 当没有修饰符时 则只有与此类处于同一包中的其它类可以使用此类 例 PackageTest Java 类成员的访问控制类成员的访问控制符有public private protected及无修饰符4种 private 私有的 类中限定为private的成员只能在这个类中被访问 在类外不可见 无修饰符 缺省的 如果没有访问控制符 则该类成员可以被该类所在包中的所有其它类访问 访问控制 protected 受保护的 用该关键字修饰的类成员可以被同一类 被该类所在包中的所有其它类或其子类 可以不在同一包中 的实例对象访问 public 用public修饰的类成员可以被其他任何类 前提是对类成员所在的类有访问权限 例 PackageTest Java 类成员访问控制符与访问能力之间的关系 访问控制 常用工具类 字符串和数字的相互转换数字转换为String 使用String类静态方法String valueOf 例如 Strings String valueOf 45 String转换为数字 因为用户通过键盘输入的数字的类型为String型 所以非常需要将其转换为数字 有2个静态方法可以将String转换为数字 Integer parseInt 将String代表的整数型数字转换为int型数值 格式为 Integer parseInt Stringstr Double parseDouble 将String代表的浮点型数字转换为double型数值 格式为 Double parseDouble Stringstr 例 StrTest2 Java 外覆类 包装类 ByteShortIntegerLongDoubleFloatBooleanCharacter 常用工具类 统计一个字符串中出现某个字母的次数 注意区分大小写 String类中的相关方法 length 计算字符串长度 得到一个int型数值 indexOf 在字符串中定位某个子串 并返回位置编号substring 截取字符串中的一部分 并作为一个新字符串返回 equals 比较两个String内容是否完全相同 练习 Math类Math类中的许多静态方法与C语言中的函数类似 可以进行求平方根 求幂等复杂数学计算 random 随机产生一个在 0 1 区间的double型数值 例如 随机产生一个10到50之间的整数 inti int Math random 50 10 1 10 pow doublex doubley 返回x的y次幂值 x可以是int long float和double型 但返回值为double型 sqrt doublex 返回x的平方根 x可以是int long float和double型 但返回值为double型 常用工具类 JOptionPane类有助于方便地弹出要求用户提供值或向其发出通知的标准对话框 showConfirmDialog showInputDialog showMessageDialog 常用工具类 练习随机产生一个100以内的正整数 用户通过键盘输入所猜的数字 如果猜对 则结束程序 如果猜错 则给出提示继续猜 直到猜对为止 分别使用Scanner和JOptionPane类完成 常用工具类 类与对象小结 介绍了Java语言类与对象的基本概念和语法 包括类的声明 类成员的访问 以及对象的初始化 类是对一类对象共同属性和行为的抽象 由数据成员 属性 方法成员 行为 组成 相关的类组织在一起可以形成包 每一个类都属于某个包 如果未声明包 则该类属于无名包 类成员的访问控制符有public private protected及无修饰符 分别标识了不同的访问权限 对象是类的实例 是通过类的构造方法来初始化的 类的重用 part2 2 1类的继承2 2引入继承后的初始化2 3抽象类2 4接口 2 1类的继承 Java最令人心动的特性就是它的代码复用了 代码复用有两种方式1 合成 composition 在新的类里直接创建旧的类的对象 因为新的类是由旧的类合成而来的 你所复用的只是代码的功能 而不是它的形式 2 继承 inheritance 创建一个新的 与原来那个类同属一种类型的类 你全盘接受了旧类的形式 在没有对它做修改的情况下往里面添加了新的代码 合成 composition 只要把对象的reference直接放到新的类里面就行了 例如 创建一个Family类 包含father mother child三个对象 分别为Man Woman Boy三个类的对象 例 Family java Man java Woman java Boy java 2 1类的继承 继承 Inheritance 指一个类 Class 可以继承其它类的所有内容 包括变量和方法 被继承的类称为父类或者超类 Superclass 继承后产生的类成为子类或者派生类 Subclass 2 1类的继承 利用extends创建子类通过在类的声明中加入extends关键字来创建一个类的子类 其形式如下 修饰符 class子类名extends父类名 语句体 例 Student java 继承 Inheritance 不使用extends的继承如果没有使用extends 则该类为java lang Object的子类 注意 在Java语言中 所有的类都是由Object类派生出来的 比如前面介绍的String类 以及用户自己新建的类 2 1类的继承 继承 Inheritance java的单继承在Java中 每一个类只可以有一个父类 不允许有多个父类 但是 一个类可以有多个子类 父类含有其所有子类共同的内容 每一个子类各自具有与其他子类不相同的内容 例如 狗 类和 人 类都是 哺乳动物 类的子类 它们即具有胎生 哺乳 恒温等 哺乳动物 类的共同特点 又具有各自的不同的特点 狗 类有尾巴 而 人 类使用语言 2 1类的继承 继承中的访问权限类继承并不改变类中变量和方法的访问权限 如果父类中的变量和方法为public protected或者friendly 其子类中的这些变量和方法依然为public protected或者friendly 子类不能访问父类中权限为private的实例变量和实例方法 当final修饰类 方法时例 man Human java man Footballer java 2 1类的继承 类继承的传递性类继承具有传递性 也就是说子类具有其父类和父类的父类 一直到Object类的所有类的内容 比如 B类继承了A类 而C类又继承了B类 则C类包含A类和B类的几乎所有内容 例 man Human java man Footballer java man ItalyFootballer java 2 1类的继承 2 2引入继承后的初始化 父类的初始化Java会让子类的构造方法自动地调用基类的构造方法 例 Cartoon java super关键字super指的是父类对象的引用 在类的继承中有重要的作用 super的常用方法如下 例 man Human java man Footballer java 2 2引入继承后的初始化 super关键字使用父类的构造方法 如果类没有默认的构造函数 也就是无参数的构造函数 或者需要调用的基类构造函数是带参数的 就必须用super关键词以及合适的参数明确地调用基类的构造函数 super 参数 2 2引入继承后的初始化 使用super访问父类的变量或者方法 在编程中 常会遇到子类中的实例变量或实例方法与父类中的实例变量或者实例方法同名 因为子类中的实例变量或者实例方法名具有相对高的优先级 所以子类中的同名实例变量和实例方法就隐藏了父类的实例变量或者实例方法 在这种境况下 如果想要使用父类中的某个实例变量或者实例方法 就需要用到super关键字 例 Chess java 继承情况下的初始化引入继承概念后初始化执行顺序 父类的static变量 子类的static变量 父类的实例变量 父类的构造方法 子类的实例变量 子类的构造方法 例 Beetle java 2 2引入继承后的初始化 向上转型
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026届山东省潍坊市辖县中考物理考试模拟冲刺卷含解析
- 湖南省株洲市醴陵市2026届中考联考物理试题含解析
- 企业管理-差旅费报销制度
- 产科护理产褥期感染预防与处理
- 江西省赣州市兴国县2026届中考物理全真模拟试题含解析
- 常德市安乡县2025届三下数学期末教学质量检测试题(含解析)
- 常州市天宁区2025年三下数学期中监测试题含答案
- 产前诊断的影像学技术
- 2026年中考生物一轮复习:人教版(2024)七八年级4册必背知识点提纲
- 湖南省株洲市2025-2026学年高二下学期期末自编模拟C卷(株洲市专用)物理(含答案)
- 二次供水安全培训课件
- 四川省成都市成华区2024-2025学年八年级(下)期末物理试卷(含解析)
- 人教版2024版历史八年级上册第四单元第12课《中国共产党诞生》创新教学设计
- 硬笔书法全册教案共20课时
- 中华人民共和国治安管理处罚法培训宣贯
- 江苏省南通市海安市2024-2025学年六年级下学期期末数学考试卷
- 生物制剂在哮喘治疗中的应用
- 2025陕西氢能产业发展有限公司所属单位招聘(101人)笔试参考题库附带答案详解析集合
- 动漫速写基础-课件 第4章动态人物速写
- 农光互补光伏样板工程方案
- GB/T 44399-2024移动式金属氢化物可逆储放氢系统
评论
0/150
提交评论