【javaSE】内部类、成员内部类、静态内部类、方法内部类、匿名内部类

内部类

  • 内部类就是嵌套在外部类中的类,比如:
class A{
	//这是外部类
	class B{
		//这是内部类
	}
}

1.内部类的优点

  • 内部类与外部类可以方便的访问彼此的私有域(包含私有方法、私有属性)
  • 内部类是另外一种封装(保护性),对外部的其他类隐藏不可见,比如:心脏在人身体内
  • 内部内部类可以实现Java单继承的局限

2.内部类的缺点

  • 结构复杂

3.创建内部类的语法

创建非静态内部类对象

  • 外部类.内部类 类名 = new 外部类().new 内部类();
Outter.Inner in = new Outter().new Inner();

创建静态内部类对象

  • 外部类.内部类 类名 = new 外部类().内部类();
Outter.Inner in = new Outter.Inner();

内部类的分类

一、成员内部类

  • 可以把它理解为外部类的一个成员方法
  • 非静态内部类不能存在static的变量和方法,因为在外部类加载的时候,内部类不会加载。static变量是类加载的时候就创建的。
  • 成员内部类是依附于外部类的,所以只有先创建了外部类才能创建内部类
class Outter{
    private String name = "test";
    private static int age = 20;
    clss Inner{
		//private static int age = 50 错误静态变量不能在内部类中声明
        public void fun(){
            System.out.println(name);
            System.out.println(age);
        }
    }
}
public class Test{
    public void mian
}

二、静态内部类

  • 静态内部类也可以类比静态方法
  • 静态内部类不依赖于外部类的对象的创建,可以直接创建。
  • 静态内部类不能访问外部类的非静态成员,但是可以自己创建静态成员
  • 静态内部类是独立的,只是在别的类内部罢了
class waibu{    
	//静态内部类 
	static int y = 10;    
	private int x = 20;    
	public static void fun2(){        
		System.out.println("qwe");    
	}    
	static class neibu{        
		static int p = 30;        
		public void fun(){            
			System.out.println("asd");            
			System.out.println(y);
        	}    
        }
}

三、方法内部类

  • 定义在方法之中的类
  • 只能被此方法所见,其他地方均不可见
  • 由于方法内部类不能在外部类的方法以外的地方使用,因此方法内部类不能使用访问控制符和 static 修饰符。
  • 方法内部类如果要想使用形参(本方法的形参),该形参必须使用final声明(JDK8将形参变为隐式final声明)
class waibu{    
	//方法内部类 
	static int y = 10;    
	private int x = 20;    
	public static void fun2(int k){        
		System.out.println("qwe");        
		class neibu{            
			int p = 30;            
			public void fun(){                
				System.out.println("asd");                
				System.out.println(y);                
				k = 80;                
				System.out.println(k);            
			}        
		}        
		new neibu().fun();            
	}    
}

四、匿名内部类

  • 匿名内部类就是一个没有名字的方法内部类。因此特点与方法内部类完全一样,
  • 除此之外还有两个自己的特点:
  • 1.匿名内部类必须继承一个抽象类或者实现一个接口
  • 2.匿名内部类没有构造方法,因为它没有类名
`interface jiekou{    
	void fun3();
}
class waibu{    //匿名内部类 
	static int y = 10;    
	private int x = 20;    
	public static jiekou fun2(int k){        
		System.out.println("qwe");            
		return new jiekou(){            
			int p = 30;            
			public void fun(){                
				System.out.println("asd");                
				System.out.println(y);                
				System.out.println(k);            
			}            
			public void fun3(){                
				System.out.println("匿名");            
			}        
		};    
	}    
}
    原文作者:程序瑶
    原文地址: https://blog.csdn.net/qq_39487033/article/details/83586475
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞