在初用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(); }
结果: 牛肉 须要烹煮,可根据须要选择烹煮的方式! 梨 这是一种水果,可直接食用!设计