第四课时:面向对象(3)

一、基本数据类型的包装类

    1、

基本数据类型和包装类的对应关系

                                                    基本数据类型                                                                   包装类

                                                        byte                                                                              Byte

                                                        short                                                                             Short

                                                        int                                                                                 Integer

                                                        long                                                                               Long

                                                        char                                                                              Character

                                                        float                                                                               Float

                                                        double                                                                           Double

                                                        boolean                                                                         Boolean

    2、封装类的实例化、使用以及装箱(1.5 之后的自动装箱)和拆箱(1.5 之后的自动拆箱)参见《Java API 1.5》

    3、基础数据类型和封装类还可以通过和""进行连接运算,使之转化为字符串,例如:

      /**
       * Boolean 和 boolean 通过与空字符串进行连接操作,使之转化为 String 类型
       */
      Boolean bool = true;
      boolean bool2 = true;
      String str_bool = bool + "";
      String str_bool2 = bool2 + "";
 
      /**
       * Integer 和 int 通过与空字符串进行连接操作,使之转化为 String 类型
       */
      Integer integer = 1;
      int i = 1;
      String str_integer = integer + "";
      String str_i = i + "";
 
      /**
       * Character 和 char 通过与空字符串进行连接操作,使之转化为 String 类型
       */
      Character character = 'c';
      char c = 'c';
      String str_character = character + "";
      String str_c = c + "";

 二、处理对象

1、toString() 方法

    1.1 该方法打印出来的是:

    对象的所属类的全名 + @ + hashCode

    1.2 重写 toString() 方法

2、 == 和 equals 比较运算符

    2.1、==:

    作用于基本数据类型的变量时:当使用 == 来判断两个变量是否相等时,如果2个变量是基本类型的变量,且都是数值型(不一定要求数据类型严格相同),则只要两个变量的值相等,使用==判断就将返回true

    作用于引用类型的变量时:对于两个引用类型的变量,必须它们指向同一个对象时(即堆内存地址相同时),   == 判断才会返回true。

    == 不可用来判断没有父子关系的两个对象。

    示例:下面示例中,SubClass1 和 SubClass2 没有父子关系,即使 SubClass1 和 SubClass2 同时继承于一个类BaseClass,但是 SubClass1 和 SubClass2 之间没有任何关系。

    第四课时:面向对象(3)_第1张图片

    第四课时:面向对象(3)_第2张图片

    2.2、equals

    作用于基本数据类型的变量时:基本数据类型不属于对象,也就没有任何方法

    作用于引用类型的变量时:等同于 == 

    实质上对于引用类型的变量,== 和 equals() 方法是完全相同的。参见 Object 类的源代码:

    /**

                 * Object 类中 equals 方法的源代码,由此可以看出,对于引用类型的变量,== 和 equals 是完全相同的。

                 */

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

    但是 String 类重写了 equals 方法。下面是 String 类的源代码:

     /**
      * String 类重写了 equals 方法,结构是只要两个 String 类型的
      * 变量包含的字符序列相同,equals 方法即返回 true,否则返回 false
      */

        public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        if (anObject instanceof String) {
            String anotherString = (String)anObject;
            int n = count;
            if (n == anotherString.count) {
         char v1[] = value;
         char v2[] = anotherString.value;
         int i = offset;
         int j = anotherString.offset;
         while (n-- != 0) {
             if (v1[i++] != v2[j++])
                  return false;
        }
         return true;
            }
        }
        return false;
       }

/**
 * Description:
 *
Copyright (C), 2005-2008, Yeeku.H.Lee
 *
This program is protected by copyright laws.
 *
Program Name:
 *
Date:
 * @author  Yeeku.H.Lee [email protected]
 * @version  1.0
 */
public class TestEqual
{
 public static void main(String[] args)
 {
  int it = 65;
  float fl = 65.0f;
  //将输出true
  System.out.println("65和65.0f是否相等?" + (it == fl));
  char ch = 'A';
  //将输出true
  System.out.println("65和'A'是否相等?" + (it == ch));
  String str1 = new String("hello");
  String str2 = new String("hello");
  //将输出false
  System.out.println("str1和str2是否相等?" + (str1 == str2));
  //将输出true
  System.out.println("str1是否equals str2?" + (str1.equals(str2)));

  String str3 = "hello";
  String str4 = "hello";

  //将输出true,注意这里 与 new String("hello"); 的不同。

  System.out.println("str3和str4是否相等?" + (str3 == str4));

 }
}
3、重写 hashCode 方法和 equals 方法

示例:

Person 类:

package mypackage;

public class Person {
 
 private String id;
 private String name;
 private String sex;
 
 public String getId() {
  return id;
 }

 public void setId(String id) {
  this.id = id;
 }

 public String getName() {
  return name;
 }

 public void setName(String name) {
  this.name = name;
 }

 public String getSex() {
  return sex;
 }

 public void setSex(String sex) {
  this.sex = sex;
 }

 @Override
 public boolean equals(Object obj) {
  if((!(obj instanceof Person)) || (obj == null)){
   return false;
  }
  if(this.hashCode() != obj.hashCode()){
   return false;
  }
  
  Person c1 = (Person) obj;
  if(this.name != c1.getName() || this.id != c1.getId() || this.sex != c1.getSex()){
   return false;
  }
  
  return true;
 }

 @Override
 public int hashCode() {
  int hashCode1 = this.id.hashCode();
  int hashCode2 = this.name.hashCode();
  int hashCode3 = this.sex.hashCode();
  
  int hashCode = hashCode1 ^ hashCode2 ^ hashCode3;
  
  return hashCode;
 }
}
MainClass 类:

package mypackage;

public class MainClass {

 public static void main(String[] args) {
  Person c1 = new Person();
  Person c2 = new Person();
  Person c3 = c1;
  
  c1.setId("001");
  c1.setName("liu");
  c1.setSex("fale");
  
  c2.setId("001");
  c2.setName("liu");
  c2.setSex("fale");
  
  System.out.println(c1.hashCode());
  System.out.println(c2.hashCode());
  
  System.out.println(c1.equals(c2));
  System.out.println(c1 == c2);
  System.out.println(c1 == c3);
  
  /*
   * 注意 String a = new String("aaa"); 与 String a = "aaa"; 的不同
   */
  String a = new String("aaa");
  String b = new String("aaa");
  System.out.println(a == b);
  System.out.println(a.equals(b));
  
  String c = "aaa";
  String d = "aaa";
  System.out.println(c == d);
  
  System.out.println(a == c);
 }
}

你可能感兴趣的:(C,C++,C#,数据结构,J#,Java,课程)