内部类

概述

内部类,即为在一个类中定义的类

语法格式

  1. class A{
  2. classB{
  3. B即为内部类
  4. }
  5. }

特点

  1. 内部类可以直接访问外部类中的成员,包括私有成员

  2. 外部类要访问内部类的成员,必须要建立内部类的对象

  3. 在成员位置的内部类是成员内部类

  4. 在局部位置的内部类是局部内部类

内部类代码示例

  1. package cn.tedu.innerclass;
  2. /**
  3. * 内部类案例
  4. */
  5. public class TestInner1 {
  6. public static void main(String[] args) {
  7. Outer.Inner oi = new Outer().new Inner();
  8. oi.delete();
  9. System.out.println(oi.sum);
  10. //直接创建外部类匿名对象调用外部类方法
  11. new Outer().find();
  12. }
  13. }
  14. class Outer{
  15. String name;
  16. private int age;
  17. public void find(){
  18. System.out.println("马钊要起飞了!");
  19. /*
  20. System.out.println(sum);
  21. delete();
  22. 内部类无法直接使用外部类的资源
  23. 需要创建内部类对象后才可使用
  24. */
  25. Inner in = new Inner();
  26. System.out.println(in.sum);
  27. in.delete();
  28. }
  29. class Inner{
  30. int sum = 100;
  31. public void delete(){
  32. System.out.println("马钊起飞成功");
  33. System.out.println(name);
  34. System.out.println(age);
  35. //只能单向调用,不能循环调用,会导致栈溢出异常
  36. //find();
  37. }
  38. }
  39. }

私有内部类

成员内部类被Private修饰以后,无法被外界直接创建创建对象使用

所以可以创建外部类对象,通过外部类对象间接访问内部类的资源

  1. package cn.tedu.innerclass;
  2. /**
  3. * 测试成员内部类被private修饰
  4. */
  5. public class TestInner2 {
  6. public static void main(String[] args) {
  7. /*
  8. Outer2.Inner2 oi = new Outer2().new Inner2();
  9. oi.eat();
  10. 报错
  11. */
  12. Outer2 o2 = new Outer2();
  13. o2.getInner2Eat();
  14. }
  15. }
  16. class Outer2{
  17. /*
  18. 成员内部类
  19. 位置:类里方法外
  20. */
  21. private class Inner2{
  22. public void eat(){
  23. System.out.println("明天,马钊,吃的,起飞!");
  24. }
  25. }
  26. public void getInner2Eat(){
  27. Inner2 in = new Inner2();
  28. in.eat();
  29. }
  30. }

静态内部类

静态资源访问时不需要创建对象,可以通过类名直接访问

访问静态类中的静态资源可以通过”. . . ”链式加载的方式访问

  1. package cn.tedu.innerclass;
  2. /**
  3. * 测试静态内部类
  4. */
  5. public class TestInner3 {
  6. public static void main(String[] args) {
  7. /*
  8. Outer3.Inner3 oi = new Outer3().new Inner3();
  9. oi.watermelon();
  10. new Outer3().new Inner3().watermelon();
  11. 内部类被static修饰后,报错
  12. */
  13. Outer3.Inner3 oi = new Outer3.Inner3();//静态内部类普通对象
  14. oi.watermelon();
  15. new Outer3.Inner3().watermelon();//静态内部类匿名对象
  16. //访问静态内部类的静态资源---链式加载
  17. Outer3.Inner3.eat();
  18. }
  19. }
  20. class Outer3{
  21. static class Inner3{
  22. public void watermelon(){
  23. System.out.println("吃瓜大赛");
  24. }
  25. public static void eat(){
  26. System.out.println("吃瓜吃到吐");
  27. }
  28. }
  29. }

局部内部类

调用局部内部类功能 在外部类中创建局部类的对象并且调用其功能

  1. package cn.tedu.innerclass;
  2. /**
  3. * 测试局部内部类
  4. */
  5. public class TestInner4 {
  6. public static void main(String[] args) {
  7. Outer4 o = new Outer4();
  8. o.show();
  9. }
  10. }
  11. class Outer4{
  12. public void show(){
  13. System.out.println("Other4-----show()");
  14. //局部内部类--方法里
  15. class Inner4{
  16. String name;
  17. int age;
  18. public void eat(){
  19. System.out.println("show-----eat()");
  20. }
  21. }
  22. /*
  23. 在外部类中创建局部类的对象并且调用其功能
  24. */
  25. Inner4 in = new Inner4();
  26. in.eat();
  27. System.out.println(in.age);
  28. System.out.println(in.name);
  29. }
  30. }

匿名内部类

匿名内部类属于局部内部类,而且是没有名字的局部内部类,通常和匿名对象一起使用

  1. package cn.tedu.innerclass;
  2. /**
  3. * 匿名内部类
  4. */
  5. public class TestInner5 {
  6. public static void main(String[] args) {
  7. /*
  8. 创建接口实现类的对象才能调用方法===创建接口实现类+重写接口中的抽象方法+调用方法
  9. 匿名内部类没有名字,通常与匿名对象结合使用,用于调用一次&一个方法
  10. */
  11. new Inner1() {
  12. @Override
  13. public void save() {
  14. System.out.println("保存");
  15. }
  16. @Override
  17. public void get() {
  18. System.out.println("获取");
  19. }
  20. }.save();
  21. new Inner11() {
  22. @Override
  23. public void play() {
  24. System.out.println("大赛");
  25. }
  26. }.play();
  27. new Inner3().get();
  28. }
  29. }
  30. interface Inner1{
  31. void save();
  32. void get();
  33. class Inner4{
  34. }
  35. }
  36. abstract class Inner11{
  37. public void eat(){
  38. System.out.println("吃瓜");
  39. }
  40. abstract public void play();
  41. }
  42. class Inner3{
  43. public void eat(){
  44. System.out.println("吃土");
  45. }
  46. public void get(){
  47. System.out.println("获取");
  48. }
  49. }