内部类(成员内部类、静态内部类、匿名内部类)

缺乏、安全感 2024-03-26 19:10 214阅读 0赞

成员内部类

  1. //语法结构
  2. 修饰符 class 外部类名称{
  3. 修饰符 class 内部类名称{
  4. //....
  5. }
  6. //...
  7. }

使用方法

直接在外部类的方法里面创建内部类,调用内部类的方法即可

  1. public class outside {
  2. public void outsedeMethod(){
  3. System.out.println ("这个外部类的方法!");
  4. new inner ().eat ();
  5. }
  6. class inner{
  7. public void eat(){
  8. System.out.println ("老莫,我想吃鱼!");
  9. }
  10. }
  11. }
  12. public class DemoinnerClass {
  13. public static void main(String[] args) {
  14. outside outside = new outside ();
  15. outside.outsedeMethod ();
  16. }
  17. }
  18. =========打印结果==========
  19. 这个外部类的方法!
  20. 老莫,我想吃鱼!

总结:

  • 主要是用来弥补单继承的缺陷,补充类的功能
  • 除了外部类都无法直接访问内部类,可以提供更好的隐蔽性
  • 内部类定义的 private 属性外部类也不可以访问,因此对外界来说,比 private 的访问权限更小
  • 成员内部类不允许有任何的静态成员,必须先创建外部类再创建内部类

静态内部类

  1. //语法结构
  2. 修饰符 class 外部类名称{
  3. static class 内部类名称{
  4. //....
  5. }
  6. //...
  7. }

使用方法

  1. public class outside {
  2. public void outsedeMethod(){
  3. System.out.println ("这个外部类的方法!");
  4. }
  5. public static void eat(){
  6. System.out.println ("我今天想吃鲫鱼!");
  7. }
  8. static class inner{
  9. public void eat(){
  10. System.out.println ("老莫,我想吃鱼!");
  11. }
  12. public void eatmore(){
  13. new outside ().outsedeMethod ();
  14. eat ();
  15. }
  16. }
  17. }
  18. public class DemoinnerClass {
  19. public static void main(String[] args) {
  20. outside.inner inner = new outside.inner ();
  21. inner.eat ();
  22. inner.eatmore ();
  23. }
  24. }
  25. ========打印结果=========
  26. 老莫,我想吃鱼!
  27. 这个外部类的方法!
  28. 老莫,我想吃鱼!

总结:

  • 静态内部类可以直接访问外部类的静态成员,包括私有的,但是不能访问非静态成员–>需要创建创建实例对象调用
  • 创建静态内部类不需要创建外部类,可以直接使用 new 外部类.内部类.方法 来调用静态内部类的方法
  • 静态内部类可以有静态或非静态的成员,且获取静态内部类对象时,不需要先创建外部类对象

    匿名内部类

匿名内部类是局部内部类的一种简化形式.本质上是一个对象,是实现了该接口或继承了该抽象类的子类对象

  1. //语法结构
  2. new 类名或者接口名(){
  3. 重写方法;
  4. } ;

使用方法

  1. public interface Eating {
  2. public void eat();
  3. }
  4. public class anonymousinnerClass {
  5. public static void main(String[] args) {
  6. new Eating (){
  7. @Override
  8. public void eat(){
  9. System.out.println ("吃鱼!");
  10. }
  11. }.eat ();
  12. }
  13. }
  14. =============打印==================
  15. 吃鱼!
  16. public abstract class Eating {
  17. public abstract void eating();
  18. }
  19. public class outside {
  20. public void outsedeMethod(){
  21. System.out.println ("这个外部类的方法!");
  22. }
  23. public static void eat(){
  24. System.out.println ("我今天想吃鲫鱼!");
  25. }
  26. static class inner{
  27. public void eat(){
  28. System.out.println ("老莫,我想吃鱼!");
  29. }
  30. public void eatmore(){
  31. new outside ().outsedeMethod ();
  32. eat ();
  33. }
  34. }
  35. }
  36. =============打印==================
  37. 我今天想吃鲫鱼
  38. 我今天想吃鳜鱼!

总结:

  • 匿名内部类,经常作为参数,或返回值,使用比较方便
  • 不需要重新写一个类再实现接口,减少资源浪费*
  • 一个类中可以嵌套一个接口,并调用重写后的方法

发表评论

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

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

相关阅读