各种内部类 方法内部类:(短暂性的 )

 

内部类可以定义为: 接口 , 抽象类

部类的命名不允许与外部类 重名,内部类可以继承同级的内部类,也可继承其它类(除内部类和外部类)

 

成员内部类 (高度内聚(不为外面知道))

package memberinner;

//成员内部类
public class Out{
	public int i = 23;
	
	//一个内部类
	//它可以访问所有方法,字段和外部类本身的引用
	class Inner{
		public void say(){
			System.out.println("内部类可以引用所有字段的引用:"+i);
			mehtod1();
			System.out.println("本身内部类的自身引用:"+this);
			System.out.println("外部类的引用:"+Out.this);
		}
	}
	
	//内部方法
	public void mehtod1(){
		System.out.println("这是一个方法");
	}
	
	//调用
	public static void main(String[] args) {
		Out o = new Out();
		//创建内部类的 实例
		Inner i = o.new Inner();
		i.say();
	}

	public String toString() {
		return "Out [i=" + i + "]";
	}
}

输出为:

字段的引用:23
这是一个方法
本身内部类的引用:memberinner.Out$Inner@2a139a55
外部类的引用:Out [i=23]

 

方法内的内部类不能加范围限定(protected public private)
方法内的内部类不能加static修饰符

方法内的内部类只能在方法内构建其实例
方法内的内部类如果访问方法局部变量,则此局部变量必须使用final修饰

package memberinner;


public class MothedInner {
	
	public void methodInn(){
		//方法内部类   调用这个方法时才是有效(短暂性)
		//类内部 自己调用
		class inn {
			public void method() {
				System.out.println("这里是方法内部类");
			}
		}
		inn i = new inn();
		i.method();
		
	}
	
	public static void main(String[] args) {
		new MothedInner().methodInn();
	}
}	

  

运行的结果为:

  这里是方法内部类

匿名内部类:

匿名内部类也就是没有名字的内部类

正因为没有名字,所以匿名内部类只能使用一次,它通常用来简化代码编写

但使用匿名内部类还有个前提条件:必须继承一个父类或实现一个接口

package memberinner;

//定义一个接口
interface Person{
	public abstract void eat();
}


public class AnonyousClass {
	
	
	//使用接口
	public static void fun1(){
		//通过匿名 内部类来实现 接口中方法
			Person p = new Person(){
				public void eat(){
					System.out.println("人是可以吃饭的!   通过接口");
				}
			};
			//调用  内部类的 方法;
			p.eat();
	}

	//使用  Thread 线程 
	public static void fun2(){
		Thread t = new Thread(){
			public void run() {
				System.out.println("通过继承thread 实现里面的方法");
			}
		};
		t.run();
	}
	
	//使用  Runnable 线程 
	public static void fun3(){
		Runnable t = new Runnable(){
			public void run() {
				System.out.println("通过实现 Runnable 接口 实现里面方法");
			}
		};
		t.run();
	}
	
	public static void main(String[] args) {
		fun1();
		System.out.println("============");
		fun2();
		System.out.println("============");
		fun3();
	}

}

运行的结果为:

人是可以吃饭的! 通过接口
============
通过继承thread 实现里面的方法
============
通过实现 Runnable 接口 实现里面方法