zoukankan      html  css  js  c++  java
  • Java面向 对象--Object类和包装类的使用

    本篇博客介绍Java面向对象中Object类和包装类的用法。


    目录:

    ☍ Object类

    ☍ 包装类(Wrapper)


    ☍ Object类

    ▴ Object类概述

    ☃ Object类是所有Java类的根父类,即除Object类外所有类默认继承Object类

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

    public class Person{
        ...
    }
    ==
    public class Person extends Object{
        ...
    }
    public void method(Object obj){可以接收任何类作为参数}
    

    ▴ Object类部分常用结构(方法)

    No. 方法名称 类型 描述
    1 public Object() 构造 构造器
    2 public boolean equals(Object obj) 普通 对象比较
    3 public int hashCode() 普通 获取Hash码
    4 public String toString() 普通 对象打印时使用
    ...

    ▴ =、==与equals方法

    ☃ ‘=’:赋值运算符,给属性显式赋值

    ☃ ‘==’:比较运算符

      ☄ 基本类型比较值:只要两个变量的值相等(基本数据类型不一定相等),即为true

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

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

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

      ☄ 只能比较引用类型,未重写时其作用与“==”相同, 比较是否指向同一个对象(地址在是否相同)

      ☄ Object中equals()方法的源码

    public boolean equals(Object obj) {
        return (this == obj);
    }
    

       ☄ 格式:obj1.equals(obj2)

    特例:

    ➥ 当用equals()方法进行比较时,对类File 、String、Date及包装类(Wrapper Class)来说 ,是比较类型及内容而不考虑引用的是否是同一个对象(在这些类中重写了equals()方法)

    重写equals()方法的原则:

    ☃ 对称性:如果x.equals(y)返回是“true”,那么y.equals(x)也应该返回是“true”

    ☃ 自反性:x.equals(x)必须返回是“true”

    ☃ 传递性:如果x.equals(y)返回是“true”,而且y.equals(z)返回是“true”,那么z.equals(x)也应该返回是“true”

    ☃ 任何情况下,x.equals(null),永远返回是“false”

    ☃ x.equals(和x不同类型的对象)永远返回是“false”

    ✦ 实际开发中除特殊需求外手动重写equals方法,一般都是快捷生成(类中右键-->Soure-->Generate hashCode() and equals()...选中属性后就可自动生重写hashCode()和equals()方法,类似快捷生成setter和getter方法)

    ▴ ==与equals的区别

    ☃ == 既可以比较基本类型也可以比较引用类型。对于基本类型就是比较值,对于引用类型就是比较内存地址

    ☃ equals是属于java.lang.Object类中的方法,没有重写equals方法时用法相当于使用==比较引用类型,而equals也可以重写为比对象内容的方法如String,Date、File和包装类,但不要误认为equals就是比较值的方法

    ☃ 通常情况下,重写equals方法,会比较类中的相应属性是否都相等

    ▴ toString()方法

    ☃ toString()方法在Object类中定义,返回类名和它的引用地址

    ☃ 在进行String与其它类型数据的连接操作时,自动调用toString()方法

    Date time = new Date();
    System.out.println("time:" + time);
    ==
    System.out.println("time:" + time.toString());
    

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

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

    ☃ 可以快捷重写toString()方法,Soure-->Generate toString()...,同equals自动重写类似

    int a = 10;
    System.out.println("a=" + a);
    

    ☍ 包装类(Wrapper)

    ▴ 包装类的概述

    ☃ 针对八种基本数据类型定义相应的引用类型—包装类(封装类)

    ☃ 有了类的特点,就可以调用类中的方法,Java才是真正的面向对象

    基本数据类型 方法名称 父类
    byte Byte Number
    short Short Number
    int Integer Number
    long Long Number
    float Float Number
    double Double Number
    boolean Boolean
    char Character

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

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

    int i = 10;
    Integer num = new Integer(i);
    

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

    Float fNum = new Float("3.14");
    Long lNum = new Long("hi");   //NumberFormatException异常 
    

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

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

    Boolean bObj = new Boolean(false);
    boolean b = bObj = bObj.booleanValue();
    

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

    //自动装箱
    Integer integer = 1314;
    System.out.println(integer.toString());
    //自动拆箱
    Integer num = new Integer(520);
    int i = num;   //520
    Double dNum = new Double("5.20");
    double d = dNum; //5.20
    

    ▴ 基本数据类型与字符串的转换

    • 字符串转换为基本数据类型

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

    int i = new Integer("520");
    

    ☃ 通过包装类的parseXxx(String s)静态方法

    Double d = Double.parseDouble("13.14");
    
    • 基本数据类型转换为字符串

    ☃ 调用字符串重载的valueOf()方法

    String dStr = String.valueOf(5.20);
    

    ☃ 通过‘+""’拼接(基本数据类型+字符串结果是字符串)

    String intStr = 520 + "";
    
    • 包装类转换为字符串

    ☃ 包装类对象的toString()方法

    Integer num = new Integer(1314);
    String iStr = num.toString();
    

    ☃ 包装类toString(与包装类对应的形参)的方法

    String iStr = Integer.toString(1314);  //包装类是Integer,参数必须是int
    

    字符串转换为包装类转

    ☃ 通过包装类构造器(字符串必须是数字或Boolean包装类时可以为true/false)

    String str = "1314";
    Integer i = new Integer(str);
    

    ▴ 总结:基本数据类型、包装类与String间的转换关系

    ▴ 包装类面试题

    ✎1.写出输出结果,判断结果是否相同

    Object obj1 = true ? new Integer(1) : new Double(2.0);
    System.out.println(obj1);
    
    Object obj2;
    if(true)
        o2 = new Integer(1);
    else
        o2 = new Double(2.0);
    

    ♟:第一个的输出结果为1.0,第二个的输出结果为1

    ✣:三目运算符会将数据自动转型为一样的,int自动转型为double了

    ✎2.写出输出结果

    public void method1() {
    	Integer i = new Integer(1);
    	Integer j = new Integer(1);
    	System.out.println(i == j);
    	Integer m = 1;
    	Integer n = 1;
    	System.out.println(m == n);
    	Integer x = 128;
    	Integer y = 128;
    	System.out.println(x == y);
    }
    

    ♟:第一个的输出结果为false,第二个输出结果为true,第三个输出结果为false

    ✣:第一个为false的原因是new造的对象地址不同,Integer内部定义了IntegerCache缓存结构,在这个方法中定义了Integer[]数组,保存了-127到127范围的整数,如果使用自动装箱的方式,给Integer赋值的范围在-127~127,就会直接使用数组中的元素,就不会新new包装类对象,因此指向的都是Integer[]数组中元素的地址,所以第二个输出为true,第三个输出为false

    本博客与CSDN博客༺ཌ༈君☠纤༈ད༻同步发布

  • 相关阅读:
    奥运圣火在家乡传递
    Please stop reinventing the wheel (请不要重复发明轮子)
    使用IDispatch::Invoke函数在C++中调用C#实现的托管类库方法
    To invoke and to begin invoke, that is a question.
    XML和JSON(JavaScript Object Notation)
    Cloud Computing Is a Big Whiteboard
    TRIE Data Structure
    ASP.NET AJAX UpdatePanel 控件实现剖析
    分布式计算、网格计算和云计算
    系统架构设计师考试大纲(2009版)
  • 原文地址:https://www.cnblogs.com/asio/p/12505872.html
Copyright © 2011-2022 走看看