当前位置:   article > 正文

Java小记——内部类、匿名内部类_内部类了解吗?匿名内部类了解吗?

内部类了解吗?匿名内部类了解吗?

目录

内部类

成员内部类

局部内部类

匿名内部类


内部类

内部类概念

定义在其他类中的类,称为内部类

内部类访问特点

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

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

在外部类创建内部类对象     Nei nei = new Nei()

在测试类创建内部类对象    Wai.Nei nei = new Wai().new Nei()

成员内部类

定义在成员位置的类,称为成员内部类

  1. class B {
  2. //成员内部类
  3. class A {
  4. }
  5. public void show() {
  6. //局部内部类
  7. class C {
  8. }
  9. }
  10. }

若成员内部类被private修饰(内部类可以被私有,普通类则不行),则不能在测试类中创建内部类对象,只能在外部类中创建内部类对象,再在测试类中创建外部类对象。

  1. public class MyTest {
  2. public static void main(String[] args) {
  3. //Wai.Nei nei = new Wai().new Nei();
  4. //nei.neiShow(); //内部类被私有,不能在测试类创建内部类对象
  5. Outer outer = new Outer();
  6. outer.waiShow(); //内部类被私有,只能通过创建外部类对象调用方法来创建内部类对象
  7. }
  8. }
  9. class Wai {
  10. //内部类可以私有修饰
  11. private class Nei {
  12. public void neiShow() {
  13. System.out.println("nei show");
  14. }
  15. }
  16. public void waiShow() {
  17. Inner inner = new Inner();
  18. inner.neiShow();
  19. }
  20. }

被static修饰的成员内部类

1.只能访问外部类的静态成员

  1. public class Wai {
  2. static int num = 100;
  3. public static class Nei {
  4. public void neiShow() {
  5. System.out.println(num);
  6. }
  7. }

2.静态的成员内部类,在测试类中创建对象

Wai.Nei nei = new Wai.Nei();

  1. public class MyTest {
  2. public static void main(String[] args) {
  3. Wai.Nei nei = new Wai.Nei();
  4. }
  5. }

*****     :      Outer.this 表示外部类对象

局部内部类

不能直接在测试类创建对象,在方法内创建局部内部类对象,在测试类创建外部类对象调用外部类的方法

  1. public class MyTest {
  2. public static void main(String[] args) {
  3. //局部内部类,在外界没有直接创建其对象的语法。
  4. Wai wai = new Wai();
  5. wai.waiShow();
  6. }
  7. }
  8. class Wai {
  9. int num = 20;
  10. private double a = 3.5;
  11. public void waiShow() {
  12. final int num=20; //默认有final,可不写。
  13. //局部内部类
  14. class Nei {
  15. int t = 50;
  16. public void neiShow() {
  17. System.out.println(num);
  18. System.out.println(a);
  19. }
  20. }
  21. //创建局部内部类对象
  22. Nei nei = new Nei();
  23. nei.neiShow();
  24. }
  25. public void hehe() {
  26. }
  27. }

局部变量用final修饰。因为局部变量会随着方法的调用完毕而消失,但是局部对象并没有立马从堆内存中消失,还要继续使用那个局部变量,就要用final修饰,在堆内存中储存为一个常量。

匿名内部类

匿名内部类是局部内部类的简写形式

实质上为一个对象

继承了抽象类的一个子类对象  或   实现接口类的一个对象

抽象类:

  1. new Father() { //父类的子类对象,重写了父类的方法
  2. @Override
  3. public void hehe() {
  4. System.out.println("呵呵呵呵呵呵");
  5. }
  6. };
  7. new Father() {
  8. @Override
  9. public void hehe() {
  10. System.out.println("44444444444444");
  11. }
  12. }.hehe(); //子类对象调用了父类方法
  13. }
  14. }
  15. abstract class Father { //抽象父类
  16. public abstract void hehe();
  17. }

接口:

  1. public class MyTest {
  2. public static void main(String[] args) {
  3. //我想要得到接口的实现类对象
  4. new SS() {
  5. @Override
  6. public void ss() {
  7. System.out.println("sssssssssssssssssss");
  8. }
  9. };
  10. new SS() {
  11. @Override
  12. public void ss() {
  13. System.out.println("sssssssssssssssssss888888");
  14. }
  15. }.ss();
  16. //多态
  17. SS ss = new SS() {
  18. @Override
  19. public void ss() {
  20. System.out.println("sssssssssssssssssss888888");
  21. }
  22. };
  23. }
  24. }
  25. interface SS {
  26. void ss();
  27. }

若想对对象取名

  1. AA aa = new AA() {
  2. @Override
  3. public void aa() {
  4. System.out.println("aaaaaaaaaaaaaa744444aa");
  5. }
  6. @Override
  7. public void hehe() {
  8. System.out.println("hehehehehe888877777hhehehhe");
  9. }
  10. };
  11. aa.aa();
  12. aa.hehe();

匿名内部类,常作为参数传递或返回值

抽象类 作为参数:

  1. public class MyTest {
  2. public static void main(String[] args) {
  3. //匿名内部类,经常作为参数,或返回值,使用比较方便。
  4. WW ww = new WW() {
  5. @Override
  6. public void hehe() {
  7. System.out.println("aaa");
  8. }
  9. };
  10. test(ww);
  11. test(new WW() {
  12. @Override
  13. public void hehe() {
  14. System.out.println("bbb");
  15. }
  16. });
  17. }
  18. public static void test(WW ww) {
  19. ww.hehe();
  20. }
  21. }
  22. abstract class WW {
  23. public abstract void hehe();
  24. }

接口 作为参数:

  1. public class MyTest2 {
  2. public static void main(String[] args) {
  3. HH hh = new HH() {
  4. @Override
  5. public void hh() {
  6. System.out.println("hhhhhhhhhhhhhhhhh");
  7. }
  8. };
  9. test(hh); //取名传递
  10. test(hh);
  11. test(new HH() {
  12. @Override
  13. public void hh() {
  14. System.out.println("hhhhhhhhhhhhhhhhh");
  15. }
  16. }); //直接作为参数传递
  17. }
  18. //当你以后看到一个方法的形参,要一个接口,类型,你就传递一个该接口的,实现类对象,多态。
  19. public static void test(HH hh) {
  20. hh.hh();
  21. }
  22. }
  23. interface HH {
  24. void hh();
  25. }

抽象类 作为返回值

  1. public class MyTest {
  2. public static void main(String[] args) {
  3. BB bb = getBB();
  4. bb.bb();
  5. BB bb2 = getBB2();
  6. bb2.bb();
  7. //匿名内部类,作为返回值,返回方便
  8. }
  9. //当你以后看到一个方法的返回值,类型是一个抽象类 类型,你就返回一个该抽象类的子类对象。
  10. public static BB getBB() {
  11. BB cc = new CC();
  12. return cc;
  13. }
  14. public static BB getBB2() {
  15. return new BB() {
  16. @Override
  17. public void bb() {
  18. System.out.println("bbbbbbbbbbbbbbbbb222222222");
  19. }
  20. };
  21. }
  22. }
  23. abstract class BB {
  24. public abstract void bb();
  25. }
  26. class CC extends BB {
  27. @Override
  28. public void bb() {
  29. System.out.println("bbbbbbbbbbbbbbbbbb");
  30. }
  31. }

接口 作为返回值

  1. public class MyTest {
  2. public static void main(String[] args) {
  3. BB bb = getBB();
  4. bb.hehe();
  5. BB bb2 = getBB2();
  6. bb2.hehe();
  7. //匿名内部类,作为返回值,返回方便
  8. }
  9. //当你以后看到一个方法的返回值,类型是一个抽象类 类型,你就返回一个该抽象类的子类对象。
  10. public static BB getBB() {
  11. BB cc = new CC();
  12. return cc;
  13. }
  14. public static BB getBB2() {
  15. return new BB() {
  16. @Override
  17. public void hehe() {
  18. System.out.println("bbbbb66666");
  19. }
  20. };
  21. }
  22. }
  23. interface BB {
  24. void hehe();
  25. }
  26. class CC implements BB {
  27. @Override
  28. public void hehe() {
  29. System.out.println("666666");
  30. }
  31. }

在类中定义接口,称为内部接口

  1. public class MyTest {
  2. public static void main(String[] args) {
  3. //创建内部接口的子类对象
  4. Wai.MyInterface myInterface = new Wai.MyInterface() {
  5. @Override
  6. public void hehe() {
  7. System.out.println("呵呵呵呵呵");
  8. }
  9. };
  10. myInterface.hehe();
  11. Wai wai = new Wai();
  12. wai.test();
  13. }
  14. }
  15. class Wai {
  16. //内部接口
  17. interface MyInterface {
  18. void hehe();
  19. }
  20. //私有内部接口
  21. private interface MyInterface2 {
  22. void hehe2();
  23. }
  24. public void test() {
  25. MyInterface2 myInterface2 = new MyInterface2() {
  26. @Override
  27. public void hehe2() {
  28. System.out.println("2222222222222222");
  29. }
  30. };
  31. myInterface2.hehe2();
  32. }
  33. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/683214
推荐阅读
相关标签
  

闽ICP备14008679号