java Object类 && 包装类

100 阅读7分钟

java Object类 && 包装类

目录

[TOC]

Object 类的使用

Object类是所有Java类的根父类

如果在类的声明中未使用extends关键字指明其父类,则默认父类 为java.lang.Object

public class Person {...}
等价于:
public class Person extends Object {...}
 
method(Object obj){…} //可以接收任何类作为其参数
Person o=new Person();
method(o);

==操作符与equals方法

= =:

基本类型比较值:只要两个变量的值相等,即为true int a=5; if(a==6){…}

引用类型比较引用(是否指向同一个对象):只有指向同一个对象时,==才返回true

Person p1=new Person();

Person p2=new Person();

if (p1==p2){…}

“==”进行比较时,符号两边的 数据类型必须兼容 (可自动转换的基本 数据类型除外)

equals()

equals():所有类都继承了Object,也就获得了equals()方法。还可以重写。

  • 只能比较引用类型,其作用与“==”相同,比较是否指向同一个对象。
  • 格式:obj1.equals(obj2)

 特例:当用equals()方法进行比较时,对类FileString、Date及包装类 (Wrapper Class)来说,是比较类型及内容而不考虑引用的是否是同一个对象;

原因:在这些类中重写了Object类的equals()方法。

 当自定义使用equals()时,可以重写。用于比较两个对象的“内容”是否都相等

重写equals()方法的原则
  1. 对称性:如果x.equals(y)返回是“true” ,那么y.equals(x)也应该返回是 “true”。
  2. 自反性:x.equals(x)必须返回是“true”。
  3. 传递性:如果x.equals(y)返回是“true” ,而且y.equals(z)返回是“true” , 那么z.equals(x)也应该返回是“true”。
  4. 一致性:如果x.equals(y)返回是“true” ,只要xy内容一直不变,不管你 重复x.equals(y)多少次,返回都是“true”。
  5. 任何情况下,x.equals(null),永远返回是“false” ;
  6. x.equals(x不同类型的对象)永远返回是“false”。
面试题
  1. == 既可以比较基本类型也可以比较引用类型。对于基本类型就是比较值,对于引用类型 就是比较内存地址
  2. equals的话,它是属于java.lang.Object类里面的方法,如果该方法没有被重写过默认也是==;我们可以看到String等类的equals方法是被重写过的,而且String类在日常开发中用的比较多,久而久之,形成了equals是比较值的错误观点。
  3. 具体要看自定义类里有没有重写Object的equals方法来判断。
  4. 通常情况下,重写equals方法,会比较类中的相应属性是否都相等。

toString() 方法

 toString()方法在Object类中定义,其返回值是String类型,返回类名和它 的引用地址。  在进行String与其它类型数据的连接操作时,自动调用toString()方法

Date now=new Date();

System.out.println(“now=”+now); 相当于System.out.println(“now=”+now.toString());

可以根据需要在用户自定义类型中重写toString()方法 如String 类重写了toString()方法,返回字符串的值。

s1=“hello”;

System.out.println(s1);//相当于System.out.println(s1.toString());

基本类型数据转换为String类型时,调用了对应包装类的toString()方法

int a=10; System.out.println(“a=”+a);

包装类(Wrapper)的使用

基本数据类型包装成包装类的实例 --- 装箱

通过包装类的构造器实现:

int i = 500; Integer t = new Integer(i);

还可以通过字符串参数构造包装类对象:

Float f = new Float(“4.56”);

Long l = new Long(“asdf”); //NumberFormatException

获得包装类对象中包装的基本类型变量 --- 拆箱

调用包装类的.xxxValue()方法:

boolean b = bObj.booleanValue();

JDK1.5之后,支持自动装箱,自动拆箱。但类型必须匹配

基本类型、包装类与String类间的转换

字符串转换成基本数据类型

  • 通过包装类的构造器实现:int i = new Integer(“12”);
  • 通过包装类的parseXxx(String s)静态方法:Float f = Float.parseFloat(“12.1”);

基本数据类型转换成字符串

  • 调用字符串重载的valueOf()方法: String fstr = String.valueOf(2.34f);
  • 更直接的方式:String intStr = 5

包装类用法举例

int i = 500;
Integer t = new Integer(i);
装箱:包装类使得一个基本数据类型的数据变成了类。
有了类的特点,可以调用类中的方法。
String s = t.toString(); // s = “500“,t是类,有toString方法
String s1 = Integer.toString(314); // s1= “314“ 将数字转换成字符串。
String s2=“4.56”;
double ds=Double.parseDouble(s2); //将字符串转换成数字
 
 拆箱:将数字包装类中内容变为基本数据类型。
int j = t.intValue(); // j = 500,intValue取出包装类中的数据
 包装类在实际开发中用的最多的在于字符串变为基本数据类型。
String str1 = "30" ;
String str2 = "30.3" ;
int x = Integer.parseInt(str1) ; // 将字符串变为int型
float f = Float.parseFloat(str2) ; // 将字符串变为int型

总结

package com.jyc.p2;
/*
一.class java.lang.Object 类
   ①equals()
     1.Object类是所有Java类的根父类
        如果在类的声明中未使用extends关键字指明其父类,则默认父类为java.lang.Object类
        objec 类中的属性和方法都具备通用性(object类中声明了一个空参构造器)
               属性 无
                方法:equals(),toString(),getClass(),hashCode(),clone(),finalize(),wait() notify(),notifyAll()
     2.==&&equals的区别
        ==运算符
        可以使用在基本数据类型变量和引用数据类型变量中
        如果比较的是基本数据类型变量,比较保存的两个数据是否相等(不一定类型要相同)
        如果比较的是引用数据类型变量,比较两个对象的地址值是否相同
     3.equals()方法的使用
       equals是一个方法,而非运算符
       只能适用于引用数据类型
       object.equals的定义
       public boolean equals(Object obj) {
             return (this == obj);
       }
     4.说明object.equals()和==的作用是相同的,比较两个对象的地址值是否相同,即两个对象的引用是否相同
      像  String Date File 包装类等都重写了object类中的equals方法,重写以后比较的不是两个引用地址是否相同,
     而是比较两个对象的实体内容是否相同
 
     5..通常情况下我们自定义得类如果使用equals()方法,也通常是比较两个对象的实体内容是否相同,那么
     我们就需要对object类中的equals()进行重写 (重写的原则比较两个对象的实体内容是否相同)
 
  ② toString()
       1.当我门输出对象的一个引用时,实际上是调用当前对象的toString方法
       2.object.toString()的定义
          获取类的类名+通过hashCode获取空间地址值转为16进制(虚拟地址)
           public String toString() {
             return getClass().getName() + "@" + Integer.toHexString(hashCode());
           }
       3.像  String Date File 包装类等都重写了object类中的 toSring 方法,是的调用对象的toString方法时返回实体内容信息
       4.自定义类也可以重写toString方法 当调用此方法时返回对象的实体内容
 
二 包装类的使用
1.java提供了八种基本数据类型对应的包装类,使得基本数据类型的变量具有类的特征
    基本数据类型 包装类 String三者直接的相互转换
    基本数据类型转为包装类:调用包装类的构造器(自动装箱)
    包装类转为基本数据类型调用包装类xxx的xxxvale;(自动拆箱)
    基本数据类型,包装类转为string    连接运算, 调用String.valueof()
    string转为基本数据类型,包装类 调用包装类的parsexxx()
 
 
 
 
* */
public class Test99 {
    public static void main(String[] args) {
            Order order1=new Order("zs",18);
            Order order2=new Order("zs",18);
 
 
            System.out.println(order1.getClass().getSuperclass());
            System.out.println("---------==比较基本数据类型-------------");
            int i=10;
            char j=10;
            System.out.println(j==i);
 
            System.out.println("---------==比较引用数据类型--------------");
            String str1=new String("str");
            String str2=new String("str");
            System.out.println(str1==str2);
 
            System.out.println("---------equals的使用------------");
            System.out.println(str1.equals(str2));//true
            System.out.println(order1.equals(order2));//false--->true
 
            System.out.println("--------toString的使用----------");
            System.out.println(order1.toString());//com.jyc.p2.Order@1540e19d--》Order[name=zs,age=18]
 
             System.out.println("-----------基本数据类型转为包装类---------------");
             int num=10;
             Integer num1=new Integer(num);
             System.out.println(num1.toString());
             System.out.println(num1.toString());
             Boolean b1=new Boolean(true);//true
             Boolean b2=new Boolean("trUe");//true
             Boolean b3=new Boolean("true123"); //false
             System.out.println(b1);
             System.out.println(order1.isFlage); //null
             System.out.println("-----------包装类转为基本数据类型---------------");
             Integer in1=new Integer(12);
             int i1= in1.intValue();
             System.out.println(i1+1);//13
             System.out.println("-----------装箱&&拆箱---------------");
             //装箱
             int num3=10;
             Integer in3=num;
             System.out.println(in3);
             //拆箱
             int num4=in3;
            System.out.println(num4);
            System.out.println("----------  基本数据类型,包装类转为string---------------");
            //连接运算
            int num6=66;
            String s1=num6+" ";
            Double d1=new Double(12.3);
            String str3=String.valueOf(d1);
            System.out.println(s1);
            System.out.println(str3);
            System.out.println("----------  string转为基本数据类型,包装类---------------");
            String s5="123";
            int num5=Integer.parseInt(s5);
             System.out.println(num5+1);
 
 
 
 
 
 
        }
    }
class  Order{
    int age;
    String name;
    Boolean isFlage;
    Order(){ }
    Order( String name,int age){
        this.name=name;
        this.age=age;
    }
 
    //重写 equals 方法 比较两个对象的实体内容
    public boolean equals(Object obj) {
        //判断两个对象是否是同一个对象
        if (this==obj){
            return true;
        }
        //判断两个对象是不是同一个类
        if (obj instanceof Order){
            //强制类型转换为Order相同类
            Order o=(Order)obj;
            return  this.age==o.age &&this.name.equals(o.name);
        }else{
            return  false;
        }
    }
 
    //重写toString方法
    public String toString() {
        return "Order[name="+name+",age="+age+"]";
    }
}