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核心技术(第四章)对象与类的更多相关文章

  1. [Java核心技术]第四章-对象与类(4.1-4.6总结)

    4.1面向对象程序设计概述 OOP(面向对象编程Object Oriented Programming) OOP中数据第一位,算法第二位. 类 封装:关键在于不能让其他方法直接访问类的实例域,程序仅通 ...

  2. [core java学习笔记][第四章对象与类]

    4.3 用户自定义类 4.3.1 类数组的声明 需要两次new Employee[]=staff=new Employedd[3]; staff[0]=new Employedd(参数列表); sta ...

  3. Java核心技术第四章——3.对象构造

    重载: 如果多个方法(包含构造方法)有相同的名字.不同的参数,便产生重载.编译器必须挑选出具体执行哪个方法,它通过用各个方法给出的参数类型与特定方法调用所使用的值类型进行匹配挑选出相对应的方法. 如果 ...

  4. Java核心技术第四章——2.final 和 static

    final实例域 实例域(对象的属性)可修饰为final.修饰为final后,在构建对象时必须初始化这个实例域.若没有在实例域进行初始化,那么必须在每个构造器内初始化这个实例域(否则会编译错误). 表 ...

  5. Java核心技术第五章——2.Object类

    Object类:所有类的超类 Object类是Java中所有类的始祖,在Java中每个类都是由它扩展而来的.但是并不需要这样写: public class Emloyee extends Object ...

  6. Java核心技术第四章——1.封装性

    封装性(有时称为数据隐藏): 实现封装的关键在于绝对不能让类中的方法直接地访问其他类的实例域值.程序仅通过对象的方法与对象的数据进行交互. 给对象赋予了"黑盒"的特征,提高了重用性 ...

  7. Java核心技术第五章——1.类、超类、子类(2)

    继上一篇Java核心技术第五章——1.类.超类.子类(1) 6.重载解析 假如调用ClassName.Method(args) 1.编译器列出类ClassName所有名为Method的方法. 2.编译 ...

  8. 自制Java虚拟机(四)-对象、new、invokespecial

    自制Java虚拟机(四)-对象.new.invokespecial 一.对象的表示 刚开始学Java的时候,图书馆各种教程,书名往往都是“Java面向对象高级编程”,通常作者都会与C++做个比较,列出 ...

  9. “全栈2019”Java多线程第四章:设置和获取线程名称

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  10. “全栈2019”Java异常第四章:catch代码块作用域详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java异 ...

随机推荐

  1. 用pyinstaller打包python程序、打包pyqt程序

    将.py脚本拷贝到一个文件夹中: 然后shift+右键,打开Powershell窗口: -F:设置打包为一个.exe文件.(缺点打开速度慢,不加-F则不打包为一个.exe,优点简洁方便) -w:设置不 ...

  2. Codeforces Round #588 (Div. 2) D题【补题ING】

    思路:先找出现次数>=2数.然后在取跑所有数,需要考虑一般情况(当一个人比另一个人的ai小且他们的与运算等于小的那个人的ai那么可以知道大的那个人必定强于ai小的那个人). 则可以用位运算实现判 ...

  3. Linux下的电路设计辅助软件

    造冰箱的大熊猫@cnblogs 2019/8/21 最近调研了以下开源的电路设计辅助软件(EDA),汇总如下 1.gEDA 官网:geda-project.org 老牌的开源EDA软件,诞生于上世纪9 ...

  4. CSP-S模拟测试 88 题解

    T1 queue: 考场写出dp柿子后觉得很斜率优化,然后因为理解错了题觉得斜率优化完全不可做,只打了暴力. 实际上他是可以乱序的,所以直接sort,正确性比较显然,贪心可证,然后就是个sb斜率优化d ...

  5. 【概率论】4-6:协方差和相关性(Covariance and Correlation)

    title: [概率论]4-6:协方差和相关性(Covariance and Correlation) categories: - Mathematic - Probability keywords: ...

  6. Linux之信号

    产生信号五种方法: 按键产生:ctrl+c.ctrl+z.ctrl+\ 系统调用产生:如kill.raise.baort 软件条件产生:如定时器alarm 硬件异常产生:非法访问内存(段错误).除0( ...

  7. 内存管理2-set方法的内存管理-程序解析

    创建class Book .h 有@ property float price;  //@synthesize 自动 ------------ 创建class Student #import &quo ...

  8. jenkins之自动化部署github上maven项目

    部署流程:将代码从github上拉取下来,使用maven打包,将打包后的jar通过ssh发送到服务器上,然后构建docker镜像,运行容器. 1.安装插件 如果是第一次使用jenkins,需要检查并确 ...

  9. 修改oracle用户登录密码

    运行sqlplus进入输入密码界面 用户名输入: connect as sysdba 密码:这边乱输就可以了 然后进行输入下面的命令: 修改密码命令 alter user system identif ...

  10. 黑马vue---31-32、vue过滤器实例

    黑马vue---31-32.vue过滤器实例 一.总结 一句话总结: vue内部的东西,无论是过滤器还是组件,都是键值对的方式 1.过滤器的定义语法? Vue.filter('过滤器的名称', fun ...