初识JAVA内部类

╰半橙微兮° 2021-09-07 06:19 429阅读 0赞

1 内部类概述

如果一个类存在的意义就是为指定的另一个类,可以把这个类放入另一个类的内部。
就是把类定义在类的内部的情况就可以形成内部类的形式。
A类中又定义了B类,B类就是内部类,B类可以当做A类的一个成员看待:
只为A类服务,可以看做是外部类的一个特殊成员

2 特点

1) 内部类可以直接访问外部类中的成员,包括私有成员
2) 外部类要访问内部类的成员,必须要建立内部类的对象
3) 在成员位置的内部类是成员内部类
4) 在局部位置的内部类是局部内部类

3 练习 : 内部类入门案例

创建包: cn.tedu.innerclass
创建类: TestInner1.java

  1. package cn.tedu.innerclass;
  2. /*本类用作测试内部类的入门案例*/
  3. public class TestInner1 {
  4. public static void main(String[] args) {
  5. //3.创建内部类对象,使用内部类的资源
  6. /*外部类名.内部类名 对象名 = 外部类对象.内部类对象*/
  7. Outer.Inner oi = new Outer().new Inner();
  8. oi.delete();
  9. System.out.println(oi.sum);
  10. //4.调用外部类的方法--这样是创建了一个外部类的匿名对象,只使用一次
  11. new Outer().find();
  12. }
  13. }
  14. //1.创建外部类 Outer
  15. class Outer{
  16. //1.1创建外部类的成员变量
  17. String name;
  18. private int age;
  19. //1.2创建外部类的成员方法
  20. public void find(){
  21. System.out.println("Outer...find()");
  22. //6.测试外部类如何使用内部类的资源
  23. //System.out.println(sum);--不能直接使用内部类的属性
  24. //delete();--不能直接调用内部类的方法
  25. /*外部类如果想要使用内部类的资源,必须先创建内部类对象 * 通过内部类对象来调用内部类的资源*/
  26. Inner in = new Inner();
  27. System.out.println(in.sum);
  28. in.delete();
  29. }
  30. //2.创建内部类Inner--类的特殊成员
  31. /*根据内部类位置的不同,分为:成员内部类(类里方法外)、局部内部类(方法里)*/
  32. class Inner{
  33. //2.1定义内部类的成员变量
  34. int sum = 10;
  35. //2.2定义内部类的成员方法
  36. public void delete(){
  37. System.out.println("Inner...delete()");
  38. //5.测试内部类是否可以使用外部类的资源
  39. /*结论:内部类可以直接使用外部类的资源,私有成员也可以!*/
  40. System.out.println(name);
  41. System.out.println(age);
  42. /*注意:此处测试完毕需要注释掉,否则来回调用 * 会抛出异常StackOverFlowException栈溢出异常*/
  43. //find();
  44. }
  45. }
  46. }

4 成员内部类

4.1 练习 : 被private修饰

创建包: cn.tedu.innerclass
创建类: TestInner2.java

  1. package cn.tedu.innerclass;
  2. /**本类用来测试成员内部类被private修饰*/
  3. public class TestInner2 {
  4. public static void main(String[] args) {
  5. /**怎么使用内部类Inner2的资源?*/
  6. //4.创建内部类Inner2对象进行访问
  7. //Outer2.Inner2 oi = new Outer2().new Inner2();
  8. //oi.eat();
  9. /**如果Inner2被private修饰,无法直接创建对象该怎么办?*/
  10. //7.创建外部类对象,间接访问私有内部类资源
  11. new Outer2().getInner2Eat();
  12. }
  13. }
  14. //1.创建外部类Outer2
  15. class Outer2{
  16. //6.提供外部类公共的方法,在方法内部创建Inner2内部类对象,调用内部类方法
  17. public void getInner2Eat() {
  18. Inner2 in = new Inner2();//外部类可以访问内部类的私有成员
  19. in.eat();
  20. }
  21. //2.1创建成员内部类Inner2
  22. /**成员内部类的位置:类里方法外*/
  23. //5.成员内部类,被private修饰私有化,无法被外界访问
  24. private class Inner2{
  25. //3.创建内部类的普通成员方法
  26. public void eat() {
  27. System.out.println("我是Inner2的eat()");
  28. }
  29. }
  30. }
总结:
成员内部类被Private修饰以后,无法被外界直接创建创建对象使用
所以可以创建外部类对象,通过外部类对象间接访问内部类的资源

4.2 练习 : 被static修饰

创建包: cn.tedu.innerclass
创建类: TestInner3.java

  1. package cn.tedu.innerclass;
  2. /**本类用来测试成员内部类被static修饰*/
  3. public class TestInner3 {
  4. public static void main(String[] args) {
  5. /**如何访问内部类的show()?*/
  6. //4.创建内部类对象访问show()
  7. //方式一:按照之前的方式,创建内部类对象调用show()
  8. //Outer3.Inner3 oi = new Outer3().new Inner3();
  9. //oi.show();
  10. //方式二:创建匿名内部类对象访问show()
  11. //new Outer3().new Inner3().show();
  12. /**现象:当内部类被static修饰以后,new Outer3()报错*/
  13. //6.用static修饰内部类以后,上面的创建语句报错,注释掉
  14. //通过外部类的类名创建内部类对象
  15. Outer3.Inner3 oi = new Outer3.Inner3();
  16. oi.show();
  17. //7.匿名的内部类对象调用show()
  18. new Outer3.Inner3().show();
  19. //9.访问静态内部类中的静态资源--链式加载
  20. Outer3.Inner3.show2();
  21. }
  22. }
  23. //1.创建外部类Outer3
  24. class Outer3{
  25. //2.创建成员内部类Inner3
  26. //5.内部类被static修饰—并不常用!浪费内存!
  27. static class Inner3{
  28. //3.定义成员内部类中普通的成员方法
  29. public void show() {
  30. System.out.println("我是Inner3类的show()");
  31. }
  32. //8.定义成员内部类的静态成员方法
  33. static public void show2() {
  34. System.out.println("我是Inner3的show2()");
  35. }
  36. }
  37. }
总结:
静态资源访问时不需要创建对象,可以通过类名直接访问
访问静态类中的静态资源可以通过”. . . ”链式加载的方式访问

5 局部内部类

创建包: cn.tedu.innerclass
创建类: TestInner4.java

  1. package cn.tedu.innerclass;
  2. /**本类用来测试局部内部类*/
  3. public class TestInner4 {
  4. public static void main(String[] args) {
  5. /**如何使用内部类的资源呢? * 注意:直接调用外部类的show()是无法触发内部类功能的 * 需要再外部类中创建内部类对象并且进行调用,才能触发内部类的功能 * */
  6. //5.创建外部类对象调用show()
  7. //7.当在外部类show()中创建局部内部类对象并且进行功能调用后,内部类的功能才能被调用
  8. new Outer4().show();
  9. }
  10. }
  11. //1.创建外部类Outer4
  12. class Outer4{
  13. //2.创建外部类的成员方法
  14. public void show() {
  15. //3.创建局部内部类Inner4—不太常用!!!
  16. /**位置:局部内部类的位置在方法里*/
  17. class Inner4{
  18. //4.创建局部内部类的普通属性与方法
  19. String name;
  20. int age;
  21. public void eat() {
  22. System.out.println("我是Inner4的eat()");
  23. }
  24. }
  25. /**如何使用局部内部类的资源?*/
  26. //6.在show()里创建内部类对象
  27. Inner4 in = new Inner4();
  28. in.eat();
  29. System.out.println(in.name);
  30. System.out.println(in.age);
  31. }
  32. }

6 匿名内部类

创建包: cn.tedu.innerclass
创建类: TestInner5.java

  1. package cn.tedu.innerclass;
  2. /*本类用于测试匿名内部类,没有名字,通常结合着匿名对象一起使用*/
  3. public class TestInner5 {
  4. public static void main(String[] args) {
  5. /*接口可以创建对象吗?不可以!!!*/
  6. //new Inner1();//接口不能创建对象
  7. //3.new Inner1()匿名对象
  8. //以前我们创建接口,接口不能实例化
  9. //所以我们创建接口实现类 +重写接口中的抽象方法 + 创建实现类对象 + 调用方法
  10. /*就相当于创建了一个接口的实现类 + 重写接口中的所有抽象方法*/
  11. new Inner1() { //3.1接口的实现类
  12. @Override
  13. public void save() { //3.2重写接口中的抽象方法1
  14. System.out.println("我是Inner1接口的save()");
  15. }
  16. @Override
  17. public void get() { //3.2重写接口中的抽象方法2
  18. System.out.println("我是Inner1接口的get()");
  19. }
  20. }.get();//3.3触发指定的重写后的方法,只能调用一个,并且只能调用一次
  21. /*注意!!!匿名对象只使用一次,而且一次只能干一件事!!!*/
  22. //5.new Inner2()匿名对象,相当于创建了抽象类的普通子类
  23. /*匿名内部类实现的方法都是抽象方法,注意是所有抽象方法*/
  24. new Inner2() {
  25. @Override
  26. public void drink() {
  27. System.out.println("我是Inner2抽象类的drink()");
  28. }
  29. }.drink();
  30. //7.普通类的匿名对象,不会强制要求产生匿名内部类的重写方法
  31. //如果使用对象,只需要干一件事--可以直接创建匿名对象,简单又方便
  32. new Inner3().power();
  33. //如果想使用同一个对象来干很多件事情,必须要给对象起名字
  34. Inner3 i3 = new Inner3();
  35. i3.power();
  36. i3.study();
  37. i3.study();
  38. i3.study();
  39. }
  40. }
  41. //1.创建接口
  42. interface Inner1{
  43. //2.定义接口中的抽象方法
  44. void save();
  45. void get();
  46. }
  47. //4.创建抽象类
  48. abstract class Inner2{
  49. public void play(){
  50. System.out.println("我是Inner2抽象类中的普通方法play()");
  51. }
  52. abstract public void drink();
  53. }
  54. //6.创建普通类Inner3
  55. class Inner3{
  56. public void power(){
  57. System.out.println("我们会越来越强的,光头强");
  58. }
  59. public void study(){
  60. System.out.println("什么都阻挡不了我学习的脚步");
  61. }
  62. }
总结:
匿名内部类属于局部内部类,而且是没有名字的局部内部类,通常和匿名对象一起使用

发表评论

表情:
评论列表 (有 0 条评论,429人围观)

还没有评论,来说两句吧...

相关阅读

    相关 内部

    1、成员内部类 内部类:在一个类的内部定义一个内部类。 特点: > 1、 内部类可以使用 private 修饰,表示私有。 只能在外部类当中去使用。 > > 2、

    相关 StringBuffer

    StringBuffer类   A:StringBuffer类 线程安全的可变字符序列。一个类似于 String 的字符串缓冲区,但不能修改(用+好改变

    相关 Map

    我们在前面的文章中已经简短的介绍了下Map,作为开始,我们再更深的了解一下,此接口主要有四个常用的实现类,分别是HashMap、Hashtable、LinkedHashMap和

    相关 List

        先看java Api的中文文档: 有序的 collection(也称为序列)。此接口的用户可以对列表中每个元素的插入位置进行精确地控制。用户可以根据元素的整数索引

    相关 Set

    先看一下官方文档:set是一个不包含重复元素的 collection。更确切地讲,set 不包含满足 e1.equals(e2) 的元素对 e1 和 e2,并且最多包含一个 n

    相关 JAVA内部

    1 内部类概述 如果一个类存在的意义就是为指定的另一个类,可以把这个类放入另一个类的内部。 就是把类定义在类的内部的情况就可以形成内部类的形式。 A类中又定义了B