liujijiang

Java学习笔记 --2-- 一切都是对象

2020.03.23

一切都是对象

存储

  • 寄存器
    寄存器是最快的存储区,位于cpu内部,java程序不能直接操作寄存器
  • 堆栈
    位于通用RAM,速度仅次于寄存器,堆栈指针下移,分配新的内存,堆栈指针上移,释放内存,所以存在堆栈中的对象需要知道生命周期,java中的对象引用存在堆栈中,但是对象不存储在这里

  • 同样位于RAM,java中的对象存储在堆中,堆不需要知道对象的生命周期,所以有很高的灵活性,当你new一个对象的时候,对象就存储在这里,缺点:内存分配和清理可能会慢一点
  • 常量存储
    常量值通常直接放在代码内部,比较安全
  • 非RAM存储
    对象流和持久化存储
    对象流是对象转换成字节流,通常是发送给另一台机器
    持久化存储放在磁盘中,当程序停止时存储对象仍然保持自己的状态
    java提供了对轻量级的持久化的支持,例如JDBC和Hibernate提供了更加复杂的对数据库的存储和读取的支持

特例-基本类型

java提供了一些基本类型,通过这些类型可以直接创建一个并非引用的变量,并将变量放置于堆栈中,这样更加高效
java中的基础类型的大小是确定的,不会因为硬件的变化而变化,这也是java程序移植性好的一个原因

  • boolean Boolean
  • char Character
  • byte Byte
  • short Short
  • int Integer
  • long Long
  • float Float
  • double Double
  • void Void
    每一个基础类型都有一个对应的包装类
public static void main(String[] args) {
	// write your code here
        
        char ch = 'x';
        Character character = new Character('x');
        
    }

第一种写法,x直接位于堆栈中
第二种写法,因为是new了一个对象,所以是位于堆中的

高精度数字

java提供了两个高精度的可以说是包装类

  • BigInteger
  • BigDecimal
    虽然他们可以说是包装类,但是他们没有对应的基础类
    对int float 的操作同样适用于 这两个包装类
    两个类的运算速度比较慢,速度换精度么
    BigInteger支持任意精度的整数,不对丢失任何数据
    BigDecimal支持任何精度的定点数,可以用来精确的货币计算

数组

java要求数组必须初始化,并且不能访问数组范围之外的内容

public static void main(String[] args) {
	// write your code here

        int [] a = new int[3];

        String [] strings = new String[3];

        System.out.println(strings[1]);

        System.out.println(a[1]);
    }

创建一个数组其实就是创建一个数组引用,new 一个对象是在堆中,然后创建一个在堆栈中的引用数组
int数组初始值为 0 String初始值为null


永远不要销毁对象

在每一种编程语言中对象的生命周期对象应该什么时候被销毁占据了工作的很大一部分

作用域

public static void main(String[] args) {
	// write your code here

        String string = new String("redarm");
    }

string这个引用的作用域是main,出了这个作用域string引用就不好使了
但是new的对象仍然存在堆中,可以通过其他方法使用这个对象
在java中你只需要new一个对象就行了而不需要关心对象的销毁问题

字段和方法

类中可以有字段和方法两种类型的元素
一个类中的基本成员如果没有初始化,java会自动将其初始化

  • boolean false
  • char null
  • byte (byte)0
  • short (short)0
  • int 0
  • long 0L
  • float 0.0f
  • double 0.0d
package com.company;

public class Main {

    private static int x;

    public static void main(String[] args) {
	// write your code here
        
        System.out.println(x);
    }

    public void test(){
    }
}


x的结果是0
这个自动初始化只适用于类中的成员字段,而不适用于局部变量
使用未初始化的局部变量会在编译阶段报错

名字可见性

import指示编译器导入一个包,也就是一个类库

static关键字:
1 希望为特定域分配单一存储空间
2 希望这个方法不与这个类的任何对象发生关联

java.lang是默认导入到所有的java文件中的

java最强大的优势之一就是他提供了庞大的标准类库集

public static void main(String[] args) {
	// write your code here

        System.getProperties().list(System.out);
        System.out.println(System.getProperty("user.name"));
    }

输出环境信息
输出当前用户
等等

JDK:Java Developer's Kit java开发人员工具包

java编程语言编码约定:
采用驼峰式风格命名
类 首字母大写
方法 字段 首字母小写