1. 程式人生 > >第38節:hashCode()與toString()與equals()函數的作用,內部類和匿名內部類

第38節:hashCode()與toString()與equals()函數的作用,內部類和匿名內部類

指向 它的 函數 ati 使用外部 開發 算法 博客 else

技術分享圖片

hashCode()和toString()

Hash算法是把任意長度的數據通過hash算法成為散列值

hashCode()

public int hashCode(){
 int result = 10;
 result = 2*result + age;
 result = 2*result + name.hashCode();
 return result;
}

toString()

public String toString(){
 String result = "age:"+age+","+"name:"+name;
 return result;
}

equals()

"=="操作符的作用
用來比較兩個值是否相等

// 在堆內存中有兩個對象u1,u2
User u1 = new User();
User u2 = new User();
User u3 = u1;
// u1和u3指向同一個對象
class Test{
 public static void main(String[] args){
  User u1=new User();
  User u2=new User();
  User u3 = u1;
  boolean b1 = u1 == u2;
  boolean b2 = u1 == u3;
  System.out.println(b1);
  System.out.println(b2);
 }
}
// 結果
false
true

什麽是對象的內容相等呢?要符合對象的內容相等需要,對象的類型相同,兩個對象的成員變量的值完全相同,如何比較對象的類型相同,可以用instanceof操作符進行比較哦~

User u1 = new User();
User u2 = new User();
boolean b1 = u1.equals(u2);
System.out.println(b1);
// false

源碼

public boolean equals(Object obj){
 return (this == obj);
}
// 創建類
class User{
 String name;
 int age;
 public boolean equals(Object obj){
  if(this == obj){
   return true
  }
  boolean b = obj instanceof User;
  if(b){
   User u = (user)obj;
   if(this.age == u.age && this.name.equals(u.name)){
     return ture;
    }else{
     return false;
    }
  }else{
   return false;
  }
 }
}
class Test{
 public static void main(String[] args){
  User u1 = new User();
  User u2 = new User();
  User u3 = new User();
  ...
  System.out.println(u1.equals(u2));
  System.out.println(u1.equals(u3));
 }
}
// false
// true

內部類和匿名內部類

什麽是內部類呢?內部類的使用方法是什麽呢?如何使用匿名內部類呢?

class A{
 class B{
  ...
 }
}
// 文件
A.class
A$B.class
class Test{
 public static void mian(String[] args){
  // 創建外部類的對象
  A a = new A();
 // 內部類的表示 A.B new A().new B()
  A.B b = new A().new B();
 }
}

內部類可以直接訪問外部類,但是外部類要訪問內部類中的成員變量,就必須要創建內部類的對象。

// 外部類
class Demo{
 private int num = 3;
 // 定義內部類
 class Int{
  void show(){
   System.out.println("num="+num); 
  }
 }
 
 void method(){
  Int int = new Int();
  int.show();
 }
}

class Inner{
 public static void main(Stirng[] args){
  Demo demo = new Demo();
  demo.method();
 }
}

技術分享圖片

內部類的分類:

靜態內部類;局部內部類;成員內部類;匿名內部類

class A{
 // 外部類的變量
 int i;
 class B{
 // 內部類的變量
   int j;
 // 內部類的方法
   int funB(){
    int result = i+j; // 編譯沒有問題
    return result;
   }
  }
}

外部類如果不創建外部類對象,就不能直接創建內部了對象

A a = new A();
A.B = new A().new B();
// A.B = a.new B();

賦值:

a.i = 1;
b.j = 2;
int result = b.funB();
// 3

內部類可以隨意使用外部類的成員變量

int funB(){
 int result = A.this.i + j;
 return result;
}

匿名內部類:

是一種特殊的局部內部類。

// 沒有名字的類
interface A{
 public void doSomething();
}
class B{
 public void fun(A a){
  System.out.println("B類的fun");
  a.doSomething();
 }
}
class Demo implements A{
 public void doSomething(){
  System.out.println("do");
 }
}

匿名內部類

class Test{
 public static void main(String args[]){
  B b = new B();
  // 匿名內部類
  b.fun(new A(){
   public void doSomething(){
    System.out.println("匿名");
   } 
  });
 }
}

什麽是匿名對象,匿名對象是對象的簡化形式,沒有對象名,只能使用一次。

class Student
{
 // 創建屬性
 Stinrg name;
 int tall;
 // 定義方法
 void study()
 {
   System.out.println("好好學習"+name);
 }
}

class Demo
{
 // 定義主函數
 public static void main(String[] args)
 {
   // 創建類的對象
  // 類類型的變量一定指向對象
  Student stu = new Student();
  // 調用對象的成員
  stu.name = "dashu";
 // 調用對象的方法
  stu.study();
 }
}

成員內部類:

在成員變量的位置上定義的類為成員內部類。如果要使用成員內部類就要使用外部類.內部類來訪問。

使用外部類的名字來訪問,是因為一個內部類可能有不同的外部類。要有一個內部類,必須要有外部類的對象,因為成員內部類要用外部類訪問。

成員內部類可以訪問外部類的所有屬性,成員內部類不能定義有靜態屬性。

靜態內部類:

在成員位置上用static修飾的內部類為靜態內部類。靜態內部類只能訪問外部類的靜態成員和本內部類的成員;且不能訪問外部類的非靜態成員。

局部內部類:

局部,在一個方法中內的類,為局部內部類,局部內部類不能用訪問修飾符,作用域在定義的它的區域內。

局部內部類可以訪問外部類的成員屬性和靜態屬性,也可以訪問final修飾的局部變量,但不能訪問非final的局部變量。

往後余生,唯獨有你
簡書作者:達叔小生
90後帥氣小夥,良好的開發習慣;獨立思考的能力;主動並且善於溝通
簡書博客: https://www.jianshu.com/u/c785ece603d1

結語

  • 下面我將繼續對 其他知識 深入講解 ,有興趣可以繼續關註
  • 小禮物走一走 or 點贊

第38節:hashCode()與toString()與equals()函數的作用,內部類和匿名內部類