深入理解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++写一个简单的发布者
节点是一个可执行程序,它连接到了ROS的网络系统中.我们将会创建一个发布者,也就是说话者节点,它将会持续的广播一个信息. 改变目录到之前所建立的那个包下: cd ~/catkin_ws/src/beg ...
- TinyFox 部署在CentOS7 中测试使用
一:TinyFox介绍 TinyFox 是一款支持OWIN标准的WEB应用的高性能的HTTP服务器,是Jexus Web Server的"姊妹篇".TinyFox本身的功能是htm ...
- mysql在查询结果中增加排序字段
ELECT userId , () AS runRank , mostFast1 FROM user_info, ()) b WHERE mostFast1 IS NOT NULL ORDER BY ...
- JS兼容性问题列表
记录平时遇见的兼容性问题,有更好的解决办法希望各位提出,会随着开发遇到问题而更新,标记为黄色的为未解决和猜测答案 提出时间 问题描述 解决方案 2014/10/22 submit按钮阻止了默认事件不能 ...
- Android 开发之Matrix图片处理类的使用
在Android中,对图片的处理需要使用到Matrix类,Matrix是一个3 x 3的矩阵,他对图片的处理分为四个基本类型: 1.Translate————平移变换 2.Scale————缩放变换 ...
- Web颜色搭配 - 收集
颜色1 颜色一 背景 字 RGB 43,41,46 92,187,207 HEX #2B292E #5CBBCF HSB 264,11,18 190,56,81 CMYK 7,11,0,82 5 ...
- [LeetCode]题解(python):138-Copy List with Random Pointer
这道题目不是太懂,参考了http://www.cnblogs.com/zuoyuan/p/3745126.html的博客. 题意: A linked list is given such that e ...
- [转]关于HTTP服务器每个客户端2个连接的限制
这两天猫在家里搞一个多线程的断点续传得C#程序,发现同时只能开2个线程下载,其他的线程一律要等待,这样就导致下载大文件时其他线程经常超时,郁闷好久.今天回公司无意中发现了一个帖子,终于真相大白了, 现 ...
- uva 10763 Foreign Exchange(排序比较)
题目连接:10763 Foreign Exchange 题目大意:给出交换学生的原先国家和所去的国家,交换成功的条件是如果A国给B国一个学生,对应的B国也必须给A国一个学生,否则就是交换失败. 解题思 ...
- SGU 242 Student's Morning 网络流(水
题目链接:contest=0&problem=242">点击打开链接 题意: 给定n个人,m个终点 以下n行表示每一个人能够去m个点. 每一个人仅仅能去一个点. 输出随意一个方 ...