什么是嵌套类及内部类? 

可以在一个类的内部定义另一个类, 这种类称为嵌套类(nested classes),它有两种类型: 
静态嵌套类和非静态嵌套类.静态嵌套类使用很少, 最重要的是非静态嵌套类, 也即是被称作为
内部类(inner).嵌套类从JDK1.1开始引入.其中inner类又可分为三种: 
(1) 在一个类中直接定义的内部类;
(2) 在一个方法中定义的内部类;
(3) 匿名内部类.
1. 静态嵌套类

static修饰符使得嵌套类对象成为外部类的静态成员,与外部类直接关联。

这样静态嵌套类作为一个静态成员,仅能访问外部类的静态成员,因为外部类中的非静态成员与外部类对象相关,静态嵌套类就不能访问他们,这使得静态嵌套类的功能变的很弱,可用之处很少。

另外因为静态嵌套类是依附于外部类而非外部类对象的,所以不同的外部类对象共享一个静态嵌套类,这一点与内部类不同,可以用来包装main方法。

静态嵌套类的声明示例:

OuterClass.StaticNestedClass nestedObject =new OuterClass.StaticNestedClass();

如下所示代码为定义一个静态嵌套类

package inner;
public class StaticTest{private static String name = "woobo";private String num = "X001";static class Person{private String address = "China";public String mail = "kongbowoo@yahoo.com.cn";//内部类公有成员public void display(){//System.out.println(num);//不能直接访问外部类的非静态成员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();}
}

  

2.内部类

没有static修饰意味着一个内部类是和外部类对象关联的,也可以说一个内部类对象存在于外部类对象中,是外部类对象的一个成员,因此内部类对象可以访问外部类对象的全部成员,包括私有成员。

  • 因为内部类依赖于外部类对象而存在,所以不能定义任何静态成员。
  • 内部类对象可以访问外部类的所有成员变量,包括私有成员,这是Java闭包的原理;
  • 因为内部类隐含对外部类的引用,所以外部类就不能被JVM的垃圾回收机制自动垃圾回收。
  • 不同的外部类对象之间没有公共的内部类对象成员。

内部类的声明示例:

OuterClass.InnerClass innerObject = new OuterObject().new InnerClass();

  

3.变量遮蔽Shadowing

嵌套类和封装类以及局部方法区的变量作用域有重叠,如果有同名变量将发生变量遮蔽。

  

public class ShadowTest {public int x = 0;class FirstLevel {public int x = 1;void methodInFirstLevel(int x) {System.out.println("x = " + x);System.out.println("this.x = " + this.x);System.out.println("ShadowTest.this.x = " + ShadowTest.this.x);}}public static void main(String... args) {ShadowTest st = new ShadowTest();ShadowTest.FirstLevel fl = st.new FirstLevel();fl.methodInFirstLevel(23);}
}

  

注意这里对3种不同变量的引用方式,结果如下

x = 23                  //1.  局部变量
this.x = 1              //2.内部类变量
ShadowTest.this.x = 0   //3.外部类变量

内部类中this指针指向内部类自己,ShadowTest.this则指向外部类对象;

不加修饰的变量,将执行就近匹配原则;如果名称相同将发生变量遮蔽效应;为了防止隐患,内部类引用外部类对象时应使用第三种方法。

来源: https://segmentfault.com/a/1190000003973982
来源: https://blog.csdn.net/yuanlong_zheng/article/details/7359349

转载于:https://www.cnblogs.com/wzdnwyyu/p/11095667.html

静态嵌套类和非静态嵌套类相关推荐

  1. JAVA错误:无法从静态上下文中引用非静态变量 this

    新学习:构造方法的重载,给成员变量赋值 错误代码: class Student {public static void main(String[] args) {Person p = new Pers ...

  2. 静态代码块、非静态代码块、构造函数执行顺序

    静态代码块.非静态代码块.构造函数执行顺序 /*** 类的实例化顺序,静态代码块.非静态代码块.构造函数.* @author MING*/ class Person {static String na ...

  3. 浅谈 JAVA中静态初始化块和非静态初始化块的区别

    众所周知在JAVA编程语言中有两种初始化块: 静态初始化块 非静态初始化块 他们到底有什么区别呢?今天就浅谈一下JAVA中静态初始化块和非静态初始化块的区别 静态初始化块 定义: static{} 执 ...

  4. 静态方法:无法在静态上下文中引用非静态

    如上是经典的Fobonacci递归算法: public class Fibonacci {public static void main(String []args){int x = f(6);Sys ...

  5. java中代码块之静态代码块和非静态代码块

    一.代码块: 语法:使用{}包裹的,可以在{}中写代码. 修饰符:static 或者不修饰. static修饰的为静态代码代码块. 格式: //静态代码块,随着类的加载児执行static{System ...

  6. java 代码块:静态代码块和非静态代码块

    main方法是程序的入口,加入没有main方法程序无法启动,但是main方法不是第一个执行的. 我认为:在这个类加载时,编译器会找到main方法,从这里开始运行,但是当你把这个类加载的时候,静态代码块 ...

  7. 静态代码块和非静态代码块的区别

    摘自原文 小结: 1.静态代码块是在类加载时自动执行的,非静态代码块在创建对象自动执行的代码,不创建对象不执行该类的非静态代码块. 顺序: 静态代码块-->非静态代码块-->类构造方法. ...

  8. java静态代码块与非静态代码块比较

    得出结论1:非静态代码块不会在调用方法与成员时执行. 结论2:非静态代码块在创建实例时执行 结论3:非静态代码块每次创建实例时执行,而静态代码块只执行一次 结论4:静态代码块优先非静态代码块优先构造函 ...

  9. 父类静态代码块、非静态代码块、构造方法、子类静态代码块、子类非静态代码块、子类构造方法执行顺序

    父类 public class Father {static{System.out.println("父类静态代码块");}{System.out.println("父类 ...

  10. java静态代码块和非静态代码块和构造函数执行顺序

    一.同类中静态代码块,非静态代码块,构造方法的执行顺序 1. 执行顺序:静态代码块-->非静态代码块-->构造方法. 程序在执行时,首先执行静态代码块,且只执行一次.接下来再创建对象时(n ...

最新文章

  1. ecshop商品详细描述调用商品相册代码
  2. 你需要掌握的三种编程语言
  3. 下载nodejs的mysql安装包下载安装_Node.js安装 下载
  4. .NET Core AWS S3云存储
  5. cad移动时捕捉不到基点_CAD入门必备(一)移动和复制新手必看
  6. Python 模板语言
  7. 3W | 跟着小小学会这些 Java 工程师面试题,月薪至少 3 W
  8. 数据埋点与设备指纹/设备反欺诈的区别与联系是什么?
  9. 多个if和一个ifelse的区别
  10. EDUCoder编程练习题解(循环)
  11. javascript继承机制的设计思想(ryf)
  12. STL中的所有算法(70个)
  13. java打架游戏_初学JAVA 好玩的打架小游戏代码 -
  14. 基于汇编语言的贪吃蛇程序
  15. Delphi好书推荐
  16. 别让那些贩卖焦虑的人,打扰到你的人生
  17. 预测分析 Python ARIMA模型预测(学习笔记)
  18. 卫士处刑者冠军css3边,天赋升华_流放之路3.9卫士流血BD_3.9冠军流血弓刷图BD攻略_3DM网游...
  19. 像搭积木一样建设的校园网
  20. 加了密码的PDF怎么解除密码?密码解除方法详解

热门文章

  1. IRF之ARP-MAD检测
  2. ELK详解(二十二)——Elastalert报警配置实战
  3. 华为PIM-SSM配置实例
  4. java J2EE 分层设计思想及各个文件命名规范
  5. Maven运行Selenium报错org/w3c/dom/ElementTraversal
  6. [APK拆解]谷歌眼镜XE16设置新语言,当你盯着屏幕时可同步检测
  7. [Java] ActionEvent 事件处理
  8. sourcetree使用说明
  9. javascript是一门多线程的语言_如何理解JavaScript是一种单线程非阻塞脚本语言?...
  10. mysql什么情况下死锁_2020-07-08:mysql只有一个表a,什么情况下会造成死锁,解决办法是什么?...