Java内部类总结

来源:互联网 发布:巴宝莉女士香水知乎 编辑:程序博客网 时间:2024/04/28 13:28

内部类介绍

可将一个类定义在另一个类定义中。这就叫作“内部类”。–《Think In Java》

内部类是Java中非常有用的特性,也很容易理解,但是在实际项目中却很难灵活运用。就像《Think In Java》中说的那样: “通常,对内部类的需要并不是特别明显的,至少不会立即感觉到自己需要使用内部类”。

成员内部类

成员内部类是最普通的内部类,它作为外部类的一个成员存在,定义形式如下:

public class OutClass {   public String Name;   private int Age;   //成员内部类   public class InnerClass{       public void show(){           Name="Joy";//内部类可以访问外部类成员           Age=18;//内部类可以访问外部类私有成员          System.out.println("name="+Name+",Age="+Age);         }   }   /**    * 推荐使用这种方式,实例化内部类    * @return    */   public InnerClass getInnerClass(){       return new InnerClass();   }}
public static void main(String[] args) {        OutClass outClz=new OutClass();        InnerClass inner=outClz.getInnerClass();        //内部类方法         inner.show();    }

成员内部类总结:
1、成员内部类是依附于外围类的,所以只有先创建了外围类才能够创建内部类;
2、成员内部类中不能存在任何static的变量和方法;
3、内部类可以无限制的访问外部类的所有成员属性和方法;
4、外部类中如果要访问成员内部类的成员,必须先创建一个成员内部类的对象;
5、内部类可以拥有private访问权限、protected访问权限、public访问权限及包访问权限。

局部内部类

局部内部类是定义在一个方法或者一个作用域里面的类。局部内部类和成员内部类一样被编译,只是它的作用域发生了改变,它只能在该方法和属性中被使用,出了该方法和属性就会失效。
通过一个简单的例子来了解局部内部类的创建

public class Car {  private String carColor;  private String carName;  public Car(String carColor, String carName) {    super();    this.carColor = carColor;    this.carName = carName;}public void run(final boolean isGasoline){      //如果汽车有充足的汽油      if(isGasoline){          //局部内部类          class InnerClass{              public void carRun(){                  System.out.println("品牌为:"+carName+",颜色为:"+carColor+"汽车跑起来了");              }          }          new InnerClass().carRun();      }else{          System.out.println("没油了....");      }  }}public static void main(String[] args) {        Car car=new Car("BMW", "黑色");        car.run(true);    }

匿名内部类

做Android开发的(Swing编程中事件注册),应该经常接触到匿名内部类,在编写事件监听的代码时使用匿名内部类不但方便,而且使代码更加容易维护。举个Android事件监听的栗子:

 Button btn=(Button)findViewById(R.id.but);        btn.setOnClickListener(new OnClickListener() {            @Override            public void onClick(View v) {                // TODO Auto-generated method stub            }        });

总结
1、 匿名内部类是没有访问修饰符的;
2、 new 匿名内部类,这个类首先是要存在的;
4、 匿名内部类是没有构造方法的。因为它连名字都没有何来构造方法。

静态内部类

public class OutClass {   public String Name;   private int Age;   private static String Address;   /**    * 静态内部类    * @author yyq    *    */   public static class InnerClass1{       public void displayAddress(){           /**            * 静态内部类中只能访问外部类的静态成员或静态方法            */           System.out.println(Address);       }   }   public class InnerClass{       /**        * 非静态内部类中可以调用外部类的任何成员        */       public void Display(){           System.out.println(Name+Age+Address);       }   }   /**    * 外部类方法    */   public void show(){        //静态内部类 可以直接创建实例不需要依赖于外围类        new InnerClass1().displayAddress();       //非静态内部类需要创建实例       OutClass.InnerClass inner=new OutClass().new InnerClass();       inner.Display();   }}

总结
1、 静态内部类创建不需要依赖于外部类;
2、静态内部类不能使用任何外部类的非static成员变量和方法。

内部类实现多继承

Java不支持类之间的多继承,但是在一定场景下多重继承还是有一定用处的,比如每一个人都是同时继承父亲和母亲两个类,要不然你的身体里怎么能留着父母的血?接下来通过一个小栗子来演示通过内部类实现多继承:
定义一个Father类:

public class Father {   /**    * 父亲的强壮值为9      * @return    */   public int strong(){       return 9;   }}

定义一个Monther类:

public class Monther {    /**     * 母亲的智慧为9     * @return     */   public int kind(){       return 9;   }}

定义Son类:

public class Son {    /**     *  定义内部类继承Monther类     * @author yyq     *     */    public class Mother_1 extends Monther{        public int kind() {            return super.kind()+1;        }    }    /**     * 定义内部类继承Father类     * @author yyq     *     */    public class Father_1 extends Father{         public int strong(){             return super.strong()+1;         }    }    /**     * 儿子继承自父亲的强壮值+1     * @return     */    public int getStrong(){        return new Father_1().strong();    }    /**     * 儿子继承自母亲的智慧值+1     * @return     */    public int getKind(){        return new Mother_1().kind();    }}

最后

水平有限,有不正确的地方,希望大家多指正,谢谢!!!

0 0
原创粉丝点击