关于内部类,静态内部类的一点总结

113 阅读3分钟

内部类:定义在一个类内部的类 成为内部类 (只有在外部类调用的时候进行实例化)

静态内部类:定义在一个类内部的类 并且被static修饰的类 称为静态内部类 (使用时才加载

 



public class OutterClass {
	
	//外部类的静态变量
	private static int a = 0;
	//外部类的成员变量
	private  int b = 0;
	
	
	public static void staticVoid() {
		System.out.println("外部类的StaticVoid");
	}
	
	public  void notStaticVoid() {
		 System.out.println("外部类的notStaticVoid");
	}
	
	//return 内部类
	public InnerClass getInnerClass() {
		return new InnerClass();
		
	}
	
	
	//内部类
	 class   InnerClass{
		 
		 	private String s1;
			//private static String s2;      //内部类不能有静态的变量
		 	private static final String s2 = "Liming";
			private void str2() {}
			
		 
		public void name() {
			System.out.println("内部类");
			System.out.println(a); //内部类可以访问外部类的静态变量
			System.out.println(b);
			staticVoid();
			notStaticVoid();
			
		}
		
		// 编译报错  内部类不能有静态的方法
		/*public static void ssss() {
			
		}*/
		
				//内部类的内部类
		 class InnerClassInnerClass{
					public void name() {
						System.out.println("内部类的内部类");
						staticVoid();
						notStaticVoid();
					}
				}
				 
				 
				 //内部类的静态内部类------》 不存在的 , static  修饰的属于类 在类加载的时候初始化,  内部类的内部类在 new 的时候初始化, 如果静态内部类成立,这不就矛盾了吗?
 				 /*	 static class  InnerClassStaticInnerClass2{
						
						public void name() {
							//静态内部类可以访问外部类的静态变量,以及方法
							staticVoid();
							System.out.println(a);
							//System.out.println(b);  //不能访问非静态成员
							System.out.println("静态内部类方法");
							new OutterClass().notStaticVoid();
							
						}
						
				 }*/
		 
	}
	
	 
	//静态内部类
	 public static class  StaticInnerClass{
		
		private String s1;
		private static String s2;
		private void str2() {}
		
		
		public void name() {
			//静态内部类可以访问外部类的静态变量,以及方法
			staticVoid();
			System.out.println(a);
			//System.out.println(b);  //不能访问非静态成员
			System.out.println("静态内部类方法");
			new OutterClass().notStaticVoid();
			
		}
		
		public static void names() {
			//静态内部类可以访问外部类的静态变量,以及方法
			staticVoid();
			System.out.println(a);
			//System.out.println(b);  //不能访问非静态成员
			System.out.println("静态内部类方法");
			new OutterClass().notStaticVoid();
			
		}
		
		 class StaticInnerClassInnerClass{
			public void name() {
				// System.out.println(b);  不能访问外部类的非静态成员
				System.out.println("静态内部类的内部类");
				//静态内部类的内部类可以访问静态内部内的方法
				new OutterClass.StaticInnerClass().name();
				//可以方法外部类的静态 方法 和 静态啊变量
				new OutterClass().notStaticVoid();
				staticVoid();
				System.out.println(a);
			}
		}
	}
	
	 
		
		public static void main(String[] args) {
			
			//实例化外部类
			OutterClass out = new OutterClass();
			
			/************************** 内部类  *********************************/
			
			//调用方法一  在外部类中 通过一个方法返回一个内部类对象
			InnerClass innerClass = new OutterClass().getInnerClass();
			
			//调用方法二
			OutterClass.InnerClass inner = out.new InnerClass();
			inner.name();
			inner.str2();  // 外部类可以方位内部类私有的方法
			
			//内部类的内部类
			OutterClass.InnerClass.InnerClassInnerClass in2 = inner.new  InnerClassInnerClass();
			in2.name();
			
			
			//继续调用里面的类部类,也可以继续在内部内里面返回一个内部类的方法
			InnerClass.InnerClassInnerClass i2 = innerClass.new InnerClassInnerClass();
			i2.name();
			
			/************************** 静态内部类 *********************************/
			 //调用静态内部类
			 OutterClass.StaticInnerClass s = new OutterClass.StaticInnerClass();
			 s.name(); 								//静态内部类方法
			 s.str2();                              //外部类 可以访问 静态内部类私有方法
			 //静态内部类的内部类
			 StaticInnerClassInnerClass staticInnerClassInnerClass = s.new StaticInnerClassInnerClass();
			 staticInnerClassInnerClass.name();		//静态内部类的内部类
		}
	
}

 

 

 

  外部类访问内部类和静态内部类: 

    

1  首先实例化外部类   2  实例化内部类                       外部类 . 内部类   xx = 外部类的引用 . new  内部类();

1     外部类访问静态内部类                                          外部类  xx   =  new 外部类() . 静态内部类();

访问外部类总结

   1     内部类可以访问外部类的 静态成员 和 静态变量         , 静态方法(外部类 . 的形式)和非静态方法(直接访问)

2      静态内部类 只能访问外部类 静态变量             ,   静态方法(外部类 . 的形式),外部类非静态方法(直接访问)

方法,成员变量和静态变量:

1 外部类    可以访问 “内部类” 或者 “ 静态内部类” 的 私有的方法        
2  内部类, 静态内部类 都可以有 “ 成员变量 ”  ,

3 内部类不能有静态的方法,以及静态变量 (内部类只有在实例化也就是外部类调用的时候初始化,所以不能有static)

4 静态内部类 只能访问外部类的静态方法,静态内部类可以包含静态和非静态方法 以及 变量。