第38節:hashCode()與toString()與equals()函數的作用,內部類和匿名內部類
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();
}
}
內部類的分類:
靜態內部類;局部內部類;成員內部類;匿名內部類
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()與equals()函數的作用,內部類和匿名內部類