Java語言基礎(內部類,匿名內部類,object類)

1.內部類

在這裏插入圖片描述

成員內部類

class Outer
{	
      class Inner	
         {	
             //成員內部類	}
}

特點:

  • 1、成員內部類可以直接訪問外部類的成員,包括私有的,也可以通過 外部類名.this.成員名調用外部成員
  • 2成員內部類和外部類不存在繼承關係
  • 3訪問成員內部類的格式:Outer.Inner oi = new Outer().new Inner();

局部內部類

class Outer{
	public void method()	{	
	        final int a = 10;		
	           class Inner	{			
	    System.out.println(a);
	    	//局部內部類		
	          }	
	       }
	}

特點:

  • 可以直接訪問外部類的成員

  • 在局部位置可以創建局部內部類對象,通過對象調用成員
    注意:
    局部內部類訪問局部變量必須用final修飾 JDK1.8之後默認加上

因爲局部變量會隨着方法的調用完畢而消失,這個時候,局部對象並沒有立馬從堆內存中消失,還要使用那個變量,爲了讓數據還能繼續被使用,就用fianl修飾,這樣,在堆內存裏面存儲的其實是一個常量值。

匿名內部類

前提: 存在一個類或者接口;這裏的類可以是具體類也可以是抽象類。
本質:是一個繼承了該類或者實現了該接口的子類匿名對象

public abstract class Person//抽象類 或  interface Person 接口
{ 
      public abstract void work();
        } 
new Person(){
	public void work()	
	{		
	System.out.println("work");	}
}.work();

靜態內部類

package laolao;
class didi{
    public static void main(String[] args) {
        new di();
        new  di.dada().eat();
    }
}
 class di {
  static  int age=10;
      static    class dada{
          public void eat(){
              int a = di.age;
              System.out.println(a);
          }
    }
}

特點:

  • 靜態內部類訪問的外部類數據必須用靜態修飾。
  • 成員方法可以是靜態的也可以是非靜態的
  • 格式: 外部類名.內部類名 對象名 = new 外部類名.內部類名();

2.object類

概述: 類層次結構的根類
所有類都直接或者間接的繼承自該類

(1)Object類的hashCode()方法

  • 返回該對象的哈希碼值。
    默認情況下,該方法會根據對象的地址來計算。
  • 不同對象的,hashCode()一般來說不會相同。
    但是,同一個對象的hashCode()值肯定相同。
  • 不是對象的實際地址值,可以理解爲邏輯地址值。

(2)Object類的getClass()方法

  • 返回此 Object 的運行時類。
  • 可以通過Class類中的一個方法,獲取對象的真實類的全名稱。
    public String getName()

(3)Object類的toString()方法

  • 返回該對象的字符串表示
 源代碼:
 public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
    }

(4)Object類的equals()方法

  • 指示其他某個對象是否與此對象“相等”。
  • 默認情況下比較的是對象的引用是否相同
源代碼:
public boolean equals(Object obj) {
         return (this == obj);
    }

注意:== 和 equals() 有什麼區別?

==是一個比較運算符,他可以比較基本數據類,也可以比較引用數據類型,比較基本數據類型,比較的是兩個值是否相同,比較引用數據類型,比較的是地址值是否相同。
equals() 是Object類中的方法,只能比較引用數據類型,比較的是兩個對象的地址值是否相同

(5)Object類的clone() 方法

  • clone()的權限修飾符是受保護的
  • 對象的克隆:淺克隆和深克隆
  • 使用clone()方法採用的是淺克隆的方式

淺克隆的細節:

  1. 如果一個對象需要調用clone的方法克隆,那麼該對象所屬的類必須要實現Cloneable接口。
  2. Cloneable接口只不過是一個標識接口而已,沒有任何方法。
  3. 對象的淺克隆就是克隆一個對象的時候,如果被克隆的對象中維護了另外一個類的對象,這時候只是克隆另外一個對象的地址,而沒有把另外一個對象也克隆一份。
  4. 對象的淺克隆也不會調用到構造方法的。
public class MyTest {
    public static void main(String[] args) throws CloneNotSupportedException {
        Dog dog = new Dog("旺財", 3);
        Dog dog2 = (Dog) dog.clone();
        dog2.name="小白";
        System.out.println(dog2.name);
        System.out.println(dog2.age);
    }
}
class Dog extends Object implements Cloneable{
    String name;
    int age;
    public Dog(String name, int age) {
        this.name = name;
        this.age = age;
    }
    @Override
    public Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章