为了账号安全,请及时绑定邮箱和手机立即绑定

第38节:hashCode()与toString()与equals()函数的作用

标签:
Java

webp

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,u2User 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);
 }
}// 结果falsetrue

什么是对象的内容相等呢?要符合对象的内容相等需要,对象的类型相同,两个对象的成员变量的值完全相同,如何比较对象的类型相同,可以用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();
 }
}

webp

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的局部变量。



作者:达叔小生
链接:https://www.jianshu.com/p/e1f36623ff02


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消