Java進階總結7——內部類、枚舉

1.內部類

 * 內部類:在類的內部定義一個類,可以看做類的成員
 * 類的成員:字段、方法、類
 * 內部類類型:
 *         1.實例內部類
 *         2.靜態內部類
 *         3.局部內部類
 *         4.匿名內部類

 1.1 實例內部類

     * 實例內部類
     *         位置:類中,方法外
     *         修飾符:public、private、protected、默認
     *         不能有:static
     *         類中定義的成員
     *                 不能使用static進行修飾
     *                 訪問權限修飾符:都可以
     *         內部類訪問外部類的成員
     *             在內部類中可以直接訪問外部類的成員(實例和靜態)

 

package day13.innerclass;

public class OutDemo1 {
	//外部類的屬性
	String name;
	int age;
	//外部類的方法
	public void method1() {
		System.out.println("外部類");
	}
	//定義一個實例內部類
	class Inner{
		//定義內部成員
		String name;
		//static int  num;//不能使用static進行修飾
		public void printmsg() {
			System.out.println("實例類的內部方法:"+name);
		}
		public void printOutMsg() {
			//如果外部類成員和內部類成員一致,默認訪問的是內部類成員
			//如果是訪問外部類成員
			System.out.println(OutDemo1.this.name);
			//調用外部類的method1方法
			OutDemo1.this.method1();
			//通過內部類給外部類成員賦值
			OutDemo1.this.age=21;
		}
		public void method1() {
			System.out.println("內部類");
		}
		//構造方法
		public Inner() {
			// TODO 自動生成的構造函數存根
			System.out.println("內部類默認構造方法");
		}
		
	}
	
}
package day13.innerclass;

import day13.innerclass.OutDemo1.Inner;

public class TestDemo {
	public static void main(String[] args) {
		//使用內部類
		//初始化外部類
		OutDemo1 out=new OutDemo1();
		out.name="浪子一秋";
		//初始化一個內部類
		Inner inner=out.new Inner();
		//給內部類賦值
		inner.name="尊";
		//訪問內部類的方法
		inner.printmsg();
		inner.printOutMsg();
		inner.method1();
		//直接初始化一個內部類,但是外部類不能直接訪問
		OutDemo1.Inner in=new OutDemo1().new Inner();
		in.printOutMsg();
		
	}
}

 

1.2靜態內部類

     * 靜態內部類
     *         位置:類中,方法外
     *         修飾符:只能static abstract  final  public  private  protected  默認
     *         成員:靜態,非靜態

package day13.innerclass;

public class OutDemo2 {
	String name;
	static int number;
	public void method1() {
		System.out.println("外部類實例方法");
		
	}
	public static void method2() {
		System.out.println("外部類靜態方法");
	}

	static class Inner1{
		String name;
		static int age;
		public Inner1() {
			// TODO 自動生成的構造函數存根
			System.out.println("內部類默認構造方法");
		}
		public void method1() {
			System.out.println("內部類實例成員");
			//靜態內部類實例成員可以訪問外部類的靜態成員
			number=100;
			name="尊";//代表內部類
			//OutDemo2.this.name="11";//不允許訪問外部類的實例成員
		}
		public static void method2() {
			//只能訪問外部類的靜態成員
			System.out.println("內部類靜態成員");
		}
	}
	public static void main(String[] args) {
		//初始化一個靜態內部類,沒有初始化外部類
		OutDemo2.Inner1 inner1=new OutDemo2.Inner1();
		//訪問內部類成員,可以訪問使用成員
		inner1.method1();//內部類實例成員
		inner1.method2();//內部類靜態成員
		//直接訪問內部類的靜態成員,通過類名訪問
		OutDemo2.Inner1.age=21;
		OutDemo2.Inner1.method2();
		//內部類可以訪問外部類的靜態成員		
	}
}

 1.3局部內部類

     * 局部內部類
     *         位置:方法中
     *         成員:必須是實例成員
     * 只能在聲明方法中使用

 

package day13.innerclass;

public class OutDemo3 {
	//屬性
	String name;
	int sex;
	public void methord1() {
		System.out.println("外部類的實例方法");
	}

	public void method2() {
		int num=10;
		class Inner2{
			String name;
			int age;
			public void method3() {
				//局部內部類可以訪問外部類的所有成員
				System.out.println(sex);
				//訪問外部類、方法內的局部變量,局部變量必須加上final修飾符,jdk1.8之後不需要加
				System.out.println(num);
				System.out.println("局部內部類的實例方法");
			}
			/*public static void method4() {
				
			}*/			
		}
		//初始化一個內部類對象
		Inner2 in=new Inner2();
		in.name="尊";
		in.age=21;
		in.method3();
	}
	public static void main(String[] args) {
		//初始化一個外部類對象
		OutDemo3 demo3=new OutDemo3();
		demo3.method2();
	}
}

1.4匿名內部類

     * 匿名內部類:當前這個類是沒有名字的
     * 定義的位置:方法內

package day13.innerclass;
//聲明一個接口
interface MyInterface{
	public void sendMsg(String msg);
}
public class OutDemo4 {
	public static void method3(MyInterface face) {
		face.sendMsg("你好啊");
	}

	public static void main(String[] args) {
		//定義了一個匿名的類,類的名字不知道,這個類肯定實現了接口
		MyInterface face=new MyInterface() {
			//屬性
			
			//方法
			void method2(){
				System.out.println("Hello");
			}
			@Override
			public void sendMsg(String msg) {
				// TODO 自動生成的方法存根
				System.out.println(msg);
			}
		};
		//多態
		method3(face);
	}
}

 2 枚舉

     * 默認繼承java.lang.enum這個類
     * 使用過程中,只用神祕常量
     * 多個常量之間用逗號隔開
     * 常量必須放在第一行
     * 常量都是引用數據類型 ,都是當前枚舉的對象

package day13.Test;
//定義一個枚舉類
enum Weekday3{

	MON,TUES,WEDES,THURS,FRI,SATUR,SUN;
	//public static final Weekday3 MON=new Weekday3();等價於MON	
	//枚舉類內部,可以聲明字段、方法、構造方法、內部類,必須放在常量之後
	int age;
	public void method1() {
		System.out.println("寫代碼");
	}
	//構造方法必須私有化
	private Weekday3() {}
}
public class Employee3 {
	//屬性
	private Weekday3 restday;

	public Weekday3 getRestday() {
		return restday;
	}

	public void setRestday(Weekday3 restday) {
		this.restday = restday;
	}
	//判斷是否是休息日
	public void restDay() {
		switch (this.restday) {
			case MON:
			case	 TUES:
			case WEDES:
			case THURS:
			case FRI:
			case SATUR:
				System.out.println("天天寫代碼");
				break;
			case SUN:
				System.out.println("休息一天");
				break;
		}
	}
	public static void main(String[] args) {
		//初始化對象
		Employee3 em3=new Employee3();
		//數組屬性的值  枚舉
		em3.setRestday(Weekday3.FRI);
		//判斷
		em3.restDay();
		//獲取枚舉對象的名稱
		String name=Weekday3.SUN.name();
		System.out.println(name);
		name=Weekday3.FRI.toString();
		System.out.println(name);
		//獲取枚舉對象  常量的序列號 從0開始
		int index=Weekday3.THURS.ordinal();
		System.out.println(index);
		//獲取所有的枚舉常量,返回一個數組對象
		Weekday3[]arr=Weekday3.values();
		for(Weekday3 weekday3:arr){
			System.out.println(weekday3);
		}
		//將string類型轉換成枚舉常量,要去string名稱和枚舉常量名稱一致
		Weekday3 day=Weekday3.valueOf("SUN");
		System.out.println(day);
		System.out.println(day.ordinal());
	}
}

3.知識框架

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章