深入理解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. 什么 ...
随机推荐
- html5 canvas 运行起来绝对让你震撼!
从一个大神那看到的,拷贝过来跟大家分享下! html <canvas></canvas> *{margin:0;padding:0;}body{background:#222; ...
- POJ 1823 Hotel 线段树
题目链接 线段树的区间合并. 和上一题差不多....第三种操作只需要输出maxx[1]的值就可以. #include <iostream> #include <vector> ...
- List<T>到XML的序列化与反序列化
原文 http://hi.baidu.com/shishengli1234/item/f0536f36335390c22f8ec24b Model.RESE_SCH sch1 = new Model. ...
- HDU 5875 Function(ST表+二分)
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5875 [题目大意] 给出一个数列,同时给出多个询问,每个询问给出一个区间,要求算出区间从左边开始不 ...
- Linux2.6中的Slab层
还记得一个进程创建的时候是什么给它分配的“进程描述符”吗?没错,是slab分配器,那么,这个slab分配器是个什么东西呢? 分配和释放数据结构是所有内核中最普遍的操作之一.为了 ...
- java载入XML文件并解析xml
import java.io.File; import java.util.List; import org.dom4j.Document; import org.dom4j.DocumentExce ...
- [C# 基础知识系列]专题六:泛型基础篇——为什么引入泛型
引言: 前面专题主要介绍了C#1中的2个核心特性——委托和事件,然而在C# 2.0中又引入一个很重要的特性,它就是泛型,大家在平常的操作中肯定会经常碰到并使用它,如果你对于它的一些相关特性还不是很了解 ...
- 使用coding.net来托管源码(可以免费存放私有项目的哦)(转载)
coding.net是国内新兴的一个项目管理平台,功能主要包括:代码托管.在线运行环境.监控代码质量,兼有一定的社交功能.在线运行环境支持Java.Ruby.Node.js.PHP.Python.Go ...
- 2015年最棒的10个 JavaScript 框架
JavaScript是最流行的前端开发程序设计语言.它为WEB开发者提供了能够设计出具有丰富功能.干净用户界面的WEB应用的能力.JavaScript框架使得WEB应用的设计变的简单,并且它能够提供很 ...
- WINFORM Tootip使用小结
toolTip1.Active = true; //激活工具提示,只有激活才会显示提示 toolTip1.IsBalloon = true; //toolTip以气泡形式出现 toolTip ...