內部類是什麼?匿名內部類又是什麼?

小不點_發表於2020-11-13


前言

內部類:成員內部類、區域性內部類、匿名內部類

1. 內部類的概念及格式

1.1 概念

在一個類中定義一個類。舉例:在一個類A的內部定義一個類B,類B就被稱為內部類

1.2 格式

/* 
	格式: 
	class 外部類名{ 
		修飾符 class 內部類名{ 
		
		} 
	} 
*/
class Outer { 
	public class Inner { 
	
	} 
}

1.3 內部類的訪問特點

內部類可以直接訪問外部類的成員,包括私有
外部類要訪問內部類的成員,必須建立物件

1.4 示例程式碼

public class Outer { 
	private int num = 10; 
	public class Inner { 
		public void show() { 
			System.out.println(num); 
		} 
	}
	public void method() { 
		Inner i = new Inner(); 
		i.show(); 
	} 
}

2. 成員內部類

  1. 成員內部類的定義位置 :
    在類中方法,跟成員變數是一個位置 ;
  2. 外界建立成員內部類格式 :
    格式:外部類名.內部類名 物件名 =外部類物件.內部類物件;
    舉例:Outer.Inner oi = new Outer().new Inner();
  3. 成員內部類的推薦使用方案 :
    將一個類,設計為內部類的目的,大多數都是不想讓外界去訪問,所以內部類的定義應該私有化,私有
    化之後,再提供一個可以讓外界呼叫的方法,方法內部建立內部類物件並呼叫.

示例程式碼:

class Outer {
    private int num = 10;
    private class Inner {
        public void show() {
            System.out.println(num);
        }
    }

    public void method() {
        Inner i = new Inner();
        i.show();
    }

}
public class InnerDemo {
    public static void main(String[] args) {
		//Outer.Inner oi = new Outer().new Inner();
		//oi.show();
        Outer o = new Outer();
        o.method();
    }
}

3. 區域性內部類

  1. 區域性內部類定義位置 :
    區域性內部類是在方法中定義的類 ;
  2. 區域性內部類方式方式 :
    區域性內部類,外界是無法直接使用,需要在方法內部建立物件並使用;
    該類可以直接訪問外部類的成員,也可以訪問方法內的區域性變數 示例程式碼.

示例程式碼:

class Outer {
	private int num = 10;
    public void method() {
        int num2 = 20;
        class Inner {
            public void show() {
                System.out.println(num);
                System.out.println(num2);
            }
        }
        Inner i = new Inner();
        i.show();
    }
}

public class OuterDemo {
    public static void main(String[] args) {
        Outer o = new Outer();
        o.method();
    }
}

4. 匿名內部類

  1. 匿名內部類的前提
    存在一個類或者介面,這裡的類可以是具體類也可以是抽象類
  2. 匿名內部類的格式
    格式:new 類名 ( ) { 重寫方法 } new 介面名 ( ) { 重寫方法 }
    舉例:
new Inter(){
	@Override 
	public void method(){
		
	} 
}
  1. 匿名內部類的本質
    本質:是一個繼承了該類或者實現了該介面的子類匿名物件
  2. 匿名內部類的細節
    匿名內部類可以通過多型的形式接受
Inter i = new Inter(){ 
	@Override 
	public void method(){
	
	} 
}
  1. 匿名內部類直接呼叫方法
interface Inter{ 
	void method(); 
}
class Test{ 
	public static void main(String[] args){ 
		new Inter(){ 
			@Override 
			public void method(){ 
				System.out.println("我是匿名內部類"); 
			} 
		}.method(); // 直接呼叫方法 
	} 
}

5. 匿名內部類在開發中的使用

當發現某個方法需要,介面或抽象類的子類物件,我們就可以傳遞一個匿名內部類過去,來簡化傳統的 程式碼

示例程式碼:

/*
    跳高介面
 */
public interface Jumpping {
    void jump();
}

public class Cat implements Jumpping {
    @Override
    public void jump() {
        System.out.println("貓可以跳高了");
    }
}

public class Dog implements Jumpping {
    @Override
    public void jump() {
        System.out.println("狗可以跳高了");
    }
}

/*
    介面操作類,裡面有一個方法,方法的引數是介面名
 */
public class JumppingOperator {
    public void method(Jumpping j) { //new Cat();   new Dog();
        j.jump();
    }
}

/*
    測試類
 */
public class JumppingDemo {
    public static void main(String[] args) {
        //需求:建立介面操作類的物件,呼叫method方法
        JumppingOperator jo = new JumppingOperator();
        Jumpping j = new Cat();
        jo.method(j);

        Jumpping j2 = new Dog();
        jo.method(j2);
        System.out.println("--------");

        jo.method(new Jumpping() {
            @Override
            public void jump() {
                System.out.println("貓可以跳高了");
            }
        });

        jo.method(new Jumpping() {
            @Override
            public void jump() {
                System.out.println("狗可以跳高了");
            }
        });

    }
}

相關文章