Java學習第九天

內部類:

在非靜態內部類實例裏面,保存着一個它寄存的外部類實例的引用(當使用一個非靜態內部類的實例時,該實例必須有一個外部類的實例引用。也即是說,非靜態內部類實例必須寄存在外部類實例裏面)。

內部類(靜態或非靜態)本質上是類的成員變量。

局部內部類(方法內類)是方法的局部變量。就如方法內變量 int i;一樣,不能使用任何訪問修飾符或static。

 

如果匿名內部類使用了外部類的成員,則該成員必須是final修飾的。

如果局部內部類使用了方法或方法參數的變量,則該變量必須是final修飾的。

 

 非靜態內部類能有靜態聲明,無論是靜態初始快,還是靜態屬性、方法

 

class  OutterClass
{
	private int count;

	//內部類
	private class InnerClass
	{
		/*static 非靜態內部類不能有靜態聲明,無論是靜態初始快,還是靜態屬性、方法
		{
			System.out.println("內部類靜態初始化塊執行!");
		}*/
		{
			System.out.println("內部類普通初始化塊執行!");
		}
		public InnerClass()
		{
			System.out.println("內部類構造方法執行!");
		}
	}
}

 

關於內部類訪問級別的代碼測試:

package lesson8;
//外部類
class  OutterClass
{
	private int count=1008;
	private static int eyecount;

	//內部類
	private class InnerClass
	{
		/*static 非靜態內部類不能有靜態聲明,無論是靜態初始快,還是靜態屬性、方法
		{
			System.out.println("內部類靜態初始化塊執行!");
		}*/

		//Error:原因 非靜態內部類不能有靜態聲明,無論是靜態初始快,還是靜態屬性、方法
		private static int count = 100;

		//Error: 非靜態內部類不能有靜態聲明,無論是靜態初始快,還是靜態屬性、方法
		public static void hello()
		{
		}

		private int id=1000;
		{
			System.out.println("內部類普通初始化塊執行!");
		}
		public InnerClass()
		{
			System.out.println("內部類構造方法執行!");
		}

		public int getID()
		{
			eyecount = 128128;//外部類靜態成員
			eyecount++;
			return count;//外部類中的count
		}

		
	}

	//外部類代碼
   public InnerClass getInner()//如果內部類爲private,則返回的InnerClass實例不能用來訪問其屬性或方法.儘管可以返回實例引用!
		{
			InnerClass inner = new InnerClass();
			System.out.println("外部類count="+inner.getID()+" ;外部類靜態成員eyecount="+eyecount);
			System.out.println("OutterClass.eyecount(static)="+OutterClass.eyecount);
			
			return inner;
		}

     //外部類靜態方法
     public static test()
    {
     new InnerClass();//Error : 外部類靜態方法不能訪問非靜態內部類。就如靜態方法不能訪問非靜態成員變量。
    }
}

//測試
class Test
{

    public static void main(String[] args) 
	{
		OutterClass outer = new OutterClass() ;
		System.out.println(outer.getInner());//OK
		//System.out.println(outer.getInner().getID());//錯誤。不能調用getID(),因爲內部類爲private,儘管可以返回實例
	}

}

 

 

package lesson8;
//外部類
class  OutterClass
{
	private int count=1008;
	private static int eyecount;

	//內部類
	private class InnerClass
	{
		/*static 非靜態內部類不能有靜態聲明,無論是靜態初始快,還是靜態屬性、方法
		{
			System.out.println("內部類靜態初始化塊執行!");
		}*/

		//Error:原因 非靜態內部類不能有靜態聲明,無論是靜態初始快,還是靜態屬性、方法
		//private static int count = 100;

		//Error: 非靜態內部類不能有靜態聲明,無論是靜態初始快,還是靜態屬性、方法
		/*public static void hello()
		{
		}*/
		
		public int innerID = 518;

		private int id=1000;
		{
			System.out.println("內部類普通初始化塊執行!");
		}
		public InnerClass()
		{
			System.out.println("內部類構造方法執行!");
		}

		

		public int getID()
		{
			/*
			內部類可以直接訪問外部類的成員變量(或方法),無論外部類成員變量(或方法)訪問權限如何
			*/
			Hello();
			eyecount = 128128;//外部類靜態成員
			eyecount++;
			return count;//外部類中的count

		}

		
	}


	//外部類代碼
	private void Hello()
		{
			
			System.out.println("外部類 Hello!");
		}


   public InnerClass getInner()//如果內部類爲private,則返回的InnerClass實例不能用來訪問其屬性或方法.儘管可以返回實例引用!
		{
			InnerClass inner = new InnerClass();

            /*
			外部類不能直接訪問內部類的屬性或方法,必須通過實例引用纔可以訪問。無論內部類成員變量(或方法)訪問權限如何
			*/
			//innerID = 518518;//Error:必須通過實例引用纔可使使用內部類變量或方法

			inner.innerID = 518518;//OK

			System.out.println("外部類count="+inner.getID()+" ;外部類靜態成員eyecount="+eyecount);
			System.out.println("OutterClass.eyecount(static)="+OutterClass.eyecount);

			
			return inner;
		}
}

//測試類
class Test
{

    public static void main(String[] args) 
	{
		OutterClass outer = new OutterClass() ;
		System.out.println(outer.getInner());//OK
		//System.out.println(outer.getInner().getID());//錯誤。不能調用getID(),因爲內部類爲private,儘管可以返回實例
	}

}


 

 

靜態內部類:

靜態內部類是屬於外部類整個類的,不屬於外部類的某個實例對象。靜態外部類實例不寄存與外部類實例之中。

靜態內部類不能引用外部類的非靜態成員。

 

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