image.png
    package com.atguigu.java4;
    /
    类的内部成员之五:内部类
    1.Java中允许将一个类A声明在另一个类B中,则类A就是内部类,类B称为外部类

    2.内部类的分类:成员内部类(静态、非静态) VS 局部内部类(方法内、代码块内、构造器内)

    3.成员内部类:
    一方面,作为外部类的成员:
    >调用外部类的结构
    >可以被static修饰
    >可以被4种不同的权限修饰符修饰

    另一方面,作为一个类:
    >类内可以定义属性、方法、构造器
    >可以被final修饰,表示此类不能被继承。言外之意,不能用final,就可以被继承
    >可以被abstract修饰

    4.关注如下3个问题:
    4.1 如何实例化成员内部类的对象
    4.2 如何在成员内部类中区分调用外部类的结构
    4.3 开发中局部内部类的使用


    /
    总结:
    成员内部类和局部内部类,在编译以后,都会生成字节码文件。
    格式:成员内部类:外部类$内部类名.class
    局部内部类:外部类$数字 内部类名.class

    1. package com.atguigu.java4;
    2. /*
    3. * 类的内部成员之五:内部类
    4. * 1.Java中允许将一个类A声明在另一个类B中,则类A就是内部类,类B称为外部类
    5. *
    6. * 2.内部类的分类:成员内部类(静态、非静态) VS 局部内部类(方法内、代码块内、构造器内)
    7. *
    8. * 3.成员内部类:
    9. * 一方面,作为外部类的成员:
    10. * >调用外部类的结构
    11. * >可以被static修饰
    12. * >可以被4种不同的权限修饰符修饰
    13. *
    14. * 另一方面,作为一个类:
    15. * >类内可以定义属性、方法、构造器
    16. * >可以被final修饰,表示此类不能被继承。言外之意,不能用final,就可以被继承
    17. * >可以被abstract修饰
    18. *
    19. * 4.关注如下3个问题:
    20. * 4.1 如何实例化成员内部类的对象
    21. * 4.2 如何在成员内部类中区分调用外部类的结构
    22. * 4.3 开发中局部内部类的使用
    23. *
    24. *
    25. */
    26. public class InnerClassTest {
    27. public static void main(String[] args) {
    28. //创建Dog实例(静态的成员内部类):
    29. Person.Dog dog = new Person.Dog();
    30. dog.show();
    31. //创建Bird实例(非静态的成员内部类):
    32. // Person.Bird bird = new Person.Bird(); //错误的
    33. Person p = new Person();
    34. Person.Bird bird = p.new Bird();
    35. bird.sing();
    36. }
    37. }
    38. class Person{
    39. String name;
    40. int age;
    41. public void eat(){
    42. System.out.println("人,吃饭");
    43. }
    44. //静态成员内部类
    45. static class Dog{
    46. String name;
    47. int age;
    48. public void show(){
    49. System.out.println("卡拉是条狗");
    50. }
    51. }
    52. //非静态成员内部类
    53. class Bird{
    54. String name;
    55. int age;
    56. public Bird(){
    57. }
    58. public void sing(){
    59. System.out.println("我是一只小小鸟");
    60. Person.this.eat();//调用外部类的方法
    61. }
    62. }
    63. public void method(){
    64. //局部内部类
    65. class AA{
    66. }
    67. }
    68. //局部内部类
    69. {
    70. class BB{
    71. }
    72. }
    73. //局部内部类
    74. public Person(){
    75. class CC{
    76. }
    77. }
    78. }