Java--四大内部类介绍及代码实现

吾日三省贾斯汀 发表于 2021/09/10 00:06:45 2021/09/10
【摘要】 内部类 1.成员内部类 2.局部内部类 3.静态内部类 4.匿名内部类 代码理解 package com.justin.innerclass;public class OuterClass { private int x = 0; private static int y = 2; // 1.成员内部类: // (1)顾名思...

内部类

1.成员内部类

2.局部内部类

3.静态内部类

4.匿名内部类

代码理解


  
  1. package com.justin.innerclass;
  2. public class OuterClass {
  3. private int x = 0;
  4. private static int y = 2;
  5. // 1.成员内部类:
  6. // (1)顾名思义,定义在一个类的内部
  7. // (2)可以访问外部类的所有的属性(变量)和方法,包括static变量和方法。
  8. // (3)成员内部类不能定义静态属性和方法。(static相关的加载顺序是:类->static变量->static代码块->成员变量->成员方法。)
  9. // (4)实例化成员内部类,必须先创建外部类的实例化对象。
  10. class MInnerClass {
  11. private int x = 1;
  12. public void show() {
  13. System.out.println("成员内部类");
  14. System.out.println("x=" + x + ",y=" + y);
  15. }
  16. }
  17. // 2.局部内部类:
  18. // (1)定义在一个类当中的某个方法或作用域内。
  19. // (2)和成员内部类的区别是成员内部类仅限于方法或作用域内访问。
  20. // (3)局部内部类就像是方法里面的一个局部变量一样,是不能有public、protected、private以及static修饰符的,并且只能访问final变量。
  21. public void show(final int a) {
  22. class PartInnerClass {
  23. private int x = 2;
  24. public void show() {
  25. System.out.println("局部内部类");
  26. System.out.println("a=" + a);
  27. }
  28. }
  29. //只能在方法内部实例化
  30. PartInnerClass pInnerClass = new PartInnerClass();
  31. pInnerClass.show();
  32. }
  33. // 3.静态内部类:
  34. // (1)和成员内部类一样定义在类的内部,但是使用static关键字修饰。
  35. // (2)不能访问外部类的普通属性和方法。
  36. static class StaticInnerClass {
  37. private int x = 3;
  38. public void show() {
  39. System.out.println("静态内部类");
  40. }
  41. }
  42. // 4.匿名内部类
  43. // (1)继承父类或实现接口并重写父类或接口的方法,会产生一个实例化对象。
  44. // (2)并且只能访问final变量。
  45. // 匿名内部类创建线程的两种方法:
  46. // 一、继承Thread类
  47. Thread t1 = new Thread() {
  48. @Override
  49. public void run() {
  50. for (int i = 0; i < 10; i++) {
  51. System.out.println(Thread.currentThread().getName() + "--" + i);
  52. }
  53. }
  54. };
  55. // 二、实现Runable接口
  56. Thread t2 = new Thread(new Runnable() {
  57. @Override
  58. public void run() {
  59. for (int i = 0; i < 10; i++) {
  60. System.out.println(Thread.currentThread().getName() + "--" + i);
  61. }
  62. }
  63. });
  64. public static void main(String[] args) {
  65. OuterClass outerClass = new OuterClass();
  66. // 成员内部类
  67. OuterClass.MInnerClass mInnerClass = new OuterClass().new MInnerClass();
  68. mInnerClass.show();
  69. // 静态内部类
  70. OuterClass.StaticInnerClass sInnerClass = new OuterClass.StaticInnerClass();
  71. sInnerClass.show();
  72. // 匿名内部类
  73. outerClass.t1.run();
  74. //
  75. outerClass.show(777);
  76. test(666);
  77. }
  78. public static void test(final int a) {
  79. new Thread() {
  80. @Override
  81. public void run() {
  82. // TODO Auto-generated method stub
  83. System.out.println(a);
  84. }
  85. }.start();
  86. }
  87. }

PS>>>static加载顺序

类->static变量->static代码块->普通变量->普通方法。

因此可知,成员内部类不能定义静态属性和方法,成员内部类就好比一个普通变量或方法,如果在内部定义static静态变量或方法,还没加载到内部类,就加载内部类的static变量了,java编译器编译的时候是会报错的。其他类似情况同理。

文章来源: blog.csdn.net,作者:吾日三省贾斯汀,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/JustinQin/article/details/77835883

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至:cloudbbs@huaweicloud.com进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。