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