深入理解java嵌套类和内部类
一、什么是嵌套类及内部类
能够在一个类的内部定义还有一个类。这样的类称为嵌套类(nested classes),它有两种类型:静态嵌套类和非静态嵌套类。静态嵌套类使用非常少,最重要的是非静态嵌套类,也即是被称作为内部类(inner)。嵌套类从JDK1.1開始引入。当中inner类又可分为三种:
其一、在一个类(外部类)中直接定义的内部类。
其二、在一个方法(外部类的方法)中定义的内部类;
其三、匿名内部类。
以下,我将说明这几种嵌套类的使用及注意事项。
二、静态嵌套类
例如以下所看到的代码为定义一个静态嵌套类,
- public class StaticTest {
- private static String name = "javaJohn";
- private String id = "X001";
- static class Person{
- private String address = "swjtu,chenDu,China";
- public String mail = "josserchai@yahoo.com";//内部类公有成员
- public void display(){
- //System.out.println(id);//不能直接訪问外部类的非静态成员
- System.out.println(name);//仅仅能直接訪问外部类的静态成员
- System.out.println("Inner "+address);//訪问本内部类成员。
- }
- }
- public void printInfo(){
- Person person = new Person();
- person.display();
- //System.out.println(mail);//不可訪问
- //System.out.println(address);//不可訪问
- System.out.println(person.address);//能够訪问内部类的私有成员
- System.out.println(person.mail);//能够訪问内部类的公有成员
- }
- public static void main(String[] args) {
- StaticTest staticTest = new StaticTest();
- staticTest.printInfo();
- }
- }
在静态嵌套类内部,不能訪问外部类的非静态成员。这是由Java语法中"静态方法不能直接訪问非静态成员"所限定。
若想訪问外部类的变量,必须通过其他方法解决,由于这个原因,静态嵌套类使用非常少。注意,外部类訪问内部类的的成员有些特别,不能直接訪问。但能够通过内部类来訪问。这是由于静态嵌套内的全部成员和方法默觉得静态的了。
同一时候注意。内部静态类Person仅仅在类StaticTest 范围内可见,若在其他类中引用或初始化,均是错误的。
三、在外部类中定义内部类
例如以下所看到的代码为在外部类中定义两个内部类及它们的调用关系:
- public class Outer {
- int outer_x = 100;
- class Inner{
- public int y = 10;
- private int z = 9;
- int m = 5;
- public void display(){
- System.out.println("display outer_x:"+ outer_x);
- }
- private void display2(){
- System.out.println("display outer_x:"+ outer_x);
- }
- }
- void test(){
- Inner inner = new Inner();
- inner.display();
- inner.display2();
- //System.out.println("Inner y:" + y);//不能訪问内部内变量
- System.out.println("Inner y:" + inner.y);//能够訪问
- System.out.println("Inner z:" + inner.z);//能够訪问
- System.out.println("Inner m:" + inner.m);//能够訪问
- InnerTwo innerTwo = new InnerTwo();
- innerTwo.show();
- }
- class InnerTwo{
- Inner innerx = new Inner();
- public void show(){
- //System.out.println(y);//不可訪问Innter的y成员
- //System.out.println(Inner.y);//不可直接訪问Inner的不论什么成员和方法
- innerx.display();//能够訪问
- innerx.display2();//能够訪问
- System.out.println(innerx.y);//能够訪问
- System.out.println(innerx.z);//能够訪问
- System.out.println(innerx.m);//能够訪问
- }
- }
- public static void main(String args[]){
- Outer outer = new Outer();
- outer.test();
- }
- }
以上代码须要说明有,对于内部类。通常在定义类的classkeyword前不加public 或 private等限制符,若加了没有不论什么影响,同一时候好像这些限定符对内部类的变量和方法也没有影响(?)。另外,就是要注意,内部类Inner及InnterTwo仅仅在类Outer的作用域内是可知的,假设类Outer外的不论什么代码尝试初始化类Inner或使用它,编译就不会通过。同一时候,内部类的变量成员仅仅在内部内内部可见,若外部类或同层次的内部类须要訪问。需採用演示样例程序中的方法,不可直接訪问内部类的变量。
深入理解java嵌套类和内部类的更多相关文章
- JAVA 嵌套类和内部类
一.什么是嵌套类及内部类? 可以在一个类的内部定义另一个类,这种类称为嵌套类(nested classes),它有两种类型: 静态嵌套类和非静态嵌套类.静态嵌套类使用很少,最重要的是非静态嵌套类, ...
- 分析java 嵌套类与内部类
一.什么是嵌套类及内部类? 可以在一个类的内部定义另一个类,这种类称为嵌套类(nested classes),它有两种类型:静态嵌套类和非静态嵌套类.静态嵌套类使用很少,最重要的是非静态嵌套类 ...
- (十二)java嵌套类和内部类
嵌套类和内部类:在一个类里边定义的类叫做嵌套类,其中没有static修饰的嵌套类是我们通常说的内部类,而被static修饰的嵌套类不常用.有的地方没有嵌套类和内部类的区分,直接是嵌套类就称作内部类,没 ...
- Java 嵌套类和内部类演示样例<二>
嵌套类(nested class)是一个在还有一个类或接口内部声明的类. 嵌套类分为两种:静态内部类(static inner class)和非静态嵌套类(non-static nested clas ...
- Java 嵌套类和内部类演示样例<三>
<span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-s ...
- Java中的嵌套类和内部类
以前看<Java编程思想>的时候,看到过嵌套类跟内部类的区别,不过后来就把它们的概念给忘了吧.昨天在看<数据结构与算法分析(Java语言版)>的时候,又遇到了这个概念,当时就很 ...
- 【java开发系列】—— 嵌套类与内部类
嵌套类与内部类在java中使用的很广泛,为了避免难以理解,这里用了几个小例子,说明它的用法. 嵌套类与内部类的结构如下图 静态嵌套类 静态嵌套类,是一种在类之外声明的嵌套类,由于是静态的,所以不经过初 ...
- Java嵌套类,内部类和外部类
1.嵌套类,内部类 嵌套类是指被定义在一个类内部的类: JAVA的嵌套类有很多种类:1.静态成员类:2.非静态成员类:3.匿名类:4.局部类:其中,除了静态成员类之外,其他的都是内部类,因为静态成员类 ...
- Java 嵌套类基础详解
目录 1. 什么是嵌套类? 2. 为什么要使用嵌套类? 3. 嵌套类的类型 4. 静态嵌套类 5. 非静态嵌套类 5.1 成员内部类 5.2 局部内部类 5.3 匿名内部类 6. 嵌套接口 1. 什么 ...
随机推荐
- C++中的unordered_map
1.简介 随着C++0x标准的确立,C++的标准库中也终于有了hash table这个东西.很久以来,STL中都只提供<map>作为存放对应关系的容器,内部通常用红黑树实现,据说原因是二叉 ...
- 【转】Virtualbox虚拟机配置安装CentOS 6.5图文教程
http://www.111cn.net/sys/CentOS/61709.htm 什么是Virtualbox? VirtualBox 是一款开源虚拟机软件(注:跟vmware差不多).Virtual ...
- CSS 基础总结
CSS基础 Doctype 声明位于文档中的最前面,处于 标签之前.告知浏览器的解析器,用什么文档类型 规范来解析这个文档. 在标准模式中,浏览器根据规范呈现页面: 在混杂模式中,页面以一种比较宽松的 ...
- 10_Segue Example
10 // // ViewController.swift // Segues Example // // Created by ZC on 16/1/10. // Copyright © 2016年 ...
- swig include使用方法
{% block content2 %} {% include "footer.html" %} {% endblock %} include语句必须放到 block模块中,不然不 ...
- Android开发(26)--补间动画(Tween)的实现
补间动画(Tween Animation) 补间动画与逐帧动画在本质上是不同的,逐帧动画通过连续播放图片来模拟动画的效果,而补间动画则是通过在两个关键帧之间补充渐变的动画效果来实现的.补间动画的优点是 ...
- JavaScript中你可能不知道的九件事
今天凑巧去W3School扫了一遍JavaScript教程,发现从中看到了不少自己曾经没有注意过的细节. 我这些细节列在这里.分享给可能相同不知道的朋友: 1.使用 document.write() ...
- tar.xz文件怎样解压
XZ压缩最新压缩率之王 xz这个压缩可能非常多都非常陌生,只是您可知道xz是绝大数linux默认就带的一个压缩工具. 之前xz使用一直非常少,所以差点儿没有什么提起. 我是在下载phpmyadmin的 ...
- 使用命令行将Excel数据表导入Mysql中的方法小结
从Excel数据表导入MySQL,已经做过好几次了,但每次都会碰到各种问题:invalid utf8 character string, data too long, ...,浪费了不少时间 为了提高 ...
- objective-C学习笔记(八) 集合类型 Collection Types
OBJC的集合类型: 1.数组 Array 2.Set 3.键值对 Dictionary 数组:OC中的数组被定义为class,引用类型.索引从0开始,访问越界会抛出运行时异常. NSArray的元素 ...