内部类inner class

基本上已经把thinking in java内部类部分学完了
内容比较多 整理下思路

 

简单的分类

内部类(inner class)
-> 匿名内部类
-> 域内部类(local class)
-> 嵌套内部类(nesting class)

 

1. 一般的内部类

 

class A
{
    private class B{}
}

 

特点:
> 可以使用外围内的方法和属性
> 无法定义static变量和方法
> 可以有private和protected访问修饰符(非inner class的类只有public和default2种访问修饰符)

> 在内部类中使用[外部类].this 语法可以获得该内部类的外部类引用

 

2. 域内部类

 

class A
{
    {
        class B{}
    }
}

 

class A
{
    void f()
    {
        int i=0;
        class B{}
    }
}

 

特点:
> 出了域的范围就无法访问, 比如在方法f()中的内部类, 在方法f()外的地方无法被访问
> 如果使用了局部变量(非外围内成员变量) 则该局部变量必需为final, 如class B想使用f()方法中的变量i
则i必需为final

 

3. 匿名内部类

class A{}
class B
{	
    public getA()
   {
        return new A(){};
   }
}

 

4. 嵌套内部类: 就是嵌套的内部类为static class

 

class A
{
    public static class B{}
}

 

特点: 可以在内部类中定义static方法和变量

 

继承一个内部类

 

继承一个内部类时 需要使用到特殊语法来获得其外围类对象

class A
{
    class InnerA{}
}
class B extends InnerA
{
    public B(A a)//class B constructor
    {
        a.super();//使用这个语法编译时才不会报错
    }
}

 

也有种不需要这种语法的情况, 如下

class A{}
class B
{	
	public getA()
	{
		return new A(){};
	}
}

 

class A
{
    class InnerA{}
}
class B extends A
{
    class InnerB extends InnerA{}   
}

 
此时InnerB虽然继承了InnerA, 但是由于其外围类B亦继承了A,
所以就不需要在InnerB的构造器中使用<外围类>.super()的语法了

 

心得体会:

1. 内部类实现了真正的多继承

//内部类实现多继承的示例
class Shape
{
    void drow(){}
}

class Ashape
{
     public class Rectangle extends Shape//长方形继承Shape
     {
          void drow()
         {
               System.out.println("a rectangle");
          }
     }

     public Shape getTriangle()//方法getTriangle返回一个Shape
     {
          class Triangle extends Shape//三角形继承Shape
          {
               void drow()
              {
                    System.out.println("a triangle");
             }
           }
           return new Triangle();
    }

     public Shape getCircle()//匿名内部类 实际是构造了一个circle继承Shape
    { 
          return new Shape()
          {
               void drow()
               {
                    System.out.println("a circle");
                }
          }; 
     }
}//class Ashape end~

public class TestInnerclassExtends//该类用于测试Ashape
{
    public static void main(String args[])
    {
        Ashape a=new Ashape();
  
       Ashape.Rectangle rec=a.new Rectangle();//构建一个内部类实例的语法
        rec.drow();
  
        a.getTriangle().drow();
  
         a.getCircle().drow();
     }
}

 

输出结果:
a rectangle
a triangle
a circle

你可能感兴趣的:(F#)