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

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 点赞
posted @ 2018-09-08 19:18  达达前端  阅读(228)  评论(0编辑  收藏  举报