最も包括的なjavaにおけるstaticキーワードの分析

7967 ワード

staticキーワードについては、多くの人がうんざりしていると思います.私たちはstaticキーワードがこの場所で使えるし、その場所では使えないことがよくあるからです.どこで使えるのか、どこで使えないのか、なんだかはっきり言えないような気がします.今日のブログはstaticの使い方を全面的に整理しています.
まず、staticキーワードが作成されるのは、「共有を実現する」ためであるため、静的メンバーはクラスのロードに伴ってロードされ、静的メンバーはクラスのインスタンス化が発生したときにロードされることを明確にします.
クラス以外の場所ではメソッドを定義できません.
次にstaticの使用仕様を示します.
1.staticは外部クラスを修飾するために使用できません.
2.外部クラスの静的メンバーが自分の内部で外部クラスの他のメンバーを呼び出す場合、静的に調整するしかない.
3.外部クラスの非静的メンバーが自分の内部で外部クラスの他のメンバーを呼び出す場合、静的と非静的の両方を調整することができる.
4.外部クラスの静的メンバー内部クラスのみが、自分の内部で静的ローカルメンバーを定義することができる.他の外部クラスの静的または非静的メンバーは、静的ローカルメンバーを独自の内部で定義できません.
注意:以上の2~4つの仕様では、さまざまなフィールド、さまざまなメソッド、さまざまなコードブロック、またはさまざまな内部クラスを指す「メンバー」という言葉が何度も言及されています.
1点目の説明:
外部クラスの修飾子はpublic/package、abstract/finalの4種類のみで、「/」はこの2つの修飾子が同時に現れないことを意味します.したがってstaticは外部クラスを修飾するために使用できません.そうしないとコンパイルできません.
2、3点目の解釈:
まず2つ目を見てください.外部クラスの静的メンバーが自分の内部で外部クラスの他のメンバーを呼び出した場合、このときは外部クラスがロードされただけで、外部クラスのインスタンス化はまだ発生していない可能性があります.この場合、外部クラスの非静的メンバーはまったく存在せず、呼び出すことができません.
第3点:外部クラスの非静的メンバーが自分の内部で外部クラスの他のメンバーを呼び出すと、このとき必ず外部クラスのインスタンス化が発生し、外部クラスはその前に必ずロードされます.この場合、外部クラスの静的または非静的メンバーはすでに存在し、呼び出すことができます.
以下にサンプルコードを示します(テストの便宜上、相互に呼び出す方法を選択すると無限反復が発生するため、外部クラスOuterはnew操作を推奨しません.そうしないとStackOverflowError異常が放出されます).
package com.blogs;

class Outer {
//	          
	FieldTest fTest1 = new FieldTest() {
		@Override
		void say() {
//			                    、      
			System.out.println(fTest1);		//          
			System.out.println(fTest2);		//         
			func1();	//          
			func2();	//         
			new Inner1();	//           
			new Inner2();	//          
		}
	};
	
//	          
	void func1() {
//		                    、      
		System.out.println(fTest1);		//          
		System.out.println(fTest2);		//         
		func1();	//          
		func2();	//         
		new Inner1();	//           
		new Inner2();	//          
	}
	
//	           
	{
//		                     、      
		System.out.println(fTest1);		//          
		System.out.println(fTest2);		//         
		func1();	//          
		func2();	//         
		new Inner1();	//           
		new Inner2();	//          
	}
	
//	           
	class Inner1{
		void innerFun1() {
//			                     、      
			System.out.println(fTest1);		//          
			System.out.println(fTest2);		//         
			func1();	//          
			func2();	//         
			new Inner1();	//           
			new Inner2();	//          
		}
	}
	
	
	
//	         
	static FieldTest fTest2 = new FieldTest() {
		@Override
		void say() {
//		                       
//		System.out.println(fTest1);		//          ,     
		System.out.println(fTest2);		//         
//		func1();	//          ,     
		func2();	//         
//		new Inner1();	//           ,     
		new Inner2();	//          
		}
	};
	
//	         
	static void func2() {
//		                       
//		System.out.println(fTest1);		//          ,     
		System.out.println(fTest2);		//         
//		func1();	//          ,     
		func2();	//         
//		new Inner1();	//           ,     
		new Inner2();	//          
	}
	
//	          
	static {
//		                        
//		System.out.println(fTest1);		//          ,     
		System.out.println(fTest2);		//         
//		func1();	//          ,     
		func2();	//         
//		new Inner1();	//           ,     
		new Inner2();	//          
	}
	
//	          
	static class Inner2{
		void innerFun1() {
//			                        
//			System.out.println(fTest1);		//          ,     
			System.out.println(fTest2);		//         
//			func1();	//          ,     
			func2();	//         
//			new Inner1();	//           ,     
			new Inner2();	//          
		}
	}
}

abstract class FieldTest{
	abstract void say();
}

4点目の説明:
ここでは自分がまだいいと思う説明をしましょう.static修飾のローカルメンバーは、前のレベルがクラスである必要があり、javaのロードメカニズムのため、外部クラスのロードに伴ってロードする必要があります.このようにするには、外部クラスの静的メンバー内部クラスの静的ローカル変数のみが可能です.
以下はサンプルコードです(長すぎて、見なくてもいいです.上記の2つの言葉を覚えておけばいいです):
package com.blogs;

class InnerDefine {
//	          
	InnerDefineTest INT1 = new InnerDefineTest() {
		@Override
		void say() {
//			static String hjbh = "uyu";	//          ,   final    
			String string = "        ";	
			final int age = 2;
			string = "hjhg";
//			static{						//           ,      
//				System.out.println("gyiu");
//			}
			{
				System.out.println("gyiu");
			}
//			static class hh{			//           ,   "abstract/final/ "  ,          
//				
//			}
			final class jhh{
				
			}
			class hhjj{
				
			}
		}
	};
	
//	          
	void func1() {
//		static String hjbh = "uyu";	//          ,   final    
		String string = "        ";	
		final int age = 2;
		string = "hjhg";
//		static{						//           ,      
//			System.out.println("gyiu");
//		}
		{
			System.out.println("gyiu");
		}
//		static class hh{			//           ,   "abstract/final/ "  ,          
//			
//		}
		class hhjj{
			
		}
	}
	
//	           
	{	
//		static String hjbh = "uyu";	//          ,   final    
		String string = "        ";	
		final int age = 2;
		string = "hjhg";
//		static{						//           ,      
//			System.out.println("gyiu");
//		}
		{
			System.out.println("gyiu");
		}
//		static class hh{			//           ,   "abstract/final/ "  ,          
//			
//		}
		class hhjj{
			
		}
	}
	
//	           
	class Inner1{
//		static String hjbh = "uyu";	//          ,   final    
		String string = "        ";	//   final  
		final int age = 2;
//		string = "hjhg";
//		static{						//           ,      
//			System.out.println("gyiu");
//		}
		{
			System.out.println("gyiu");
		}
//		static class hh{			//           ,   "abstract/final/ "  ,          
//			
//		}
		class hhjj{
			
		}
//		static void gfj() {			//           
//			System.out.println("         ");
//		}
		void gfty() {
			System.out.println("          ");
		}
	}
	
	
	
	
	
//	         
	static InnerDefineTest INT2 = new InnerDefineTest() {
		@Override
		void say() {
//			static String hjbh = "uyu";	//          ,   final    
			String string = "        ";	
			final int age = 2;
			string = "hjhg";
//			static{						//           ,      
//				System.out.println("gyiu");
//			}
			{
				System.out.println("gyiu");
			}
//			static class hh{			//           ,   "abstract/final/ "  ,          
//				
//			}
			class hhjj{
				
			}
		}
	};
	
//	         
	static void func2() {
//		static String hjbh = "uyu";	//          ,   final    
		String string = "        ";	
		final int age = 2;
		string = "hjhg";
//		static{						//           ,      
//			System.out.println("gyiu");
//		}
		{
			System.out.println("gyiu");
		}
//		static class hh{			//           ,   "abstract/final/ "  ,          
//			
//		}
		class hhjj{
			
		}
	}
	
//	          
	static {	
//		static String hjbh = "uyu";	//          ,   final    
		String string = "        ";	
		final int age = 2;
		string = "hjhg";
//		static{						//           ,      
//			System.out.println("gyiu");
//		}
		{
			System.out.println("gyiu");
		}
//		static class hh{			//           ,   "abstract/final/ "  ,          
//			
//		}
		class hhjj{
			
		}
	}
	
//	          
	static class Inner2{
		static String hjbh = "uyu";	//          
		String string = "        ";	//   final  
		final int age = 2;
//		string = "hjhg";
		static{						//           
			int j=4;
			System.out.println("gyiu");
		}
		{	
			System.out.println("gyiu");
		}
		static class hh{			//           
			
		}
		class hhjj{
			
		}
		static void gfj() {
			System.out.println("         ");
		}
		void gfty() {
			System.out.println("          ");
		}
	}
}

abstract class InnerDefineTest{
	abstract void say();
}