博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java学习笔记(26)——Java内部类(二)
阅读量:6159 次
发布时间:2019-06-21

本文共 2055 字,大约阅读时间需要 6 分钟。

  hot3.png

三.内部类的使用场景和好处

  为什么在Java中需要内部类?总结一下主要有以下四点:

  1.每个内部类都能独立的继承一个接口的实现,所以无论外部类是否已经继承了某个(接口的)实现,对于内部类都没有影响。内部类使得多继承的解决方案变得完整,

  2.方便将存在一定逻辑关系的类组织在一起,又可以对外界隐藏。

  3.方便编写事件驱动程序

  4.方便编写线程代码

  个人觉得第一点是最重要的原因之一,内部类的存在使得Java的多继承机制变得更加完善。

四.常见的与内部类相关的笔试面试题

 1.根据注释填写(1),(2),(3)处的代码

public class Test{    public static void main(String[] args){           // 初始化Bean1           (1)           bean1.I++;           // 初始化Bean2           (2)           bean2.J++;           //初始化Bean3           (3)           bean3.k++;    }    class Bean1{           public int I = 0;    }     static class Bean2{           public int J = 0;    }} class Bean{    class Bean3{           public int k = 0;    }}

  从前面可知,对于成员内部类,必须先产生外部类的实例化对象,才能产生内部类的实例化对象。而静态内部类不用产生外部类的实例化对象即可产生内部类的实例化对象。

  创建静态内部类对象的一般形式为:  外部类类名.内部类类名 xxx = new 外部类类名.内部类类名()

  创建成员内部类对象的一般形式为:  外部类类名.内部类类名 xxx = 外部类对象名.new 内部类类名()

  因此,(1),(2),(3)处的代码分别为:

Test test = new Test();      Test.Bean1 bean1 = test.new Bean1();
Test.Bean2 b2 = new Test.Bean2();
Bean bean = new Bean();     Bean.Bean3 bean3 =  bean.new Bean3();

2.下面这段代码的输出结果是什么?

public class Test {    public static void main(String[] args)  {        Outter outter = new Outter();        outter.new Inner().print();    }}  class Outter{    private int a = 1;    class Inner {        private int a = 2;        public void print() {            int a = 3;            System.out.println("局部变量:" + a);            System.out.println("内部类变量:" + this.a);            System.out.println("外部类变量:" + Outter.this.a);        }    }}
321

   最后补充一点知识:关于成员内部类的继承问题。一般来说,内部类是很少用来作为继承用的。但是当用来继承的话,要注意两点:

  1)成员内部类的引用方式必须为 Outter.Inner.

  2)构造器中必须有指向外部类对象的引用,并通过这个引用调用super()。这段代码摘自《Java编程思想》

class WithInner {    class Inner{             }}class InheritInner extends WithInner.Inner {          // InheritInner() 是不能通过编译的,一定要加上形参    InheritInner(WithInner wi) {        wi.super(); //必须有这句调用    }      public static void main(String[] args) {        WithInner wi = new WithInner();        InheritInner obj = new InheritInner(wi);    }}

转载于:https://my.oschina.net/jewill/blog/410212

你可能感兴趣的文章
linux开源万岁
查看>>
linux/CentOS6忘记root密码解决办法
查看>>
25个常用的Linux iptables规则
查看>>
集中管理系统--puppet
查看>>
分布式事务最终一致性常用方案
查看>>
Exchange 2013 PowerShell配置文件
查看>>
JavaAPI详解系列(1):String类(1)
查看>>
HTML条件注释判断IE<!--[if IE]><!--[if lt IE 9]>
查看>>
发布和逸出-构造过程中使this引用逸出
查看>>
使用SanLock建立简单的HA服务
查看>>
Subversion使用Redmine帐户验证简单应用、高级应用以及优化
查看>>
Javascript Ajax 异步请求
查看>>
DBCP连接池
查看>>
cannot run programing "db2"
查看>>
mysql做主从relay-log问题
查看>>
Docker镜像与容器命令
查看>>
批量删除oracle中以相同类型字母开头的表
查看>>
Java基础学习总结(4)——对象转型
查看>>
BZOJ3239Discrete Logging——BSGS
查看>>
SpringMVC权限管理
查看>>