Java内部类种类解读

举报
芝麻粒儿 发表于 2021/08/04 23:06:44 2021/08/04
【摘要】 推荐资源站:https://zhimalier.com/ 内部类(nested classes)   面向对象程序设计中,可以在一个类的内部定义另一个类。 表现形式为4种:    1、静态内部类  2、成员内部类  3、局部内部类  4、匿名内部类 (重点) 内部类的优点:   内部类对象可以访...

推荐资源站:https://zhimalier.com/

内部类(nested classes)   面向对象程序设计中,可以在一个类的内部定义另一个类。
表现形式为4种:  
 1、静态内部类
 2、成员内部类
 3、局部内部类
 4、匿名内部类 (重点)
内部类的优点:
  内部类对象可以访问创建它的对象的实现,包括私有数据;
  内部类不为同一包的其他类所见,具有很好的封装性;
  使用内部类可以很方便的编写事件驱动程序;(例如android的图形界面编程采用事件驱动机制)
  匿名内部类可以方便的定义运行时回调;
  内部类可以方便的定义
内部类的共性:
  内部类仍然是一个独立的类,在编译之后内部类会编译成独立的.class文件,外部类的类名和$符号
  内部类不能用普通的方式访问。内部类是外部类的一个成员,因此内部类可以自由地访问外部类的成员变量,不管权限修饰符
  内部类声明成静态的,就不能随便的访问外部类的成员变凉了,外部类可通过类名. 访问内部类的静态成员
 

一、静态内部类

最简单的内部类形式、类定义时加上static关键字、不能和外部类有相同的名字
只可以访问外部类的静态成员和静态方法,包括了私有的静态成员和方法
简单理解为可以想其他静态成员一样,没有外部类对象时,也能访问它
生成静态内 部类对象的方式为:

OutClass.InClass  in=new OutClass.InClass();

        例代码


  
  1. class OuterClass{
  2. static class InClass{
  3. public void test(){
  4. //静态内部类可以访问外部类的静态成员
  5. //并且只能访问静态的
  6. System.out.println("方法");
  7. }
  8. }
  9. }
  10. class Test {
  11. public static void main(String[] args){
  12. OutClass.InClass in=new OutClass.InClass();
  13. in.test();
  14. }
  15. }


二、成员内部类

成员内部类和静态内部类类似非静态的成员变量和静态的成员变量
它可以访问它外部类的所有变量和方法
在外部类里面创建成员内部类的实例:
this.new Inclass();
在外部类之外创建内部类的实例:
(new Outclass()).new Inclass();
在内部类里访问外部类的成员:
Outclass.this.member
例代码


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

三、局部内部类(也称为方法内部类)

类定义在方法中,比方法的范围还小,只能在方法中使用,内部类最少用的一种
跟局部变量一样,不能被public、protected、private和static修饰
只能访问方法中funal类型的局部变量


四、匿名内部类

当一个类只用到一次时使用匿名内部类,它在定义后立即使用
不使用关键字class, extends, implements, 没有构造方法。
匿名内部类不能是public,protected,private,static  不能定义任何静态成员、静态方法
匿名内部类隐式地继承了一个父类或者实现了一个接口。
匿名内部类使用得比较多,通常是作为一个方法参数。
1、继承式的匿名内部类


  
  1. public class Car {
  2. public void drive(){
  3. System.out.println("a car!");
  4. }
  5. public static void main(String[] args) {
  6. Car car = new Car(){
  7. public void drive() {
  8. System.out.println("b car!");
  9. }
  10. };
  11. car.drive();
  12. }
  13. }

结果输出了:b car! Car引用变量不是引用Car对象,而是Car匿名子类的对象

2、接口式的匿名内部类。


  
  1. interface Vehicle {
  2. public void drive();
  3. }
  4. class Test{
  5. public static void main(String[] args) {
  6. Vehicle v = new Vehicle(){
  7. public void drive(){
  8. System.out.println(" a car!");
  9. }
  10. };
  11. v.drive();
  12. }
  13. }

上面的代码很怪,好像是在实例化一个接口。事实并非如此,接口式的匿名内部类是实现了一个接口的匿名类。而且只能实现一个接口。

3、参数式的匿名内部类。


  
  1. class Bar{
  2. void doStuff(Foo f){
  3. f.foo();
  4. }
  5. }
  6. interface Foo{
  7. void foo();
  8. }
  9. class Test{
  10. static void go(){
  11. Bar b = new Bar();
  12. b.doStuff(new Foo(){
  13. public void foo(){
  14. System.out.println("foofy");
  15. }
  16. });
  17. }
  18. }

 

 

文章来源: zhima.blog.csdn.net,作者:芝麻粒儿,版权归原作者所有,如需转载,请联系作者。

原文链接:zhima.blog.csdn.net/article/details/51935200

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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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