java 内部类

在初用java编程时,对内部类的了解相对较少。并且对内部类的需求并不是老是很明显,也不知道使用的益处。但内部类是一种很是有用的特性,由于它容许你把一些逻辑相关的类组织在一块儿,并控制位于内部类的可视性。内部类能不只与外围类通讯,并且你用内部类写出的代码更加优雅而清晰。java

1.建立一个非静态内部类.new 若是内部类的可见性不是public ,那么它只能在外围类中访问到。但若是是public 就要以下建立:编程

public class Outer {
	class Inner{}
	
	public static void main(String[] args) {
		Outer outer = new Outer();
		Inner inner = outer.new Inner();
	}
}

2.连接到外部类 当生成一个内部类的对象时,此时对象与制造它的外围对象之间就有了一种联系,因此它能访问其外围对象的全部成员,而不须要任何特殊条件。此外内部类还拥有外围类的全部元素的访问权。这是如何作到?当某个外围类的对象建立一个内部类对象时,此内部对象一定会秘密地捕获一个指向那个外围类对象的引用。但你能够看到:内部类的对象只能在与其外围类的对象相关联的状况下才能被建立。构建内部类对象时须要一个指向其外围类对象的引用,若是编译器访问不到这个引用就会报错。 3.得到外围类的引用.this闭包

public class Outer {
	class Inner{
		//从内部类中得到外围类的实例自己
		public Outer getOuterInstance(){
			return Outer.this;
		}
	}
}

4.在方法中定义类,在一个做用域中定义类ide

public class Outer  {
	//在方法中定义类
	public Inner definedClass1(){
		class InnerImpl1 implements Inner{/*定义一个内部类*/}
		return new InnerImpl1();
	}
	
	//在一个做用域中定义类
	public Inner definedClass2(){
		Inner inner = null;
		if(1==1){
			class InnerImpl2 implements Inner{/*定义一个内部类*/}
			inner = new InnerImpl2();
		}
		return inner;
	}
}

5.在接口中的内部类,默认的是public satic 范围的如测试

interface fruit{
    class peach{} //这里一个public static 级的内部类
}

6.内部类的闭包与回调,例子体现了一个内部类很好的设计如:ui

/**
 * 表示一个可吃的对象  
 */
public interface Eatable {
	<T extends EatWay<?>> T geEatWay();
	/**
	 *  吃的方式
	 *  T 食物的种类
	 */
	interface EatWay<T>{
		T getFood();	//被吃的对象
		void eat();	//吃的具体行为
	}
}
public class Pear implements Eatable {

	@Override
	public EatWay<Pear> geEatWay() {
		return new PearEatWay();
	}
	@Override
	public String toString() {
		return "梨";
	}
	
	private class PearEatWay implements EatWay<Pear>{

		@Override
		public Pear getFood() {
			return Pear.this;
		}

		@Override
		public void eat() {
			System.out.println("这是一种水果,可直接食用!");
		}
		
	}

}
public class Beef implements Eatable {
	
	@Override
	public EatWay<Beef> geEatWay() {
		return new BeefEatWay();
	}
	@Override
	public String toString() {
		return "牛肉";
	}
	private class BeefEatWay implements EatWay<Beef>{

		@Override
		public Beef getFood() {
			return Beef.this;
		}

		@Override
		public void eat() {
			System.out.println("须要烹煮,可根据须要选择烹煮的方式!");
		}
		
	}
}

测试:this

public static void main(String[] args) {
	Beef beef = new Beef();
	EatWay<Beef> beefEatWay = beef.geEatWay();
	System.out.println(beefEatWay.getFood());
	beefEatWay.eat();
	Pear pear = new Pear();
	EatWay<Pear> pearEatWay = pear.geEatWay();
	System.out.println(pearEatWay.getFood());
	pearEatWay.eat();
}

结果: 牛肉 须要烹煮,可根据须要选择烹煮的方式! 梨 这是一种水果,可直接食用!设计

相关文章
相关标签/搜索