java核心技术(第四章)对象与类
4.1 面向对象程序设计概述
每个对象包含对用户公开的特定功能部分和隐藏的实现部分。
4.1.1类
由类构造对象的过程称为创建类的实例。
封装(数据隐藏)是与对象有关的。从形式上看,封装不过是将数据和行为组合在一个包里,并对对象的使用者隐藏了数据的实现方式。
对象中的数据:实例域, 方法:操纵数据的过程。、 对于每个特定的类实例(对象)都有实例域。这些值的集合就是 这个对象的当前状态。 无论何时,只要向对象发送一个信息,它的状态就有可能发生改变。
封装的关键:绝对不能让类中的方法直接地访问其他类的实例域。即程序仅仅通过对象的方法与对象数据进行交互。
OOP可以通过扩展一个类来建立另一个新的类。======继承
4.1.2对象三个特征
对象的行为:可以对对象施加哪些操作,或者可以对对象施加哪些方法
对象的状态:当施加哪些方法时,对象如何响应
对象的标识:如何辨别具有相同行为与状态的不同对象?
对象状态的改变必须通过调用方法实现(如果不通过方法调用就可以改变对象的状态,说明封装性遭到了破坏)
4.1.3识别类
首先从设计类开始,然后在往每个类中添加方法
识别类的简单规则是在分析问题的过程中寻找名词,而方法对应着动词。
4.1.4类之间的关系
依赖 聚合 继承
依赖(uses-a)关系:如果一个类的方法操纵另一个类的对象。对于将互相依赖的类减少至最小,称为让类之间的耦合度最小。
聚合(has-a)关系:类A的对象包含类B的对象
继承(is-a)关系
4.2使用预定于类
4.2.1对象与对象变量
构造对象-----指定其初始状态-------对对象应用方法
Java中使用构造器来构造新实例,构造器的名字应该与类名相同。对于构造器而言,必须
首先初始化变量deadline。可以用新构造的对象初始化这个变量deadline=new Date();
可以让这个变量引用一个已经存在的对象Date birthday=new Date(); deadline=birthday;
注意:一个对象变量并没有实际包含一个对象,而仅仅引用一个对象。
在Java中任何对象的值都是对存储在另外一个地方的对象的引用。new操作符返回值也是一个引用。
Date deadline=new Date();有两个部分。
表达式new Date()构造了一个Date类型的对象,并且它的值是对新创建对象的引用。这个引用存储在变量deadline中。
局部变量不会自动地初始化为null而必须通过调用new或将它们设置为null进行初始化。
4.2.2Java类库中的GregorianCalendar类
时间是用距离一个固定时间点的毫秒数表示。
类库设计者决定将保存时间与给时间点命名分开,所以标准Java类库分别包括了两个类:一个是用来表示时间点的Date类,另一个是用来表示日历表示法的GregorianCalendar类。
Date类只提供了少量的方法来比较两个时间点。例如before和after方法分别表示早和晚;Date类还有getDay、getMonth、getYear等方法。
4.2.3更改器方法与访问器方法
如何从封装的GregorianCalendar类对象内部的日期获得当前的年月日?
使用类中的get方法。 还有set方法 add方法
4.3用户自定义类
当使用多个源文件时,可以1使用通配符调用 Java编译器。java Employee*.java
2或者键入命令 :Java EmployTest.Java 虽然没有显示地调用,但是当这个类中使用了前一个类时,系统就是自动地搜索前一个类。
注意在构造器中不要定义与实例域重名的局部变量。
在编写类的成员函数时,如果需要使用类内部变量可以在成员函数中使用this调用
对于封装而言,不要编写返回引用可变对象的访问器方法。这样会破坏类的封装性,如果需要返回一个可变对象的引用,应该首先对它进行克隆(clone)。对象clone是指存放在另一个位置上的对象副本。
对于final实例域,构建对象时必须初始化这样的域。即必须保证在每一个构造器执行之后,这个域的值被设置,在之后的操作中不能对它进行修改。
4.4静态域与静态方法
4.4.1静态域:static,每个类中只要一个这样的域。每一个对象对于所有的实例域却都有自己的一份拷贝。可以知道静态域属于类不属于任何独立的对象。
4.4.2静态常量
public static final double Pi=3.13;若static被省略,就会变成实例域
4.4.3静态方法
静态方法是一种不能向对象实施操作的方法,同样没有this参数
静态方法中不能访问实例域,但是可以访问自身类中的静态域
下面两种情况使用静态方法
1一个方法不需要访问对象状态,其所需的参数都是通过显示参数提供。
一个方法只需要访问类的静态域
4.4.5main()方法
不对任何对象进行操作实际上,再启动程序时还没有任何一个对象。静态的main方法将执行并创建程序所需要的对象
4.5方法参数
Java总是按值调用表示方法接收到的是调用者提供的值。
可以修改传递引用所对应的变量值,而不能修改传递值调用所对应的变量值。
Java对对象采用的不是引用调用。对象引用进行的是值传递。
4.6对象构造
1.重载
2默认域的初始化
如果在构造器中没有显示的给域赋予初始值,那么就会自动地赋予默认值
数值为0,布尔值为false 对象引用为null
初始化数据域有多种途径,所有列出构造过程的所有路径可能相当混乱,调用构造器的具体步骤:
1所有数据域被初始化为默认值(0.false或null)
2按照在类声明中出现的次序、依次执行所有域初始化语句和初始化块
3如果构造器第一行调用了第二个构造器,则执行第二个 构造器主体
4执行这个构造器的主体。
4.7 包
Java使用包将类组织起来。标准Java类分布在多个包中包括Java.lang java.util java.net中
标准的Java包具有一个层次结构中。所有标准的Java包都处于Java和Javax包层中。
1.类的导入
一个类可以使用所属包中的所有类,以及其他包中的公有类。有两种方式访问另一个包中的共有类。第一是在每个类名之前添加完整的报名 java.util.Date.today=new java.util.Date();
更常用的方式是使用import语句,就可以不必写出包的全名了
import Java.util.*;
如果导入的包中的类名相同,则可以进一步具体化
4.7.3将类放在包中
要想讲一个类放入包中,就必须将包的名字访问源文件的开头,包中定义类的代码之前
package com.hrsrman.corejava;
如果没有在源文件中防止package语句,那么源文件中的类就会被放在一个默认包中。
将包中的文件放在完整的包名匹配的子目录中。编译器将类文件也将放在相同的目录结构中
对于没有指定public和private的部分可以被同一个包中的所有方法访问。
4.8类路径 类路径必须与包名相匹配
4.10类的设计技巧
1一定要保证数据私有
2一定要对数据初始化
3不要在类中使用过多的基本类型
4不是所有的域都需要独立的域访问器和域更改器
5将职责过多的类进行分解
6类名和方法要能够体现它的职责
java核心技术(第四章)对象与类的更多相关文章
- [Java核心技术]第四章-对象与类(4.1-4.6总结)
4.1面向对象程序设计概述 OOP(面向对象编程Object Oriented Programming) OOP中数据第一位,算法第二位. 类 封装:关键在于不能让其他方法直接访问类的实例域,程序仅通 ...
- [core java学习笔记][第四章对象与类]
4.3 用户自定义类 4.3.1 类数组的声明 需要两次new Employee[]=staff=new Employedd[3]; staff[0]=new Employedd(参数列表); sta ...
- Java核心技术第四章——3.对象构造
重载: 如果多个方法(包含构造方法)有相同的名字.不同的参数,便产生重载.编译器必须挑选出具体执行哪个方法,它通过用各个方法给出的参数类型与特定方法调用所使用的值类型进行匹配挑选出相对应的方法. 如果 ...
- Java核心技术第四章——2.final 和 static
final实例域 实例域(对象的属性)可修饰为final.修饰为final后,在构建对象时必须初始化这个实例域.若没有在实例域进行初始化,那么必须在每个构造器内初始化这个实例域(否则会编译错误). 表 ...
- Java核心技术第五章——2.Object类
Object类:所有类的超类 Object类是Java中所有类的始祖,在Java中每个类都是由它扩展而来的.但是并不需要这样写: public class Emloyee extends Object ...
- Java核心技术第四章——1.封装性
封装性(有时称为数据隐藏): 实现封装的关键在于绝对不能让类中的方法直接地访问其他类的实例域值.程序仅通过对象的方法与对象的数据进行交互. 给对象赋予了"黑盒"的特征,提高了重用性 ...
- Java核心技术第五章——1.类、超类、子类(2)
继上一篇Java核心技术第五章——1.类.超类.子类(1) 6.重载解析 假如调用ClassName.Method(args) 1.编译器列出类ClassName所有名为Method的方法. 2.编译 ...
- 自制Java虚拟机(四)-对象、new、invokespecial
自制Java虚拟机(四)-对象.new.invokespecial 一.对象的表示 刚开始学Java的时候,图书馆各种教程,书名往往都是“Java面向对象高级编程”,通常作者都会与C++做个比较,列出 ...
- “全栈2019”Java多线程第四章:设置和获取线程名称
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...
- “全栈2019”Java异常第四章:catch代码块作用域详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java异 ...
随机推荐
- mysql远程服务密码修改
GRANT ALL PRIVILEGES ON *.* TO root@"%" IDENTIFIED BY "root"; FLUSH PRIVILEGE ...
- 五十六. playbook基础 、 playbook进阶
1.playbook练习 安装Apache并修改监听端口为8080 修改ServerName配置,执行apachectl -t命令不报错 设置默认主页hello world 启动服务并设开机自启 ...
- [洛谷201704R1]开心派对小火车
OJ题号:洛谷P3697 思路: 贪心.首先从起点出发,开特急电车,对于每一个特急车站$s_{i}$,分别下一次车,计算从当前车站$s_{i}$出发坐各停电车在指定时限内$t$最远能够到达的车站$r_ ...
- 【csp模拟赛3】flowers.cpp--循环节
题目描述 小 Q 最终还是过了独木桥. 前方的地上散落着 B 朵樱花,此时刮起了风,便引来一场樱花雨. 樱花雨一共持续了 N 秒.每一秒都会有 A 朵樱花飘落.小 Q 细心的记录了每一秒时间 后地上樱 ...
- tarjan模板(带注释)
//dfsn[x]记录x节点有没有被访问过,有,则是第几个 //lowlink[x]记录x能到的祖先中编号最小的 //dfs_clock是个编号累计器 //scc记录一个 inline void df ...
- 7.26T2某不科学的迷你激光炮
题目描述 身为课代表的她,下课总愿意帮老师发作业.老师的作业好多好多啊,一天 下来,她下课休息时间也无几了…… 要是天花板上有一只激光炮该多好啊!把作业塞到激光炮里面,轰——一排 同学该都拿到作业了吧 ...
- java生成zip包兼容Linux
/* 这个方法只用在windows中用服务器为Linux就不行 */ package common.util; import java.io.File;import java.io.FileInput ...
- gym224647B
gym224647B 题意: 在二维平面中·选出一个面积最小的三角形,输出这个三角形面积的两倍. 解法: 首先,最优解一定在相邻最近的三个点中产生. 然后我们就可以用向量求三角形的面积. CODE: ...
- eclipse将web项目部署到tomcat
在 eclipse 中,选择 Window--->Preferences--->Server--->Runtime Environments,选择 Add 按钮 在弹出的对话框中,选 ...
- @EnableTransactionManagement的使用
Spring Boot 使用事务非常简单,首先使用注解 @EnableTransactionManagement 开启事务支持后,然后在访问数据库的Service方法上添加注解 @Transactio ...