一切皆对象(SE

一切皆对象

对象创建

    创建一个引用,指向一个对象
    String string = new String("abc");

变量

  • 成员变量:在类中和方法外定义的变量;作为类的成员,直接存在于类中;系统会给成员变量提供一个默认值(基本数据类型赋值0;引用类型赋值null);可分为实例变量和静态变量,静态变量static修饰,也叫做全局变量,可以直接用类名调用
  • 局部变量:方法中或语句块中定义的变量;可分为基本类型的变量和引用类型的变量;局部变量必须初始化;形式参数也是局部变量

    数据类型

    8中基本数据类型

    |数据类型|字节长度|范围|包装类|
    |——–|———|——|—–|
    |byte|1(8bit)|[-128 – 127]|Byte|
    |short|2(16bit)|[-32768 – 32767]|Short|
    |int|4(32bit)|[-2^31 – 2^31-1]|Integer|
    |long|8(64bit)|[-2^63 – 2^63-1]|Long|
    |float|4(32bit)|[IEEE754]|Float|
    |double|8(64bit)|[IEEE754]|Double|
    |char|2(16bit)|[0 – 2^16-1]|Character|
    |boolean|————|————-|Boolean|

    引用数据类型

    ==是强大的数据类型,它是基于基本数据类型创建的==
  • 类型转换
    • 隐式类型转换: 我们自己什么都不要做
      小的数据类型,可以自动提升为大的数据类型;
      byte>short>int>long
    • 强制类型转换:
      强行把大的数据类型,转换成小的数据类型;
      目标数据类型 变量名 = (目标数据类型)(被转换的数据);
  • 自动装箱:自动地将一个原始数据类型转换为一个封装类型
  • 自动拆箱:自动地将一个封装类型数据转换为原始数据类型
    Integer类举例
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Integer i1 = 10;
    Integer i2 = 10;
    Integer i3 = 20;
    Integer i4 = new Integer(10);
    Integer i5 = new Integer(10);
    Integer i6 = new Integer(20);

    System.out.println(i1 == i2);
    System.out.println(i3 == i1 + i2);//true (2)
    System.out.println(i1 == i4);//false (3)
    System.out.println(i4 == i5);//false (4)
    System.out.println(i6 == i4 + i5);//true (5)
    System.out.println(20 == i4 + i5);//true (6)

“+”操作符不适用于Integer对象,首先i4和i5先进行自动拆箱操作,得到40,然后i6也进行自动拆箱为int值40,相等

Java数据存储位置

  1. 寄存器:处于处理器内部,因此是最快的存储区;数量有限,由编译器根据需求进行分配
  2. 堆栈:位于RAM中,堆栈指针向下移动(分配新内存),向上移动(释放内存);存储在栈中的数据大小和生存周期必须时确定的,缺乏灵活性;局部变量存储在栈中;存储在栈中的数据可以共享。
    例如:
    int a = 3; int b = 3;//a and b point to 3

  3. :位于RAM区;存储new出来的类的对象(包括其成员变量)和数组;灵活性高,运行时动态分配内存,速度慢;堆中分配的内存由JVM的自动垃圾回收器来管理

  4. 常量池:存放在编译期被确定,并被保存在已编译的.class文档中的一些数据;存放字符串常量,其他基本数据类型的常量,类和接口的全限定名,字段名称和描述符,方法名称和描述符
    • 常量池理解与总结

      Java虚拟机缓冲了Byte, Short, Integer, Long, Character, Boolean对象-128到127的数值;如果取值在这个范围内,会从int常量池取出一个int值并自动装箱成Integer,超出此范围后将会创建新的对象

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      public class {
      Integer i1 = new Integer(1);
      Integer i2 = new Integer(1);//i1,i2位于堆中不同的内存空间

      Integer i3 = 1;//this is autoboxing
      Integer i4 = 1;//i3,i4位于指向常量池中同一个内存空间

      Integer i5 = 300;
      Integer i6 = 300;//i5,i6超出范围,分别创建新的对象

      System.out.println(i1 == i2);//false
      System.out.println(i3 == i4);//true
      System.out.println(i5 == i6);//false

      String s1 = new String("hello");
      String s2 = new String("hello");

      String s3 = "hello";
      String s4 = "hello";

      System.out.println(s1 == s2);//false
      System.out.println(s3 == s4);//true
      }

==的含义

  • 基本数据类型:之间使用==,比较的是它们的数值
  • 引用数据类型:之间使用==,比较的是它们在内存中的存放地址,对于String对象的值的比较,可以使用equals()

    String类举例

  • s1和s2中都指向常量池中的同一个内存空间,相等

  • 组成s3的子字符串均在常量池中;字符串拼接在编译期间会被优化,相等
  • 组成s4的子字符串通过创建新的对象而产生,运行时分配的内存空间未知,不相等
  • s7和s8虽然是字符串字面量,拼接成s9时,s7和s8是作为两个变量使用的,所在内存空间不可预料,不相等
  • s4和s5都被存储在堆中,地址不同,不相等
  • s6通过intern()方法,将字符串“hello”添加进常量池,而常量池中已经存在“hello”字符串,所以直接返回地址,所以s1和s6指向同一个地址,相等