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异 ...
随机推荐
- qt 布局管理按钮控件间有空隙?
定义了几个按钮控件,想要按钮间没有空隙,我使用setspaces(0)来设置它们之间的间隔. 结果控件间还是有空隙,如图 我对控件所在的widget的背景进行设置,(会把style传到子控件)发现结果 ...
- Screen 用法简述
Screen是一款由GNU计划开发的用于命令行终端切换的自由软件.用户可以通过该软件同时连接多个本地或远程的命令行会话,并在其间自由切换.GNU Screen可以看作是窗口管理器的命令行界面版本.它提 ...
- codeforces#1217D. Coloring Edges(图上染色)
题目链接: https://codeforces.com/contest/1217/problem/D 题意: 给图染上$k$种颜色,相同颜色不能形成一个环 数据范围: $1\leq n \leq 5 ...
- jinja2-模版继承
一 简要 简单的来说模板继承包含基本模板和子模板.其中基本模板里包含了你这个网站里的基本元素的基本骨架,但是里面有一些空的或者是不完善的块(block)需要用子模板来填充. 二 基本模版样例 这个模板 ...
- 网络文件共享服务—vsftpd服务
文件传输协议(FTP) 文件传输协议:File Transfer Protocol是用于在网络上进行文件传输的一套标准协议,使用客户/服务器模式.它属于网络传输协议的应用层. 服务器端:vsftpd ...
- AcFun 的视频架构演化实践——阅读心得
视频的核心技术栈 AcFun 弹幕视频网(acfun.tv)是中国最早上线的弹幕视频网站,也是最具影响力的弹幕视频平台.“AcFun”原取意于“AnimeComic Fun”.自2007年6月6日成立 ...
- centos7 - nginx配置安装phpmyadmin
原文 https://www.linuxidc.com/Linux/2017-10/147556.htm 使用Nginx搭建phpMyAdmin Nginx有什么用? Nginx可读作Engin ...
- Python3 编程之字符串处理
Python3 编程之字符串处理 在编程中最常见的任务就是字符串的处理,So,学好字符串的使用非常重要 一.变量的定义规范 Python中声明变量时,要符合以下规则为准: 只能使用数字.字母.下划线组 ...
- javascript-类型、值和变量
基本类型和引用类型 MDN-JavaScript 数据类型和数据结构 ECMAScript 变量可能包含两种不同数据类型的值:基本类型值和引用类型值.基本类型值指的是 简单的数据段,而引用类型值指那些 ...
- spring data jpa实现多条件查询(分页和不分页)
目前的spring data jpa已经帮我们干了CRUD的大部分活了,但如果有些活它干不了(CrudRepository接口中没定义),那么只能由我们自己干了.这里要说的就是在它的框架里,如何实现自 ...