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()方法採用的是淺克隆的方式
淺克隆的細節:
- 如果一個對象需要調用clone的方法克隆,那麼該對象所屬的類必須要實現Cloneable接口。
- Cloneable接口只不過是一個標識接口而已,沒有任何方法。
- 對象的淺克隆就是克隆一個對象的時候,如果被克隆的對象中維護了另外一個類的對象,這時候只是克隆另外一個對象的地址,而沒有把另外一個對象也克隆一份。
- 對象的淺克隆也不會調用到構造方法的。
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();
}
}