资讯专栏INFORMATION COLUMN

《Java编程思想》读书笔记-类与对象

NickZhou / 1350人阅读

摘要:类最基本的作用,在于通过类获取到相应的对象,在向对象发送消息时以期望对象做某些特定的事情。先导概念引用中一切皆对象,因此采用一个指向对象的引用来操纵对象。对象可以存活于作用域之外。

欢迎各位读者关注我的微信公众号,共同探讨Java相关技术。生命不止,学习不休!

也许你慢慢地对程序有了这样的认识:程序只是一些列带有方法的对象的组合,这些方法以其它对象为参数,可在任何地方返回,并发送消息给其他对象。这样的认识,目前来说,是对的。
一览焦点

Java中的类

新建的对象去了哪里

谁来安置无家可归的对象

总结

Java中的类
决定了对象的外观与行为。Java中用class关键字来对类进行定义。

在Java中,允许程序员定义一个新的数据类型来满足其应用的需求。其形式为class后跟上新类型的名称。比如:

class NewTypeName {
    //class definition
}

通过以上代码,你就定义了一个新的名为NewTypeName的数据类型。类型名称可以由程序员自己定义,而class关键字是必须的、大小写敏感的,一定不能写错。但是单纯地定义一个空类定义的类,是没有任何意义的。

类最基本的作用,在于通过类获取到相应的对象,在向对象发送消息时,以期望对象做某些特定的事情。
类的内部结构

在对类进行定义后,就可以在类中设置以下两种类型的元素:字段和方法。

先导概念

引用:Java中一切皆对象,因此采用一个指向对象的引用来操纵对象。

引用具有操作对象的能力

引用不一定需要有一个对象与之关联

基本数据类型:Java中对于小而简单的变量,采用对象的形式表示会导致原本轻量的变量变得无比厚重且耗费内存空间。所以Java中定义了8种基本数据类型,其直接存储值,并置于虚拟机栈中。每种基本数据类型所占存储空间大小恒定不变。

所有数值类型都有正负号

boolean类型所占用的存储空间的大小没有明确指定,仅能取字面值true或false

基本数据类型都有其对应的包装类型

对于高精度的数字,需要用BigInteger(支持任何精度的整数)或BigDecimal(支持任何精度的定点数)来表示,二者没有对应的基本类型

基本数据类型如下表

基本类型 大小 包装类型
boolean - Boolean
char 16bit Character
byte 8bit Byte
short 16bit Short
int 32bit Integer
long 64bit Long
float 32bit Float
double 64bit Double

字段

字段可以是基本数据类型中的一种,也可以是任何类型的对象,可以通过其引用与其所指向的对象。如果是对某个对象的引用,那么必须通过初始化使其与一个实际的对象关联。

如何引用对象中的某个字段

对象名称.字段名称

示例

class NewTypeName {
    int i;
    int j;
    int k;

    public static void main(String [] args) {
        NewTypeName type = new NewTypeName();
        //此处type是对象的名称,其是一个引用,i/j/k分别是NewTypeName这个类中的字段
        type.i = 1;
        type.j = 2;
        type.k = 3;
    }
}

基本成员默认值

如果是基本数据类型并作为类的成员使用时,即使没有初始化,也会确保其有一个默认值,默认值如下表所示:

基本类型 默认值
boolean false
char "u0000"(null)
byte 0
short 0
int 0
long 0l
float 0.0f
double 0.0d

如果是基本类型且作为方法的局部变量使用时,获取的默认值可能为人一直

如果是引用类型,在没有进行初始化的情况下,默认为null

方法

Java中方法用来表示用用来做某些事情的方式。方法的基本构成部分包括:方法名称、参数、返回值和方法体

一个方法的基本形式

ReturnType methodName(String arg1, Integer arg2) { /* Method Body */ }

构件解析

返回类型:描述方法在调用之后返回的值

方法名称:程序员自定义的方法的名称

参数列表:描述了要从外部传递给方法体的参数的类型和名称

方法体:描述一个方法实际要做的事情

方法名称和参数列表合起来称为“方法签名”,其唯一确定地标识出某个方法

在Java中,参数总是以值的形式进行传递。如果是基本数据类型,则传递的是类型的真值;如果是引用类型,则传递的是引用的值。Java中不存在引用传递
return关键字在Java的方法中表示返回,存在如下两种情况:

如果返回类型不为void,则在return后要跟上与返回类型相兼容的值

如果返回类型为void,则return关键字的作用只是用来退出方法,不必在return后跟任何返回值

新建的对象去了哪里
在Java中,创建了一个引用变量后,最安全的方案就是为其绑定一个实际存在的对象,能有效防止恼人的NullPointerException(空指针异常);
对象来自哪里

Java中通过new操作符来实现对象的创建,其基本形式为:

new NewTypeName();

其中new关键字,表示向堆中申请内存;NewTypeName表示一个数据类型,在申请到内存空间后,会以这个数据类型为模板进行对象的实例化;实例化完成后,会对对象中的字段进行默认值填充。

对象存储到什么地方

在Java中有5个不同的地方可以进行数据存储:

寄存器:位于处理器内部,是最快的存储区,不能由程序进行直接控制

虚拟机栈:位于随机访问存储器(RAM)中,通过栈指针的移动进行内存分配以及内存回收,遵循上释放下分配的原则;这一区域主要存放基本数据类型及数据引用

堆:位于RAM中,是一种通用的存储池,对象存储的地方。在此处,编译器不需要知道存储的数据在堆里的生命周期,而由垃圾回收期进行管理

常量存储:常量值通常直接存放在程序代码内部

非RAM存储:可完全存活于程序外的数据。如流对象和持久化对象

谁来安置无家可归的对象
无家可归的对象,意味着没有引用指向该对象,该对象找不到它的归属。

在大多数语言中,都存在作用域的概念。作用域决定了在其内部定义的变量名的可见性和生命周期。在Java中不允许嵌套的作用域中,较小的作用域拥有与较大的作用域相同的变量,如下代码无法通过编译:

//此处的代码无法实际运行,只做演示
{
    int x = 11;
    {
        int x = 12;
    }
}

Java中贯彻了一切都是对象的观念。对象不具备和基本数据类型一样的生命周期。对象可以存活于作用域之外

如以下代码:

{
    String s = new String("Hello World");
}//运行到这里,s已经在作用域之外

在上述代码中,在超过作用域之后,引用变量s的生命周期已经结束,但"Hello World"这个String对象却依旧存在。其生存于堆中,只是我们再没有引用变量来指向这个对象了,因此这个对象对于我们来说是不可见的。

那么另外一个问题是,Java是如何来保障这些没有引用变量指向的对象不会把内存塞爆的呢?Java采用了垃圾回收器,用来监视所有用new关键字创建的对象,如果一个对象不再被引用,那么垃圾收集器便会在随后的内存回收活动中销毁该对象,并释放其所占用的内存。因此,Java程序员是不需要太在乎内存的回收的。

总结

本文主要以Java的类为切入点,描述了从类到对象的创建,然后到对象的存放和销毁的整个流程。由于我们大多数的时间都是在创建新的类来满足我们的业务需求,因此一个类的内部结构异常重要,好的结构能最大化地提升程序运行效率。这涉及到后面讲解的设计模式,在此只对类的构成作一个了解。

在下一节中,我们尝试运用目前已学习的内容,来完成我们的第一个Java程序。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/77432.html

相关文章

  • Java编程思想读书笔记-对象导论

    摘要:而面向对象则是向程序员提供表示问题空间中元素的工具,我们将问题空间中的元素及其在解空间中的表示称为对象。为什么要把对象看作是服务提供者呢这是将问题分解为对象集合的一种合理方式。职能太多,可能会导致对象的内聚性降低。在试图将子类对象当作其基类 计算机是头脑延伸的工具,是一种不同类型的表达媒体。本文以背景性的和补充性的材料,介绍包括开发方法概述在内的面向对象程序设计(Object-orie...

    NickZhou 评论0 收藏0
  • Java应用架构设计:模块化模式与OSGi》读书笔记

    摘要:本书概括以软件系统为例,重点讲解了应用架构中的物理设计问题,即如何将软件系统拆分为模块化系统。容器独立模块不依赖于具体容器,采用轻量级容器,如独立部署模块可独立部署可用性模式发布接口暴露外部配置使用独立的配置文件用于不同的上下文。 本文为读书笔记,对书中内容进行重点概括,并将书中的模块化结合微服务、Java9 Jigsaw谈谈理解。 本书概括 以Java软件系统为例,重点讲解了应用架构...

    seanHai 评论0 收藏0
  • java 8 实战》读书笔记 -第十三章 函数式的思考

    摘要:当我们希望能界定这二者之间的区别时,我们将第一种称为纯粹的函数式编程,后者称为函数式编程。函数式编程我们的准则是,被称为函数式的函数或方法都只能修改本地变量。另一种观点支持引用透明的函数式编程,认为方法不应该有对外部可见的对象修改。 一、实现和维护系统 1.共享的可变数据 如果一个方法既不修改它内嵌类的状态,也不修改其他对象的状态,使用return返回所有的计算结果,那么我们称其为纯粹...

    Donne 评论0 收藏0
  • SegmentFault 技术周刊 Vol.32 - 七夕将至,你的“对象”还好吗?

    摘要:很多情况下,通常一个人类,即创建了一个具体的对象。对象就是数据,对象本身不包含方法。类是相似对象的描述,称为类的定义,是该类对象的蓝图或原型。在中,对象通过对类的实体化形成的对象。一类的对象抽取出来。注意中,对象一定是通过类的实例化来的。 showImg(https://segmentfault.com/img/bVTJ3H?w=900&h=385); 马上就要到七夕了,离年底老妈老爸...

    李昌杰 评论0 收藏0
  • SegmentFault 技术周刊 Vol.32 - 七夕将至,你的“对象”还好吗?

    摘要:很多情况下,通常一个人类,即创建了一个具体的对象。对象就是数据,对象本身不包含方法。类是相似对象的描述,称为类的定义,是该类对象的蓝图或原型。在中,对象通过对类的实体化形成的对象。一类的对象抽取出来。注意中,对象一定是通过类的实例化来的。 showImg(https://segmentfault.com/img/bVTJ3H?w=900&h=385); 马上就要到七夕了,离年底老妈老爸...

    Lyux 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<