第38节:hashCode()与toString()与equal

作者: 魔王哪吒 | 来源:发表于2018-09-06 00:00 被阅读26次
    image

    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();
     }
    }
    
    image.png

    内部类的分类:

    静态内部类;局部内部类;成员内部类;匿名内部类

    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()与equal

        本文链接:https://www.haomeiwen.com/subject/hdyzwftx.html