疯狂Java之学习笔记(15)-------------内部类

举报
brucexiaogui 发表于 2021/12/30 02:31:11 2021/12/30
【摘要】 疯狂Java之学习笔记(15)-------------内部类 一个内部类可以定义在另一个类里,可以定义在函数里,甚至可以作为一个表达式的一部分。   Java中的内部类共分为四种:   静态内部类static inner class (also called nested class)   成员内部类member inner cla...

疯狂Java之学习笔记(15)-------------内部类

一个内部类可以定义在另一个类里,可以定义在函数里,甚至可以作为一个表达式的一部分。

  Java中的内部类共分为四种

  静态内部类static inner class (also called nested class)

  成员内部类member inner class

  局部内部类local inner class

  匿名内部类anonymous inner class

 

静态内部类Static Inner Class

  最简单的内部类形式。

  类定义时加上static关键字。

  不能和外部类有相同的名字。

  被编译成一个完全独立的.class文件,名称为OuterClass$InnerClass.class的形式。

  只可以访问外部类的静态成员和静态方法,包括了私有的静态成员和方法。

  生成静态内部类对象的方式为:

  OuterClass.InnerClass inner = new OuterClass.InnerClass();

  静态内部类使用代码:


  
  1. 静态内部类使用测试
  2. package com.learnjava.innerclass;
  3. class StaticInner
  4. {
  5. private static int a = 4;
  6. // 静态内部类
  7. public static class Inner
  8. {
  9. public void test()
  10. {
  11. // 静态内部类可以访问外部类的静态成员
  12. // 并且它只能访问静态的
  13. System.out.println(a);
  14. }
  15. }
  16. }
  17. public class StaticInnerClassTest
  18. {
  19. public static void main(String[] args)
  20. {
  21. StaticInner.Inner inner = new StaticInner.Inner();
  22. inner.test();
  23. }
  24. }

成员内部类Member Inner Class

  成员内部类也是定义在另一个类中,但是定义时不用static修饰。

  成员内部类和静态内部类可以类比为非静态的成员变量和静态的成员变量。

  成员内部类就像一个实例变量。

  它可以访问它的外部类的所有成员变量和方法,不管是静态的还是非静态的都可以

  在外部类里面创建成员内部类的实例:

  this.new Innerclass();

  在外部类之外创建内部类的实例:

  (new Outerclass()).new Innerclass();

  在内部类里访问外部类的成员:

  Outerclass.this.member

  详情见代码例子:

成员内部类使用测试


  
  1. package com.learnjava.innerclass;
  2. class MemberInner
  3. {
  4. private int d = 1;
  5. private int a = 2;
  6. // 定义一个成员内部类
  7. public class Inner2
  8. {
  9. private int a = 8;
  10. public void doSomething()
  11. {
  12. // 直接访问外部类对象
  13. System.out.println(d);
  14. System.out.println(a);// 直接访问a,则访问的是内部类里的a
  15. // 如何访问到外部类里的a呢?
  16. System.out.println(MemberInner.this.a);
  17. }
  18. }
  19. }
  20. public class MemberInnerClassTest
  21. {
  22. public static void main(String[] args)
  23. {
  24. // 创建成员内部类的对象
  25. // 需要先创建外部类的实例
  26. MemberInner.Inner2 inner = new MemberInner().new Inner2();
  27. inner.doSomething();
  28. }
  29. }

局部内部类Local Inner Class

  局部内部类定义在方法中,比方法的范围还小。是内部类中最少用到的一种类型。

  像局部变量一样,不能被public, protected, private和static修饰。

  只能访问方法中定义的final类型的局部变量。

  局部内部类在方法中定义,所以只能在方法中使用,即只能在方法当中生成局部内部类的实例并且调用其方法。


  
  1. 成员内部类使用测试
  2. package com.learnjava.innerclass;
  3. class LocalInner
  4. {
  5. int a = 1;
  6. public void doSomething()
  7. {
  8. int b = 2;
  9. final int c = 3;
  10. // 定义一个局部内部类
  11. class Inner3
  12. {
  13. public void test()
  14. {
  15. System.out.println("Hello World");
  16. System.out.println(a);
  17. // 不可以访问非final的局部变量
  18. // error: Cannot refer to a non-final variable b inside an inner
  19. // class defined in a different method
  20. // System.out.println(b);
  21. // 可以访问final变量
  22. System.out.println(c);
  23. }
  24. }
  25. // 创建局部内部类的实例并调用方法
  26. new Inner3().test();
  27. }
  28. }
  29. public class LocalInnerClassTest
  30. {
  31. public static void main(String[] args)
  32. {
  33. // 创建外部类对象
  34. LocalInner inner = new LocalInner();
  35. // 调用外部类的方法
  36. inner.doSomething();
  37. }
  38. }

匿名内部类Anonymous Inner Class

  匿名内部类就是没有名字的局部内部类,不使用关键字class, extends, implements, 没有构造方法。

  匿名内部类隐式地继承了一个父类或者实现了一个接口

  匿名内部类使用得比较多,通常是作为一个方法参数。


  
  1. 匿名内部类使用测试
  2. package com.learnjava.innerclass;
  3. import java.util.Date;
  4. public class AnonymouseInnerClass
  5. {
  6. @SuppressWarnings("deprecation")
  7. public String getDate(Date date)
  8. {
  9. return date.toLocaleString();
  10. }
  11. public static void main(String[] args)
  12. {
  13. AnonymouseInnerClass test = new AnonymouseInnerClass();
  14. // 打印日期:
  15. String str = test.getDate(new Date());
  16. System.out.println(str);
  17. System.out.println("----------------");
  18. // 使用匿名内部类
  19. String str2 = test.getDate(new Date()
  20. {
  21. });// 使用了花括号,但是不填入内容,执行结果和上面的完全一致
  22. // 生成了一个继承了Date类的子类的对象
  23. System.out.println(str2);
  24. System.out.println("----------------");
  25. // 使用匿名内部类,并且重写父类中的方法
  26. String str3 = test.getDate(new Date()
  27. {
  28. // 重写父类中的方法
  29. @Override
  30. @Deprecated
  31. public String toLocaleString()
  32. {
  33. return "Hello: " + super.toLocaleString();
  34. }
  35. });
  36. System.out.println(str3);
  37. }
  38. }

生成的.class文件中,匿名类会生成OuterClass$1.class文件,数字根据是第几个匿名类而类推。

  Swing中使用内部类的例子如下:


  
  1. Swing中使用匿名内部类
  2. package com.learnjava.innerclass;
  3. import java.awt.event.ActionEvent;
  4. import java.awt.event.ActionListener;
  5. import java.awt.event.WindowAdapter;
  6. import java.awt.event.WindowEvent;
  7. import javax.swing.JButton;
  8. import javax.swing.JFrame;
  9. public class SwingTest
  10. {
  11. public static void main(String[] args)
  12. {
  13. JFrame frame = new JFrame("JFrame");
  14. JButton button = new JButton("JButton");
  15. button.addActionListener(new ActionListener()
  16. {
  17. // new出来一个实现了ActionListener接口的类的实例
  18. @Override
  19. public void actionPerformed(ActionEvent arg0)
  20. {
  21. System.out.println("Hello World");
  22. }
  23. });
  24. //加入按钮
  25. frame.getContentPane().add(button);
  26. //设置关闭行为
  27. frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  28. frame.setSize(200, 200);
  29. frame.addWindowListener(new WindowAdapter()
  30. {
  31. //也可以使用继承了适配器类的匿名内部类
  32. @Override
  33. public void windowClosing(WindowEvent e)
  34. {
  35. System.out.println("Closing");
  36. System.exit(0);
  37. }
  38. });
  39. frame.setVisible(true);
  40. }
  41. }





文章来源: brucelong.blog.csdn.net,作者:Bruce小鬼,版权归原作者所有,如需转载,请联系作者。

原文链接:brucelong.blog.csdn.net/article/details/79995654

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。