Java中的内部类(成员内部类、静态内部类、局部内部类、匿名内部类)

内部类 就是定义在外部类内部的类。

内部类可以定义在外部类方法内和外部类方法外,内部类分为静态内部类,成员内部类,局部内部类,匿名内部类。

public class Outer{

    int out_x  = 0;
    public void method(){
        Inner1 inner1 = new Inner1();
        public class Inner2   //在方法体内部定义的内部类
        {
            public method(){
                out_x = 3;<br>
            }
        }
        Inner2 inner2 = new Inner2();
    }
    public class Inner1   /<br>/在方法体外面定义的内部类
    {
    }
}

内部类的作用

  1. 内部类可以很好的实现隐藏。一般的非内部类,不允许使用private和protected

  2. 内部类拥有外部类的所有元素的访问权限

  3. 可以实现多重继承

  4. 可以避免修改接口而实现同一类中两种同名方法的调用。

一、成员内部类

成员内部类也叫实例内部类。

应用场合:每一个外部类对象都需要一个内部类的实例,内部类离不开外部类存在(相当于心脏对人体)

1、成员内部类的特征:

作为外部类的一个成员存在,与外部类的属性、方法并列

成员内部类持有外部类的引用

成员内部类中不能定义static变量和方法

2、使用格式:

Outer outer = new Outer();

Outer.Inner inner = outer.new Inner();

代码演示一:

public class Body {

String arm;
String leg;
String blood;
public Body(String arm, String leg, String blood) {
    super();
    this.arm = arm;
   this.leg = leg;
    this.blood = blood;
}
//内部类Heart
class Heart{
    String name;
     void work() {
        System.out.println("心脏正在给"+arm+leg+"输"+blood);
    }
 };
}  
public class Test {
    public static void main(String[] args) {       
        Body body=new Body("两个胳膊","两条腿","血");
        Body.Heart  heart=body.new Heart();
        heart.work();
    }
}

代码演示二:

public class Outer {

    private String name="Hello World";

    public class Inner{
        public void print(){
            System.out.println(name);
        }
    };
    public void print(){//定义外部类方法
        new Inner().print();//通过内部类的实例化对象调用方法
    }
    public static void main(String[] args) {
        Outer outer=new Outer();
        outer.print();//调用外部类的方法
    }
}

解释一下,上述代码中,new Inner().print();代码相当于 Inner inner=new Inner(); Inner.print();

二、静态内部类

1、内部类如果使用static声明,则此内部类就称为静态内部类。(其实也相当于外部类)可以通过外部类 . 内部类来访问。

2、静态内部类使用场合:内部类不需要外部类的实例(注意区分成员内部类),静态内部类存在仅仅为外部类提供服务或者逻辑上属于外部类,且逻辑上可以单独存在。

3、静态内部类的特征:

静态内部类不会持有外部类的引用

静态内部类可以访问外部的静态变量,如果访问外部类的成员变量必须通过外部类的实例访问

4、Java中只有内部类才可以是静态的

使用格式:Outer.Inner inner = new Outer.Inner();

代码演示一:

public class Company {
    String companyNam;
    static String country;
    static class Clear{
        String name;
        public Clear() {
            // TODO Auto-generated constructor stub
        }

        public Clear(String name) {
            super();
            this.name = name;
        }

        public void work(String name){
            String na=new Company().companyNam="联想";
            country="中国";
            System.out.println(name+"为"+na+"打扫卫生,该公司属于"+country);
        }
    }
}
public class Test {
    public static void main(String[] args) {
        Company.Clear zcl=new Company.Clear();
        zcl.work("shen_hua");
    }

}

三、局部内部类:

1、局部内部类也叫区域内嵌类,局部内部类与成员内部类类似,不过,区域内嵌类是定义在一个方法中的内嵌类。

2、使用场合:如果内部类对象仅仅为外部类的某个方法使用,使用局部内部类

3、特征:

用在方法内部,作用范围仅限于该方法中

根据情况决定持有外部类对象引用

不能使用private,protected,public修饰符

不能包含静态成员

代码演示一:

public class School {

    String schoolName;
    String buss="培养人才";
    int studentNum;
    public School() {
        // TODO Auto-generated constructor stub
    }

    public School(String schoolName, String buss, int studentNum) {
        super();
        this.schoolName = schoolName;
        this.buss = buss;
        this.studentNum = studentNum;
    }

    //宣传
    public void show(){
        final double tvMoney=10000;
        final double netMoney=20000;
        class AdverTeam{
            String teamName="shen_hua";
            //电视宣传
            public void tvShow(){
                System.out.println("宣传队是:"+teamName);
                System.out.println("这是电视宣传,学校名称"+schoolName+",业务内容:"+buss+",学校人数:"+studentNum+",宣传所需费用"+tvMoney);
            }
            //网络宣传
            public void netShow(){
                System.out.println("宣传队是:"+teamName);
                System.out.println("这是网络宣传,学校名称"+schoolName+",业务内容:"+buss+",学校人数:"+studentNum+",宣传所需费用"+netMoney);
            }
        }
        new AdverTeam().tvShow();
        new AdverTeam().netShow();
    }
}
public class Test {
    public static void main(String[] args) {
        School qinghua=new School("清华","互联网培训",1000);

        qinghua.show();
    }
}

四、匿名内部类

1、如果一个内部类在整个操作中只使用一次的话,就可以定义为匿名内部类。匿名内部类也就是没有名字的内部类,这是java为了方便我们编写程序而设计的一个机制,因为有时候有的内部类只需要创建一个它的对象就可以了,以后再不会用到这个类,这时候使用匿名内部类就比较合适。

2、使用场合:简化内部类的使用

3、特征:

使用new创建 ,没有具体位置

创建的匿名类,默认继承或实现new后面的类型

根据使用情况决定是否持有外部类对象引用

内嵌匿名类编译后生成的.class文件的命名方式是”外部类名称$编号.class”,编号为1,2,3…n,编号为x的文件对应的就是第x个匿名类

代码演示:

public interface Person {
    public void run();
}

public class Test {
    public static void main(String[] args) {
        Person p=new Person() {        
            public void run() {
                System.out.println("匿名内部类实现的");
            }
        };
        p.run();
    }

}