一、嵌套类(Nested Classes)

使用嵌套类减少了命名冲突,一个内部类可以定义在一个类中,一个方法中甚至一个表达式中。

(1)定义

A nested(嵌套) class is any class whose declaration occurs within the body of another class or interface.  A top level class is a class that is not a nested class.

一般把定义内部类的外围类成为包装类(enclosing class)或者外部类.

(2)嵌套类分类

1、静态嵌套类 (static nested classes)

2、非静态嵌套类

非静态嵌套类就是内部类(Inner classes)。Inner Classes 不能定义为static,不能有static方法和static初始化语句块。

在JLS(java语言规范)里面是这么定义的:

An inner class is a nested class that is not explicitly or implicitly declared static. Inner classes may not declare static initializers (§8.7) or member inter- faces

非静态嵌套类分为三种:

1)成员嵌套类(member nested class)

成员嵌套类 作为 enclosing class 的成员定义的,成员嵌套类有enclosing class属性

2)局部嵌套类(local nested class)

局部嵌套类定义在 enclosing class 的方法里面,局部嵌套类有enclosing class 属性和enclosing method属性

3)匿名嵌套类(anonymous nested class)

匿名嵌套类没有显示的定义一个类,直接通过new 的方法创建类的实例。一般回调模式情况下使用的比较多

也可以称为成员内部类(member inner classes)、局部内部类(local inner classes)、匿名内部类(anonymous inner classes)

二、静态嵌套类

简称静态类,最简单的嵌套类,只能访问外部类的静态成员变量与静态方法。

1、静态类不能访问外部类的非静态成员和非静态方法(不管是public还是private的);
2、静态类的实例不需要先实例化外部类成员,可直接实例化。

3、静态类的修饰符与普通类的属性的修饰符一样,也可以使用访问控制符,可以使用final修饰,可以是abstract抽象类

代码实例

public class Outer{public static class StaticNested{//其他代码
   }
}

实例方式

Outer.StaticNested staticNested=new Outer.StaticNested();

三、成员内部类

成员内部类可以访问外部类的所有实例属性,静态属性。因为内部成员类持有一个外部对象的引用,内部类的实例可以对外部类的实例属性进行修改。

如果是public的 inner  member classes,可以通过 外部类实例.new 内部类()的方式进行创建,当调用内部类的构造器的时候,会把当前创建的内部类对象实例中持有的外部对象引用赋值为当前创建内部类的外部类实例。

内部成员类可以是使用访问控制符,可以定义为final,也可以是abstract抽象类。

代码实例

class Outer{public  class MemberNested{//其他代码
   }
}

实例方式

Outer.MemberNested staticNested=new Outer().new MemberNested();

或者

Outer outer=new  Outer();
Outer.MemberNested staticNested=outer.new MemberNested();

四、局部内部类

(1)定义位置

定义位置既可以是静态方法,也可以是实例方法,也可以是构造器方法,还可以是动态初始化语句块或者静态初始化语句块。

(2)修饰符限制

局部类不能有访问控制符(private,public,protected修饰),可以是abstract的,也可以定义为final。

(3)局部类可以定义在一个static上下文里面 和 非static上下文里面。

定义在static上下文(static初始化块,static方法)里面的local inner classes 可以访问类的静态属性。

在static上下文定义的局部类,没有指向父类实例变量的引用,因为static方法不属于类的实例,属于类本身。而且局部类不能在外部进行创建,只能在定义位置调用的时候进行创建。

代码实例

class Outer {//定义在构造方法public Outer() {final class LocalNested {//其他代码
        }LocalNested localNested=new LocalNested();}//定义在成员方法public void methodA() {abstract class LocalNested {//其他代码
        }LocalNested localNested=new LocalNested(){ };//匿名实现抽象类
    }//定义在静态方法public static void methodB() {abstract class LocalNested {//其他代码
        }LocalNested localNested=new LocalNested(){ };//匿名实现抽象类
    }//定义在动态初始化块
    {class LocalNested {//其他代码
        }LocalNested localNested=new LocalNested();}//定义在静态初始化块static {final class LocalNested {//其他代码
        }LocalNested localNested=new LocalNested();}
}

View Code

五、匿名内部类

(1)定义位置

定义位置既可以是静态方法,也可以是实例方法,也可以是构造器方法,还可以是动态初始化语句块或者静态初始化语句块。

(2)实现方式

匿名类和局部类访问规则一样,只不过内部类显式的定义了一个类,然后通过new的方式创建这个局部类实例,而匿名类直接new一个类实例,没有定义这个类。匿名类最常见的方式就是回调模式的使用,通过默认实现一个接口创建一个匿名类然后,然后new这个匿名类的实例。

代码实现

class Outer {//定义在构造方法public Outer() {AnonymousNested anonymousNested=new AnonymousNested(){ };//匿名实现抽象类
    }//定义在成员方法public void methodA() {AnonymousNested anonymousNested=new AnonymousNested(){ };//匿名实现抽象类
    }//定义在静态方法public static void methodB() {AnonymousNested anonymousNested=new AnonymousNested(){ };//匿名实现抽象类
    }//定义在动态初始化块
    {AnonymousNested anonymousNested=new AnonymousNested(){ };//匿名实现抽象类
    }//定义在静态初始化块static {AnonymousNested anonymousNested=new AnonymousNested(){ };//匿名实现抽象类
    }
}abstract class AnonymousNested {//其他代码
}

View Code

java嵌套类与内部类相关推荐

  1. Java 嵌套类和内部类演示样例lt;二gt;

    嵌套类(nested class)是一个在还有一个类或接口内部声明的类. 嵌套类分为两种:静态内部类(static inner class)和非静态嵌套类(non-static nested clas ...

  2. 【java开发系列】—— 嵌套类与内部类

    嵌套类与内部类在java中使用的很广泛,为了避免难以理解,这里用了几个小例子,说明它的用法. 嵌套类与内部类的结构如下图 静态嵌套类 静态嵌套类,是一种在类之外声明的嵌套类,由于是静态的,所以不经过初 ...

  3. kotlin学习之嵌套类和内部类(六)

    目录 1. Java中的内部类和嵌套类 2. kotlin中的嵌套类和内部类 1. Java中的内部类和嵌套类 //内部类,内部类持有了外部类的引用,所以在内部类中可以调用外部类的方法 public ...

  4. java 嵌套类: Nested classes

    java 嵌套类: Nested classes 嵌套类分类 静态嵌套类 非静态嵌套类 普通内部类: Common classes 局部内部类: Local classes 匿名内部类: Anonym ...

  5. 【Java 面向对象】基础、Java程序的内存划分、嵌套类(内部类、静态嵌套类)、局部类、接口的升级问题(默认方法、静态方法)、instanceof

    面向对象 对象的内存 复杂对象的内存 对象数组的内存 思考:方法存储在哪里? Java程序的内存划分 this.super 注解(Annotation) 访问控制(Access Control) to ...

  6. Java基础篇:介绍嵌套类和内部类

    在另一个类中定义的类就是嵌套类(nested classes).嵌套类的范围由装入它的类的范围限制.这样,如果类B被定义在类A之内,那么B为A所知,然而不被A的外面所知. 嵌套类可以访问嵌套它的类的成 ...

  7. java 嵌套类 继承_Java嵌套类 - 爱吃苹果的搬运工的个人空间 - OSCHINA - 中文开源技术交流社区...

    在Java中可以创建几种不同类型的嵌套类: 静态嵌套类: 静态内部类可以独立于外部类被实例化,无法访问外部类中的非静态属性和方法,只能外部类的实例来访问外部类的非静态变量 public class O ...

  8. Java嵌套类(Nested Classes)总结

    Nested Classes定义 在java语言规范里面,嵌套类(Nested Classes)定义是: A nested class is any class whose declaration o ...

  9. java 嵌套类 作用_java 嵌套类的分类、为什么使用嵌套类?

    java程序语言允许你在一个类里面再声明另一个类,这样的类成为嵌套类,说明如下:class OuterClass { ... class NestedClass { ... } } 术语:嵌套类分为两 ...

最新文章

  1. 探测参考信号(Sounding Reference Signal)
  2. SWideRNet:全景分割新标杆!
  3. 开源吞噬世界,得开发者得天下
  4. 深入浅出:对MySQL主从配置的一些总结
  5. 部署harbor1.2.0开启ldap验证
  6. python鼠标碰撞_获取鼠标指针测试item之间的碰撞
  7. Ajax — cropper (图片剪裁)基本用法
  8. yii 前后台分离及登陆验证
  9. P4774-[NOI2018]屠龙勇士【EXCRT】
  10. 解决:XXX类存在 却报错 Unkonwn class:‘XXX‘ 、@Autoeired 注入失败
  11. 关于AOP /IOC / DI
  12. sql domain credentail
  13. centos配置网络
  14. 一个关于传奇3G游戏的感言
  15. python numpy 矩阵运算_NumPy向量和矩阵的运算
  16. 云更新服务器更新不了最新游戏,云更新服务器环境要求 | 专业网吧维护
  17. axios请求跨域前端解决_10、axios请求以及跨域问题,前端解决方法。11、后端-nginx解决方法...
  18. vue-cli 项目启动输出 INFO Starting development server... 69o/o after emitting CopyPlugin
  19. Eclipes和Myeclipse插件安装方法
  20. 谈谈数据库里的时间戳

热门文章

  1. [C++STL]string容器用法介绍
  2. 假设一动态集合S用一个长度为m的直接寻址表T来表示。请给出一个查找S中最大元素的过程。(算法导论第十一章11.1-1)
  3. 帕斯卡三角形杨辉三角
  4. Spring Boot 学习之旅
  5. P3250 [HNOI2016]网络(利用堆建线段树 + 树剖)
  6. Codeforces Round #592 (Div. 2) F. Chips 构造 + 细节
  7. Codeforces Round #725 (Div. 3) G. Gift Set 二分
  8. bzoj#3456. 城市规划
  9. Deltix Round, Summer 2021 (open for everyone, rated, Div. 1 + Div. 2)
  10. Strange Memory Gym - 102832F