组合
组合是一种代码复用机制,组合的是对象,通俗的理解是在一个类中创建或引用另一个类的对象。
使用多个已有的对象组合为一个功能更加复杂强大的新对象,因为在对象之间,各自的内部细节是不可见的,所以也说这种方式的代码复用是黑盒式代码复用。
组合模式:组合多个对象形成树形结构以表示有整体-部分关系层次结构,组合模式可以让客户端统一对待单个对象和组合对象。
内部类
内部类是一种代码隐藏机制,通俗的理解是在一个类的内部定义另一个类。根据定义位置的不同,可以分为:成员内部类、局部内部类、匿名内部类和静态内部类。
内部类可以无条件访问外部类的所有成员属性和成员方法(包括private成员和静态成员);外部类需要创建内部类的对象,才能访问内部类的成员和方法。
class Circle { //1、成员位置 double radius = 0; //成员变量
public Circle(double radius) { //构造方法 this.radius = radius; }
class Draw { //成员内部类,可以有修饰符 double radius = 1; public void drawSahpe() { System.out.println("drawshape"); } }
Static class Draw2 { //静态内部类,一种特殊的成员内部类 public void draw2 () { System.out.println("draw2"); } }
public double getArea(){ //方法 //2、局部位置 double pai=3.14; //局部变量
class A{ //局部内部类:不能有修饰符 …… } return pai*radius*radius; } } |
成员内部类
①修饰符public、protected、private以及static(静态内部类)
②当成员内部类拥有和外部类同名的成员变量或者方法时,会发生隐藏现象,即默认情况下访问的是成员内部类的成员。如果要访问外部类的同名成员,需要以下面的形式进行访问:
外部类.this.成员变量
外部类.this.成员方法
③成员内部类是依附外部类而存在,如果要创建成员内部类的对象,前提是必须存在一个外部类的对象
Circle c = new Circle();
Circle.Draw d = c.new Draw();
或者可以写成:
Circle.Draw d = new Circle().new Draw();
静态内部类
静态内部类是一个static修饰的成员内部类。
①静态内部类和静态成员变量类似,不需要依赖于外部类,即不用创建外部类对象就能访问。
Circle.Draw2 d2 = new Circle.Draw2();
②静态内部类不能访问外部类的非static成员变量或者方法。因为非静态的成员变量和方法,必须用类对象访问。
局部(方法)内部类
①访问仅限于方法内或者该作用域内,所以在方法内部创建对象
②不能有修饰符
匿名内部类
匿名内部类就是一个没有名字的局部(方法)内部类。
①匿名内部类必须继承一个抽象类或者实现一个接口。
②匿名内部类没有类名,因此没有构造方法。
//接口 interface myItface{ void test(); } class Outer{ private int n = 5; public void dispaly(int temp) { new myItface()//实现并调用了test()方法 { public void test() { System.out.println(temp); } }.test(); } } |