每天早上都是想幹翻這個世界,晚上回來時被這個世界乾的服服帖帖。被生活瘋狂蹂躪,依然熱愛生活。
- 內部類
- 成員內部類
- 私有內部類
- 靜態內部類
- 局部內部類
- 匿名內部類
- 枚舉
零、內部類
內部類就是類中的類
1、內部類的作用
- 內部類可以很好的實現隱藏
- 一般的非內部類,是不允許有
private
與protected
權限的,但是內部類可以
- 一般的非內部類,是不允許有
- 內部類擁有外部類的所有元素的訪問權限(包含
private
) - 可以實現多重繼承
- 匿名內部類優化接口
一、成員內部類
成員內部類就類似與類的成員屬性,不在方法內部的類叫做成員內部類。
成員內部類可以無條件的訪問外部類所有成員屬性和方法(包含priavte
和static
)
1、成員內部類創建對象
// 外部類
public class A {
public A() {
System.out.println("外部類");
}
// 成員內部類
class A1{
public A1() {
System.out.println("成員內部類");
}
}
}
public class Test1 {
public static void main(String[] args) {
A.A1 a1 = new A().new A1();
A a = new A();
A.A1 a2 = a.new A1();
}
}
運行結果 |
---|
外部類 成員內部類 外部類 成員內部類 |
成員內部類創建對象格式
外部類.內部類 變量名 = new 外部類().new 內部類();
或者
外部類 變量名1 = new 外部類();
外部類.內部類 變量名2 = 變量名1.new 內部類();
成員內部類創建對象會先創建外部類對象。
2、成員內部類訪問外部類屬性和方法
// 外部類
public class A {
private String str = "外部類的String變量"; // 私有的成員屬性
public A() {
System.out.println("外部類");
}
private void ab(){
System.out.println("外部類ab()方法");
}
// 成員內部類
class A1{
String str = "內部類的String變量";
public A1() {
System.out.println("成員內部類");
}
public void a1(){
System.out.println(str); // 調用的內部類的屬性
System.out.println(A.this.str); // 調用的外部類的屬性
ab(); // 調用內部類的方法
A.this.ab(); // 調用調用外部類方法
// 創建外部類對象訪問
A a = new A();
System.out.println(a.str);
a.ab();
}
public void ab(){
System.out.println("內部類ab()方法");
}
}
}
public class Test1 {
public static void main(String[] args) {
A.A1 a1 = new A().new A1();
a1.a1();
}
}
運行結果 |
---|
外部類 成員內部類 內部類的String變量 外部類的String變量 內部類ab()方法 外部類ab()方法 外部類 外部類的String變量 外部類ab()方法 |
可以通過外部類類名.this.方法名
或外部類類名.this.屬性
來訪問外部類的方法或者屬性
也可以以普通方式在內部類中創建外部類的對象來訪問
內部類可以訪問外部類私有的屬性和方法
二、私有內部類
如果一個內部類只希望被外部類的方法操作,則可以使用private
修飾聲明內部類爲私有內部類
public class A {
private class AB{
void ab1(){
System.out.println("私有內部類ab1()方法");
}
}
void a(){
AB ab = new AB();
ab.ab1();
}
}
public class Test {
public static void main(String[] args) {
A a = new A();
a.a();
}
}
運行結果 |
---|
私有內部類ab1()方法 |
內部類無法通過外部類.內部類 變量名 = new 外部類().new 內部類();
創建對象,只能在外部類中使用內部類,創建內部類對象
三、靜態內部類
靜態內部類類似靜態方法,只能訪問靜態的外部類的成員變量和方法
public class A {
static int a;
public A() {
System.out.println("外部類");
}
static class AB{
public AB() {
System.out.println("靜態內部類");
}
void ab(){
System.out.println(a);
System.out.println("我是靜態內部方法");
}
}
}
public class Test {
public static void main(String[] args) {
A.AB ab = new A.AB();
ab.ab();
}
}
運行結果 |
---|
靜態內部類 0 我是靜態內部方法 |
靜態內部類使用A.AB ab = new A.AB();
創建對象
四、局部內部類
局部內部類類似與局部變量,只能在局部內使用
public class Test {
public static void main(String[] args) {
class A{
public A() {
System.out.println("我是局部內部類");
}
}
A a = new A();
}
}
運行結果 |
---|
我是局部內部類 |
局部內部類只能在方法內使用,超出作用域將不能使用
五、匿名內部類
匿名內部類就是沒有名字的類,一般如果某個類只使用一次,則可以將類定義爲匿名內部類
public class A {
void a1(){
}
}
public abstract class B {
abstract void a1();
}
public interface C {
String a1();
}
public class Test {
public static void main(String[] args) {
new A(){
@Override
void a1() {
System.out.println("匿名內部類A");
}
}.a1();
B b = new B(){
@Override
void a1() {
System.out.println("匿名內部類B");
}
};
b.a1();
System.out.println(new C() {
@Override
public String a1() {
return "匿名內部類C";
}
}.a1());
}
}
匿名內部類可以繼承一個普通類或者抽象類或者實現一個接口,但是隻能同時實繼承或實現一個
如果實現了一個接口,該類是Object類的直接子類。匿名類繼承一個類或者實現一個類,不需要extends
或者implements
關鍵字
由於匿名內部類沒有名稱,所以類體中不能定義構造器,也不能使用關鍵字創建該類的實例
匿名內部類的定義、構造、和第一次使用都發生在同一個地方
六、枚舉
枚舉可以理解爲一個特殊的類,通過關鍵字enum實現,自動繼承Enum類
public class Test {
public static void main(String[] args) {
Color color = Color.GREEN;
System.out.println(color.ordinal()); // 獲取枚舉值的順序次數,從0開始
switch (color){
case RED:
System.out.println("紅色");
break;
case YELLOW:
System.out.println("黃色");
break;
case GREEN:
System.out.println("綠色");
break;
}
}
}
運行結果 |
---|
2 綠色 |