【读书笔记】On Java 8 - 万物皆对象

阅读来源 - On Java 8 万物皆对象,如有侵权请联系删除

万物皆对象

相比 C++ ,Java 是一种更纯粹的面向对象编程语言。Java 语言假设你只进行面向对象编程。

1. 对象操纵
  • 所有的编程语言都会操纵内存中的元素,在 C/C++ 中,对象的操纵是通过指针来完成的。
  • 在 Java 中没有了指针的概念,所有操纵对象的标识符可以理解为对对象的引用。‘
2. 对象创建
  • Java 中使用new操作符来创建一个新对象。new 关键字代表:创建一个新的对象实例。
4. 数据存储

程序在运行时是如何存储的呢?尤其是内存是怎么分配的。有5个不同的地方可以存储数据。

  • 寄存器(Registers):最快的存储区域,寄存器的数量十分有限,按需分配。我们对其没有直接的控制权,也无法在自己的程序里找到寄存器存在的踪迹。
  • 栈内存(Stack):存在于常规内存 RAM(随机访问存储器,Random Access Memory)中,可通过栈指针获得处理器的直接支持。栈指针下移分配内存,上移释放内存。这是一种仅次于寄存器的非常快速有效的分配存储方式。创建程序时,Java 系统必须知道栈内保存的所有项的生命周期。这种约束限制了程序的灵活性。因此,虽然在栈内存上存在一些 Java 数据(如对象引用),但 Java 对象本身的数据却是保存在堆内存的。
  • 堆内存(Heap):通用的内存池(也在 RAM 区域),所有 Java 对象都存在于其中。与栈内存不同,编译器不需要知道对象必须在堆内存上停留多长时间。因此,用堆内存保存数据更具灵活性。这种灵活性是有代价的:分配和清理堆内存要比栈内存需要更多的时间。随着时间的推移,Java 的堆内存分配机制现在已经非常快,因此这不是一个值得关心的问题了。
  • 常量存储(Constant storage):常量值通常直接放在程序代码中,因为它们永远不会改变。如需严格保护,可考虑将它们置于只读存储器 ROM (只读存储器,Read Only Memory),有些常量也会存储到常量池中 java面试 : JAVA中 常量的储存位置
  • 非 RAM 存储(Non-RAM storage)数据完全存在于程序之外,在程序未运行以及脱离程序控制后依然存在。这些存储的方式都是将对象转存于另一个介质中,并在需要时恢复成常规的、基于 RAM 的对象。Java 为轻量级持久化提供了支持。而诸如 JDBC 和 Hibernate 这些类库为使用数据库存储和检索对象信息提供了更复杂的支持。
    • 序列化对象:对象被转换为字节流,通常被发送到另一台机器;
    • 持久化对象:对象被放置在磁盘上,即使程序终止,数据依然存在。
5. 基本类型的存储
  • 有一组类型在 Java 中使用频率很高,它们需要特殊对待,这就是 Java 的基本类型。
  • 基本类型的创建并不是通过 new 关键字来产生。通常 new 出来的对象都是保存在堆内存中的,以此方式创建小而简单的变量往往是不划算的。所以对于这些基本类型的创建方法,Java 使用了和 C/C++ 一样的策略。也就是说,不是使用 new 创建变量,而是使用一个“自动”变量。 这个变量直接存储"值",并置于栈内存中,因此更加高效。
基本类型大小最小值最大值包装类型
booleanBoolean
char16 bitsUnicode 0Unicode 216 -1Character
byte8 bits-128+127Byte
short16 bits- 215+ 215 -1Short
int32 bits- 231+ 231 -1Integer
long64 bits- 263+ 263 -1Long
float32 bitsIEEE754IEEE754Float
double64 bitsIEEE754IEEE754Double
voidVoid
  • 所有的数值类型都是有正/负符号的。布尔(boolean)类型的大小没有明确的规定(Hotspot 中 用 int 表示 boolean)。
  • 基本类型有自己对应的包装类型,如果你希望在堆内存里表示基本类型的数据,就需要用到它们的包装类。
  • 高精度数值:BigIntegerBigDecimal。BigInteger 支持任意精度的整数。可用于精确表示任意大小的整数值,同时在运算过程中不会丢失精度。 BigDecimal 支持任意精度的定点数字。
6. 数组的存储
  • Java 数组提供了安全性检查。这种范围检查,是以每个数组上少量的内存开销及运行时检查下标的额外时间为代价的,但由此换来的安全性和效率的提高是值得的。(并且 Java 经常可以优化这些操作)。
  • 创建对象数组或基本类型的数组都会有默认值 null 或者对于基本类型的 0 值。
  • 数组的常见异常:ArrayIndexOutOfBoundsExceptionNullPointerException
7. 对象清理
  • 作用域:Java 不允许重复定义,不同于 c/c++ 会将较大作用域的变量隐藏。
  • 对象作用域:Java 对象与基本类型具有不同的生命周期。当我们使用 new 关键字来创建 Java 对象时,它的生命周期将会超出作用域。对象的引用作用域结束不代表对象被销毁。
  • Java 的垃圾收集器会检查所有 new 出来的对象并判断哪些不再可达,继而释放那些被占用的内存,供其他新的对象使用。
8. 类的创建
  • // 类型
    public class Person {
       // 字段
        private int age;
        private String name;
       //方法
        public void hello() {
            System.out.println("hello world");
        }
    }
    
  • 如果类的成员变量(字段)是基本类型,那么在类初始化时,这些类型将会被赋予一个初始值。

    基本类型初始值
    booleanfalse
    char\u0000 (null)
    byte(byte) 0
    short(short) 0
    int0
    long0L
    float0.0f
    double0.0d
  • 这种默认值的赋予并不适用于局部变量 —— 那些不属于类的字段的变量。局部变量不会自动初始化,编译错误。

  • 方法使用(method):

     [返回类型] [方法名](/*参数列表*/){
         // 方法体
     }
    
  • 返回类型:方法的返回类型表明了当你调用它时会返回的结果类型。参数列表则显示了可被传递到方法内部的参数类型及名称。方法名和参数列表统称为方法签名(signature of the method)。签名作为方法的唯一标识。

  • 参数列表:Java 中所有参数传递均为值传递。

8. 命名可见性
  • Java 使用完整的包名唯一限定一个类,类似与 c++ 的命名空间。
9. static 关键字
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值