前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >第38节:hashCode()与toString()与equals()函数的作用,内部类和匿名内部类

第38节:hashCode()与toString()与equals()函数的作用,内部类和匿名内部类

作者头像
达达前端
发布2019-07-03 11:54:27
6110
发布2019-07-03 11:54:27
举报
文章被收录于专栏:达达前端

image

hashCode()和toString()

Hash算法是把任意长度的数据通过hash算法成为散列值

hashCode()

代码语言:javascript
复制
public int hashCode(){
 int result = 10;
 result = 2*result + age;
 result = 2*result + name.hashCode();
 return result;
}

toString()

代码语言:javascript
复制
public String toString(){
 String result = "age:"+age+","+"name:"+name;
 return result;
}

equals()

"=="操作符的作用 用来比较两个值是否相等

代码语言:javascript
复制
// 在堆内存中有两个对象u1,u2
User u1 = new User();
User u2 = new User();
User u3 = u1;
// u1和u3指向同一个对象
代码语言:javascript
复制
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操作符进行比较哦~

代码语言:javascript
复制
User u1 = new User();
User u2 = new User();
boolean b1 = u1.equals(u2);
System.out.println(b1);
// false

源码

代码语言:javascript
复制
public boolean equals(Object obj){
 return (this == obj);
}
代码语言:javascript
复制
// 创建类
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;
  }
 }
}
代码语言:javascript
复制
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

内部类和匿名内部类

什么是内部类呢?内部类的使用方法是什么呢?如何使用匿名内部类呢?

代码语言:javascript
复制
class A{
 class B{
  ...
 }
}
// 文件
A.class
A$B.class
代码语言:javascript
复制
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();
 }
}

内部类可以直接访问外部类,但是外部类要访问内部类中的成员变量,就必须要创建内部类的对象。

代码语言:javascript
复制
// 外部类
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

内部类的分类:

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

代码语言:javascript
复制
class A{
 // 外部类的变量
 int i;
 class B{
 // 内部类的变量
   int j;
 // 内部类的方法
   int funB(){
    int result = i+j; // 编译没有问题
    return result;
   }
  }
}

外部类如果不创建外部类对象,就不能直接创建内部了对象

代码语言:javascript
复制
A a = new A();
A.B = new A().new B();
// A.B = a.new B();

赋值:

代码语言:javascript
复制
a.i = 1;
b.j = 2;
int result = b.funB();
// 3

内部类可以随意使用外部类的成员变量

代码语言:javascript
复制
int funB(){
 int result = A.this.i + j;
 return result;
}

匿名内部类:

是一种特殊的局部内部类。

代码语言:javascript
复制
// 没有名字的类
interface A{
 public void doSomething();
}
代码语言:javascript
复制
class B{
 public void fun(A a){
  System.out.println("B类的fun");
  a.doSomething();
 }
}
代码语言:javascript
复制
class Demo implements A{
 public void doSomething(){
  System.out.println("do");
 }
}

匿名内部类

代码语言:javascript
复制
class Test{
 public static void main(String args[]){
  B b = new B();
  // 匿名内部类
  b.fun(new A(){
   public void doSomething(){
    System.out.println("匿名");
   } 
  });
 }
}

什么是匿名对象,匿名对象是对象的简化形式,没有对象名,只能使用一次。

代码语言:javascript
复制
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 点赞
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018.09.06 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • hashCode()和toString()
  • hashCode()
  • toString()
  • equals()
  • 内部类和匿名内部类
  • 匿名内部类:
    • 成员内部类:
      • 静态内部类:
        • 局部内部类:
        • 结语
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档