关于Java对象的理解

面向对象语言的五个基本特性

1)万物皆为对象。理论上可以抽取用作解决问题的任何概念化构件(哈士奇,防御塔等),将其表示为程序中的对象。
2)程序是对象的集合,通过发送消息来告知彼此所要做的。
3)每个对象都有自己的由其他对象所构成的存储。可以在程序中构件复杂的体系,同时将其复杂性隐藏在对象的简单性背后。
4)每个对象都拥有其类型。每个对象都是某个类的一个实例。
5)某一特定类型的对象都可以接受同样的消息。这意味着可以编写与“几何形”交互并自动处理所有与几何形性质相关的事物的代码。

用引用操纵对象

尽管一切可以看做对象,但操纵的标识符实际上是对象的一个“引用”。可以将这一切看作是遥控器(引用)来操纵电视机(对象)。此外,即使没有电视机,遥控器也可独立存在,也就是说拥有一个引用,并不一定需要有一个对象与之关联。

String s;

这里创建的只是引用,不是对象。此时s没有和任何事物关联。如果此时向s发送消息,会报错。因此,安全的做法是:创建一个引用同时初始化。

String s = “Hello World!”;

抽象数据类型 — 类

尽管我们在面向对象程序设计中实际上进行的是创建新的数据类型,但事实上所有的面向对象程序设计语言都是用 class 这个关键词来表示数据类型。类描述了具有相同特性(数据元素)和行为(功能)的对象集合,所以一个类实际上就是一个数据类型,一旦类被建立,就可以随心所欲地创建类的任何对象,然后去操作它们,就像它们是存在于你的待求解问题中的元素一样。

特例:基本类型

基本类型,不用 new 来创建变量,而是创建一个并非是引用的“自动”变量。这个变量直接存储“值”,并且置于堆栈中,因此更高效。
Java 要确定每种基本类型所占存储空间的大小,所有数值类型都有正负号。
在这里插入图片描述

高精度数字

Java 提供了两种用于高精度计算的类:BigInteger 和 BigDecimal。二者都没有对应的基本类型,但是,这两类包含的方法,提供的操作与对基本类型所能执行的操作相似。能作用于 int 或 float 的操作,也同样能作用于 BigInteger 和 BigDecimal。只不过必须以方法调用方式取代运算符方式来实现,以速度换取精度。
BigInteger 支持任意精度的整数。
BigDecimal 支持任意精度的浮点数。通常用作货币计算。

Java中的数组

当创建一个数组对象时,实际上就是创建了一个引用数组,并且每个引用都会自动被初始化为一个特定值,该值拥有自己的关键字 null,一旦 Java 看到 null,就知道这个引用还没有指向某个对象。再使用引用前,必须为其指定对象;如果试图使用一个还是 null 的引用,运行会报错。

访问控制

程序开发人员按照角色可分为类创建者(那些创建新数据类型的程序员)和客户端程序员(在其应用中使用数据类型的类消费者)。客户端程序员的目标是收集各种用来实现快速应用开发的类。类创建者的目标就是创建类,这种类只向客户端程序员暴露必需的部分,而隐藏其他部分。类创建者阻止客户端程序员操作类中的某些成员,这种操作叫做访问控制。

访问控制的第一个存在原因是让客户端程序员无法触及他们不应该触及的部分;第二个存在原因就是允许库设计者可以改变类内部的工作方式而不用会担心会影响客户端程序员。
Java 用三个关键字在类的内部设定边界:public, private, protected。public 表示紧随其后的元素对任何人都是可用的,private 这个关键字表示出类型创建者和类型的内部方法之外的任何人不能访问的元素,protected 关键字与 private 作用相当,差别仅在于继承的类可以访问 protected 成员,但不能访问 private 成员。

继承

创建一个类之后,即使另一个心新类与其具有相似的功能,还是得重新创建一个新类。如果能以现有的类为基础,复制它,然后通过添加和修改这个副本来创建新的类就方便多了。这就是继承,其中源类称为基类、超类或者父类,被修改的副本称为导出类、继承类或者子类。
当继承现有类型时,也就创造了新的类型。这个新的类型不仅包括现有类型的所有成员(尽管 private 成员被隐藏了起来,并不可访问),而且更重要的是它复制了父类的接口。也就是说所有可以发送给父类对象的消息同事也可以发送给到处类对象,也就意味着子类与父类具有相同的类型。
有两种方法可以让父类与子类产生差异。第一种:直接在子类中添加新方法。第二种:改变现有父类的方法的行为,也就是覆盖(overriding)。
单根继承:所有的类最终都继承自单一的父类,这个终极父类就是 Object。在单根继承结构中的所有对象都具有一个公共接口,所以他们归根到底都是相同的基本类型。单根继承结构保证所有对象都具备某些功能,所有对象都可以很容易地在堆上创建,而参数传递也得到了极大的简化。单根继承结构是垃圾回收器的实现变得容易。

对象的生命周期

在使用对象时,最关键的问题之一就是它们的生成和销毁方式。每个对象为了生存都需要资源,尤其是内存。当我们不再需要一个对象时,它必须被清理掉,使其被占用的资源可以得到释放和重用。
当用 new 创建一个 Java 对象时,它可以存活于作用域之外。

{
String s = new String(“Hello World!”);
}

引用 s 在作用域终点就消失了。但是 s 指向的 String 对象仍继续占据内存空间。由 new 创建的对象,只要需要,就会一直保留下去,要防止这些对象填满内存空间,就需要 Java 的垃圾回收器了。
对象的存放有两种方式:第一种通过将对象置于堆栈或静态存储区内来实现,这种方式将存储空间分配和释放置于优先考虑的位置,但是牺牲了灵活性,因为必须在程序编写时知道对象确切的数量、生命周期和类型;第二种方式是在被称为堆的内存池中动态创建对象,Java 采用这种方式,这种方式直到运行时才知道需要多少对象,他们的生命周期如何,以及它们的具体类型是什么。
对于允许在堆栈上创建对象的语言,编译器可以确定对象存活的时间,并可以自动销毁。然后如果在堆上创建对象,编译器就会对它的生命周期一无所知,Java 的垃圾回收器就是设计用来处理内存释放问题,垃圾回收器知道对象何时不再被使用,并自动释放对象占用的内存。

欢迎关注公众号:一盐难进

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值