Java基础(三)对象与类

时间:2022-10-15 14:44:39

  1.类的概念:类是构造对象的模板或蓝图。由类构造对象的过程称为创建类的实例。

  2.封装的概念:封装(有时称为数据隐藏)是与对象有关的一个重要概念。对象中的数据称为实例域,操纵数据的过程称为方法。对于每个特定的类实例(对象)都有一组特定的实例域值。这些值的几个就是这个对象的当前状态。无论何时,只要向对象发送一个消息,它的状态就有可能发生改变。实现封装的关键在于绝对不能让类中的方法直接地访问其他类的实例域。程序仅通过对象的方法与对象数据进行交互。封装给对象赋予了“黑盒”特征,这是提高重用性和可靠性的关键。这意味着一个类可以全面地改变存储数据的方式,只要仍旧使用同样的方法操作数据,其他对象就不会知道或介意所发生的变化。

  3.对象的三个主要特性:

  • (1)行为--可以对对象施加哪些操作,或可以对对象施加哪些方法
  • (2)状态--当施加那些方法时,对象如何响应
  • (3)标识--如何辨别具有相同行为与状态的不同对象

  4.类之间的关系:

  • 依赖(uses-a):如果一个类的方法操纵另一个类的对象,就说一个类依赖于另一个类。
  • 聚合(has-a):聚合关系意味着类A的对象包含类B的对象。
  • 继承(is-a):如果类A扩展类B,类

  5.封装的优点

  如果需要获得或设置实例域的值,应该提供下面三项内容:

  • 一个私有(private)的数据域
  • 一个公有的(public)域访问器方法(get())
  • 一个公有的(public)域更改器方法(set())

  这样做的好处是,私有的数据域一旦在构造器中设置完毕,就只能通过公有的域访问器方法对这个私有域进行访问,同时也只能通过公有的域更改器对这个私有域进行修改。一旦这个域值出现了错误,只用调试这个方法就可以了,如果域是public的,破坏这个域的捣乱者可能会出现在任何地方。

  6.私有方法

  如果希望将一个计算代码划分成若干个独立的辅助部分,通常,这些辅助方法不应该成为公有接口的一部分,这是因为它们往往与当前的实现机制非常紧密,或者需要一个特别的协议以及一个特别的调用次序。最好将这样的方法设计为private的,因为private方法只能当前类的方法调用,而外部类无法调用。

  对于私有方法,如果改用其他方法实现相应的操作,则不必保留原有的方法。只要方法是私有的,类的设计者就可以确信:它不会被外部的其他类操作调用,可以将其删去。如果方法是公有的,就不能将其删去,因为其他的代码很可能依赖它。

  7.final实例域

  将实例域定义为final时,在构造对象时必须初始化这样的域。也就是说,必须确保在每一个构造器执行之后,这个域的值被设置,并且在后面的操作中,不能够再对它进行修改。

  8.静态域

  如果将域定义为static,每个类中只有一个这样的域,而每一个对象对于所有的实例域却都有自己的一份拷贝。

class Employee{
private static int nextId = 1; private int id;
}

  例如,每一个雇员对象都有自己的id域,但这个类的所有实例将共享一个nextId域。也就是说,如果有1000个Employee类的对象,则有1000个实例域id。但是,只有一个静态域nextId。即使没有一个雇员对象,静态域nextId也存在。它属于类,而不属于任何独立的对象。

  9.静态常量

public class Math{

public static final double PI = 3.14159265358979323846;

...
}

  如果关键字static被省略,PI就变成了Math类的一个实例域。需要通过Math类的对象访问PI。并且每一个Math对象都有它自己的一份拷贝。如果使用了static,PI就属于Math类,也就是说,任何调用Math类中PI的值都是唯一的,只有一个。也不用通过Math类的对象才能访问。同时,前面提到过,最好将实例域设计为private,但是公有常量(final域)设置为public却没有问题,因为PI被声明为final为不可变,所以,不允许再将其他值赋给PI。

  10.静态方法

  静态方法是一种不能向对象实施操作的方法。使用静态方法时不需要任何类的对象。

public static int getNextId(){

      return nextId;
}

  Employee类的静态方法不能访问Id实例域,因为它不能操作对象。但是,静态方法可以访问自身类中的静态域。

  可以通过类名调用这个方法。如果省略了static,那么需要通过Employee类对象的引用调用这个方法。

int n = Employee.getnextId();

  在下面的两种情况下使用静态方法:

  • 一个方法不需要访问对象状态,其所需参数都是通过显示参数提供的。(例如,Math.pow(x,a))
  • 一个方法只需要访问类的静态域(例如,Employee.getnextId())

  11.静态代码块

29    // 静态初始化块
30 static
31 {
32 Random generator = new Random();
33 // 设置nextId为0到9999的随机数
34 nextId = generator.nextInt(10000);
35 }

  在类的构造方法之前,如果对类的静态域进行初始化的代码比较复杂,那么可以使用静态的初始化块。将初始化代码放在一个块中,并标记关键字static。

  这样,在类第一次加载的时候,将会对静态域进行初始化。与实例域一样,所有的静态初始化代码块都将依照类定义的顺序执行。

  12.包作用域

  • 标记为public的类、方法或常量可以被任意的类使用。
  • 标记为private的类、方法或常量只能被定义它们的类使用。
  • 如果没有指定public或private,这个类、方法或常量可以被同一个包中所有方法访问。

  13.类设计技巧

  • 一定要保证数据私有

  绝对不要破坏封装性。有时候需要编写一个访问器或修改器方法,但是最好还是保持实例域的私有性。数据的表示形式很可能会改变,但它们的使用方式却不会经常发生变化。当数据保持私有时,它们的表示形式的变化不会对类的使用者产生影响,即使出现bug也易于检测。

  • 一定要对数据初始化

  最好不要依赖于系统的默认值,而是应该显示地初始化所有的数据。具体的初始化方式可以是提供默认值,也可以是在所有构造器中设置默认值。

  • 不要在类中使用过多的基本类型

  即用其他的类代替多个相关的基本类型的使用,这样会使类更加易于理解且易于修改。

  例如:Customer类中包括很多实例域,其中有实例域street,city和state,可以将这三个实例域拿出来用一个Address的新的类替换,从而可以减少Customer类中的实例域个数。

  • 不是所有的域都需要独立的域访问器和域修改器

  如果有一些不希望别人访问或者修改的域,就不要设置域访问器或域修改器。要根据实际情况和实际需求来设置。

  • 将职责过多的类进行分解

  一种情况是将实现很多功能的类分解成几个不同的类,这些类分担原来的类的所有的职责。

  • 类名和方法名要能够体现它们的职责
  • 优先使用不可变的类

  更改对象的问题在于,如果多个线程试图同时更新一个对象,就会发生并发更改。其结果是不可预料的。如果类是不可变的,就可以安全地在多个线程间共享其对象。

  

          

Java基础(三)对象与类的更多相关文章

  1. java基础(二) -对象和类

    Java 对象和类 Java作为一种面向对象语言.支持以下基本概念: 多态 继承 封装 抽象 类 对象 实例 方法 重载 对象:对象是类的一个实例(对象不是找个女朋友),有状态和行为.例如,一条狗是一 ...

  2. Java基础-日期格式化DateFormat类简介

    Java基础-日期格式化DateFormat类简介 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.DateFormat类概述 DateFormat 是日期/时间格式化子类的抽象 ...

  3. 关于Java中的对象、类、抽象类、接口、继承之间的联系

    关于Java中的对象.类.抽象类.接口.继承之间的联系: 导读: 寒假学习JavaSE基础,其中的概念属实比较多,关联性也比较大,再次将相关的知识点复习一些,并理顺其中的关系. 正文: 举个例子:如果 ...

  4. C#_02.13_基础三_.NET类基础

    C#_02.13_基础三_.NET类基础 一.类概述: 类是一个能存储数据和功能并执行代码的数据结构,包含数据成员和函数成员.(有什么和能够干什么) 运行中的程序是一组相互作用的对象的集合. 二.为类 ...

  5. Java入门 - 语言基础 - 04.对象和类

    原文地址:http://www.work100.net/training/java-object-class.html 更多教程:光束云 - 免费课程 对象和类 序号 文内章节 视频 1 概述 2 J ...

  6. Java基础语法(自定义类、ArrayList集合)

    Java基础语法 今日内容介绍 u 自定义类 u ArrayList集合 第1章 引用数据类型(类) 1.1 引用数据类型分类 提到引用数据类型(类),其实我们对它并不陌生,如使用过的Scanner类 ...

  7. Java基础---IO(二)--File类、Properties类、打印流、序列流(合并流)

    第一讲     File类 一.概述 1.File类:文件和目录路径名的抽象表现形式 2.特点: 1)用来将文件或文件夹封装成对象 2)方便于对文件与文件夹的属性信息进行操作 3)File类的实例是不 ...

  8. Java基础---其他对象

    第一讲     System类 一.概述 1.System是描述系统一些信息的类,类中的属性和方法都是静态的.不能被实例化,没有提供构造函数. 2.字段摘要 out:标准输出流.默认是控制台. in: ...

  9. Java基础(三)-final关键字分析

    今天来谈谈final关键字的作用, 虽然有很多博文关于final进行了很深的研究,但还是要去记录下谈谈自己的见解加深下印象.下面直接进入主题: 一.final关键字的作用 1.被final修饰的类不能 ...

  10. Java基础——6种常用类讲解

    本文主要介绍几种Java中常用类的应用. 一.System类 从API当中我们可以看出,public final class System exends Object.System类包含一些有用的字段 ...

随机推荐

  1. ORACLE查看并修改session和连接最大数

    第一步,在cmd命令行,输入sqlplus 第二步,根据提示输入用户名与密码 1. 查看processes和sessions参数 SQL> show parameter processes NA ...

  2. ASP.NET 获取不同frame中的控件

    最近在做网站时遇到一个问题,需要获取不同frame中的控件,请教了一些同事,他们都说是无法取到的, 在网上查找了很多资料,找到了解决方法,现在整理一下当初的解决思路: 1.我需要在mainFrame中 ...

  3. [BZOJ 2656][ZJOI2012]数列(递归+高精度)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=2656 分析: 很容易想到递归分治,但遇到奇数时候f[i]=f[i/2]+f[i/2+1 ...

  4. BZOJ 3379: [Usaco2004 Open]Turning in Homework 交作业

    Description     贝茜有C(1≤C≤1000)门科目的作业要上交,之后她要去坐巴士和奶牛同学回家. 每门科目的老师所在的教室排列在一条长为H(1≤H≤1000)的走廊上,他们只在课后接收 ...

  5. 关于Spring的注入方式

      spring的三种注入方式: 接口注入(不推荐) getter,setter方式注入(比较常用) 构造器注入(死的应用) 关于getter和setter方式的注入: autowire=" ...

  6. OO第二单元作业总结【自我反思与审视】

    第二单元作业的完成史,就是一部心酸的血泪史…… 多线程的出现为我(们)打开一片广阔的天地,我也在这方天地摸爬滚打,不断成长!如果说第一单元之前还对Java语法有所了解的话,那么这单元学习多线程则完全是 ...

  7. LinkedList 利用的是尾插法

  8. sqlserver中将查询结果拼接成字符串

    #for xml path(param)--将查询结果以xml格式输出 select id,name from table1 for xml path --id和name为table1的真实字段 - ...

  9. Thinkphp5 分页带参数

    原文链接:http://www.zhaisui.com/article/51.html

  10. windows10 设置软件开机启动

    在 C:\Users\your_name\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup 在这个目录下,新建你想开机启动的软 ...