Java 嵌套类(Nested Class):静态嵌套类,内部类,局部类,匿名类



将一个人比作类,人由大脑、肢体、器官等组成,而嵌套类相当于其中的某个器官,例如心脏:它也有自己的属性和行为(血液、跳动)。

嵌套类(Nested Class)的结构:

//外部类

class Out {

    private int age = 12;

    //嵌套类

    class In {

        public void print() {

            System.out.println(age);

        }

    }

}

public class Demo {

    public static void main(String[] args) {

        Out.In in = new Out().new In();

        in.print();

        //或者采用下种方式访问

        /*

        Out out = new Out();

        Out.In in = out.new In();

        in.print();

        */

    }

}

运行结果:12

嵌套类的好处:

1 在逻辑上分组只在一个地方使用的类

2 增加了封装性(encapsulation)

3 使代码可读性更强、更易维持

嵌套类分为:静态嵌套类(static nested class)和非静态嵌套类(non-static nested class),后者也称内部类(inner class)。

例1. 静态嵌套类

<span style="font-size:14px;">class Out {

    private static int age = 12;

    static class In {

        public void print() {

            System.out.println(age);

        }

    }

}

public class Demo {

    public static void main(String[] args) {

        Out.In in = new Out.In();

        in.print();

    }

}</span>

运行结果: 12

说明:如果用static 将内部内静态化,那么内部类就只能访问外部类的静态成员变量,具有局限性。其次,因为内部类被静态化,因此Out.In可以当做一个整体看,可以直接new 出内部类的对象。

例2. 内部类

class Out {

    private int age = 12;

    class In {

        private int age = 13;

        public void print() {

            int age = 14;

            System.out.println("局部变量:" + age);

            System.out.println("内部类变量:" + this.age);

            System.out.println("外部类变量:" + Out.this.age);

        }

    }

}

public class Demo {

    public static void main(String[] args) {

        Out.In in = new Out().new In();

        in.print();

    }

}

运行结果:

局部变量:14

内部类变量:13

外部类变量:12

可以发现,内部类在没有同名成员变量和局部变量的情况下,内部类会直接访问外部类的成员变量,而无需指定Out.this.属性名

否则,内部类中的局部变量会覆盖外部类的成员变量。

而访问内部类本身的成员变量可用this.属性名,访问外部类的成员变量需要使用Out.this.属性名。

另外还有两种特殊的内部类:局部类(local class)和匿名类(anonymous class)

局部类是定义在代码块中的类,通常是在一个方法内,称作方法内部类。

匿名类的申明与实例化是同时完成的,它与局部类很相似,除了没有名字之外。

例3. 局部类

class Out {

    private int age = 12;

    public void Print(final int x) {

        class In {

            public void inPrint() {

                System.out.println(x);

                System.out.println(age);

            }

        }

        new In().inPrint();

    }

}

public class Demo {

    public static void main(String[] args) {

        Out out = new Out();

        out.Print(3);

    }

}

运行结果:

3

12

在上面的代码中,将内部类移到了外部类的方法中,然后在外部类的方法中再生成一个内部类对象去调用内部类方法。

例4. 匿名类

public class OutClasses {

    interface HelloWorld {
        public void greetSomeone(String someone);
    }

    public void sayHello() {

        HelloWorld germanGreeting = new HelloWorld() {//这里申明了一个匿名类,它的实例是germanGreeting
            String name = "mundo";
            public void greetSomeone(String someone) {
                name = someone;
                System.out.println("Hallo, " + name);
            }
        };
        germanGreeting.greetSomeone("Sommer");
    }

    public static void main(String... args) {
        OutClasses myApp = new OutClasses();
        myApp.sayHello();
    }
}

运行结果:Hallo,Sommer

匿名类是一个表达式(分号结尾),常见于GUI应用程序中。它的语法类似于调用构造器,区别在于该类的定义紧跟其后。没有class关键字,如何判断匿名类呢?

1)要有new 这个操作符,类似正常类实例化的表达式。

2)要实现一个接口或继承一个类,上面的例子是实现HelloWorld这个接口。

3)类体(body),可以在其中定义域、方法,甚至局部类,但是不能定义构造器,也不能有语句(statement)。

本文部分参考Nerxious的博客 http://www.cnblogs.com/nerxious/archive/2013/01/24/2875649.html

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-08 11:15:35

Java 嵌套类(Nested Class):静态嵌套类,内部类,局部类,匿名类的相关文章

抽象类 抽象方法 接口 类部类 匿名类部类 设计模式之单例模式(懒汉模式及饿汉模式)

---恢复内容开始--- 抽象类  关键字  abstract 不能被实例化(创建对象),可通过类名调用静态方法 子类继承抽象类必须重写父类的所有抽象方法,然后用多态调用 接口:关键字 interface   类名 implements 接口名 1.接口中只能有抽象方法,并且不能被实例化,通过多态调用 2.接口与接口之间的关系: 继承关系(可以多继承); 类部类: 在类中定义的类 创建类部类对象    外部类名.内部类名  对象名 = new 外部类名().new内部类名() 匿名类部类: 在写

mybatis的嵌套查询(嵌套查询nested select和嵌套结果nested results查询)区别

(转自:http://blog.csdn.net/canot/article/details/51485955) Mybatis表现关联关系比hibernate简单,没有分那么细致one-to-many.many-to-one.one-to-one.而是只有两种association(一).collection(多),表现很简洁.下面通过一个实例,来展示一下Mybatis对于常见的一对多和多对一关系复杂映射是怎样处理的. 以最简单的用户表订单表这个最简单的一对多做示例: 对应的JavaBean:

java嵌套类(Nested&amp;nbsp;Classes)总结

转自:http://www.cnblogs.com/aigongsi/archive/2012/04/24/2467183.html Nested Classes定义 在java语言规范里面,嵌套类(Nested Classes)定义是: A nested class is any class whose declaration occurs within the body of another class or interface. A top level class is a class t

嵌套类 局部类

嵌套类 局部类 <c++ primer 3th> C++嵌套类 1.   嵌套类的名字只在外围类可见. 2.   类的私有成员只有类的成员和友元可以访问,因此外围类不可以访问嵌套类的私有成员.嵌套类可以访问外围类的成员(通过对象.指针或者引用). 3.   一个好的嵌套类设计:嵌套类应该设成私有.嵌套类的成员和方法可以设为 public . 4.   嵌套类可以直接访问外围类的静态成员.类型名( typedef ).枚举值. 嵌套类 一个类可以在另一个类中定义,这样的类被称为嵌套类.嵌套类是其

【转 Java 中的内部类和匿名类

 Java 中的内部类和匿名类 2008-10-16 13:47:41 标签:Java 内部类 匿名类 休闲 职场 Java 中的内部类和匿名类* 为什么需要内部类? Java 内部类有什么好处?为什么需要内部类? 首先举一个简单的例子,如果你想实现一个接口,但是这个接口中的一个方法和你构想的这个类中的一个方法的名称,参数相同,你应该怎么办?这时候,你可以建一个内部类实现这个接口.由于内部类对外部类的所有内容都是可访问的,所以这样做可以完成所有你直接实现这个接口的功能. 不过你可能要质疑,更改一

浅谈Java的匿名类

在实际的项目中看到一个很奇怪的现象,Java可以直接new一个接口,然后在new里面粗暴的加入实现代码.就像下面这样.那么问题来了,new出来的对象没有实际的类作为载体,这不是很奇怪吗? 思考以下代码的输出是什么? Runnable x = new Runnable() { @Override public void run() { System.out.println(this.getClass()); } }; x.run(); 实际答案是出现xxxx$1这样一个类名,它是编译器给定的名称.

Java之匿名类讲解

参考https://blog.csdn.net/jiaotuwoaini/article/details/51542059 匿名类,正如名字一样在java中没有名字标识的类,当然了编译后还是会安排一个名字的. 下面是一个关于匿名类的简单例子: public class Client { public static void main(String[] args) throws InterruptedException { Thread t=new Thread(new Runnable() {

内部类与匿名类(转)

Java 中的内部类和匿名类* 为什么需要内部类? Java 内部类有什么好处?为什么需要内部类? 首先举一个简单的例子,如果你想实现一个接口,但是这个接口中的一个方法和你构想的这个类中的一个方法的名称,参数相同,你应该怎么办?这时候,你可以建一个内部类实现这个接口.由于内部类对外部类的所有内容都是可访问的,所以这样做可以完成所有你直接实现这个接口的功能. 不过你可能要质疑,更改一下方法的不就行了吗? 的确,以此作为设计内部类的理由,实在没有说服力.真正的原因是这样的,java 中的内部类和接口

匿名类、内部类、匿名内部类-转

http://xdwangiflytek.iteye.com/blog/1340872   原文地址 前端时间在写.net项目中,一直错将.cs里的两个class当作内部类,原来是一个文件里的两个类而已,这让我想起了Java中的内部类,比较内部类,那么还有两个类,那就是匿名类和匿名内部类.今天我想就Java中的这三种类进行个比较. 我们知道在Java语言规范中可以做很多事,例如一个类或一个接口中可以声明一个类或接口,在一个方法中可以声明一个类,类与接口声明可以嵌套任意深度等. 匿名类: 1.ne