Object和包装类

Object

  • 在java类继承结构中,java.lang.Object类位于顶端
  • Object是java提供的一个类,任何类型如果没有副类型,则默认继承Object,所以可以说 任何类都继承Object
  • Object类型的引用变量可以指向任何类型对象。
  • Object中封装了许多可以共用的API,比如toString,equals

toString

  • Object类中的重要方法,用于返回对象值的字符表示
  • 默认时toString方法返回的是没有意义的 类全名@散列码
  • java建议重写toString,修改toString的返回值,用于Debug
  • java的很多API会自动调用toString,简化编程。
    例如:下面这两句打印的效果是一样的
	  Foo foo = new Foo();
		System.out.println(p.toString());
		System.out.println(p);//默认调用了p的toString方法
  • Eclipse提供了快捷工具,可以自动生成toString方法,在右键-source-generate里。

equals

equals和==的区别

== 用于比较值是否相等:

  1. 基本类型,就是比较基本类型值是否相等
  2. 引用类型,比较引用的值(对象地址值)是
    否相等. 地址值一样则true.
  3. == 只能比较两个引用是否引用了同一个
    对象,不能比较两个对象的内容(属性)是否
    相等.

equals

Java 在Object类为全部对象定义了equals方法用于解决判断对象内容(属性)是否相等问题,简称: 判断对象是否相等

  1. equals 方法用于比较对象是否相等
  2. 默认的equals方法,其内部就是 “==”, 与 == 规则一致
  3. Java 建议在子类中重写, 修改为按照对象属性比较对象是否相等.
  4. equals 方法要与hashCode一起重写
  5. Eclipse 提供了功能,可以快速重写equals方法, 按照属性比较对象是否相等

包装类

  • 定义: 在进行类型转换的范畴内,有一种特殊的转换,需要将int这样的基本数据
    类型转换为对象。所有基本类型都有一个与之对应的类,即包装类。
  • java 为了性能, 设计了基本类型. 为了将基本类型转换为对象设计了包装类
  • 包装类是final 的,是不可变类,并且不可被继承,toString也是如此。这是因为java认识和输出10进制全部依赖包装类中的算法! java将包装类和toString定义为final就是为避免使用者进行修改。

Number

  • 8种包装类:
    1. Byte byte
    2. Short short
    3. Integer int
    4. Long long
    5. Float float
    6. Double double
    7. Boolean boolean
    8. Character char
  • 前6种都是数值类型的包装类,他们有一个共同的超类Number
  • Number里封装了数值类型相互转换的方法如intValue(),doubleValue等,需要注意的是转换类型时,会发生精度损失或溢出现象
  • parseInt用于将字符串转换为int类型

自动包装(装箱)和自动拆包(拆箱)

  • 从java5.0版本以后开始提供了自动包装功能,可以简化编码
  • 简单理解就是包装类型和基本类型之间可以自动转换类型赋值。
    自动包装:将基本类型自动包装为包装类型;自动拆包就是将包装类型自动转化为基本类型。
  • 自动包装/拆包功能利用编译器实现的,在编译期,编译器将代码进行“编译擦除”(替换),比如下例:
Integer i = 5;//编译器把它替换为:Integer i = Integer.valueOf(5);
int n = i;//替换为:int n = i.intValue();
  • 赋值,计算,参数传递,返回值等都会发生自动包装
test(2.3,6);
public static double test(Double d, Integer i){//当参数传进来时发生了自动包装
		return d + i;//运算时发生了自动拆包
	}


计算机和人的交互:

  • Java 中与人进行交互的核心方法, 被封装到包装类和toString中.
    1. 将人类熟悉 10进制字符串转换为,计算机内部能够处理的2进制(基本类型是2进制)
    2. 将计算机内部的2进制转换为人能够识别的10进制字符串.
  • 图解:

Object和包装类
包装类和字符串组合可以处理数字的输入输出,比如我输了一个“886”,计算机得到的其实并不是数字,而是一个字符串类型的886,计算机会调用Integer.parseInt(“886”)把它转成了计算机可以识别的二进制数,反过来当计算机运算完成后需要把结果呈现出来,也会调用toString方法把二进制转化成十进制字符串显示。整个过程类似于下面这段代码

String str = "886";
//将10进制数字字符串转换为2进制int
int n = Integer.parseInt(str);
n++;
//toString(int)将2进制的int转换10进制字符串
System.out.println(Integer.toString(n));
		
  • 应用:
    我们发现人机交互主要用到了两个API:parseInt和 toString,我们自己也会用到他们
    比如要计算一种商品的总价,但是只有一个各种信息融合在一起的字符串
    String str=“1, 牙膏, 500, 1.28, 北京”;其中500是数量,1.28是单价,可以这样写:
		String str="1, 牙膏, 500, 1.28, 北京";
		String[] arr = str.split("[,,]\\s*");
		double price=Double.parseDouble(arr[3]);
		System.out.println(price); //1.28
		int qty = Integer.parseInt(arr[2]);
		double total = qty*price;
		System.out.println(total);