JAVA内部类 (成员内部类、局部内部类、匿名内部类、静态内部类、内部类的继承))

来源:互联网 发布:科普斯怎么编程 编辑:程序博客网 时间:2024/05/16 07:44

成员内部类
1.成员内部类简介

<code class="hljs java has-numbering"><span class="hljs-keyword">package</span> cn.com.inner;<span class="hljs-javadoc">/** * 成员内部类<br> * 使用方式:OuterClass.InnerClass *<span class="hljs-javadoctag"> @author</span> wutz * */</span><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">OuterClass</span> {</span>       <span class="hljs-comment">//外部类</span>    InnerClass inner = <span class="hljs-keyword">new</span> InnerClass();    <span class="hljs-keyword">private</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">InnerClass</span>{</span>       <span class="hljs-comment">//内部类</span>        <span class="hljs-keyword">int</span> y = <span class="hljs-number">0</span>;                  <span class="hljs-comment">//内部类成员变量</span>        InnerClass(){               <span class="hljs-comment">//内部类构造函数</span>        }                       <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">innerFunction</span>(){    <span class="hljs-comment">//内部类成员函数</span>            System.out.println(<span class="hljs-string">"调用内部类的方法"</span>);         }    }    <span class="hljs-keyword">public</span> InnerClass <span class="hljs-title">getInsatnceOfInnerClass</span>(){   <span class="hljs-comment">//外部类操作内部类的属性</span>        <span class="hljs-comment">//y = 4;</span>        inner.y = <span class="hljs-number">100</span>;        inner.innerFunction();        <span class="hljs-keyword">return</span> inner;    }    <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">main</span>(String[] args) {        OuterClass outer = <span class="hljs-keyword">new</span> OuterClass();        OuterClass.InnerClass inner1 = outer.getInsatnceOfInnerClass();        System.out.println(inner1.y);        System.out.println(<span class="hljs-string">"********************"</span>);        OuterClass.InnerClass inner2 = outer.<span class="hljs-keyword">new</span> InnerClass();        System.out.println(inner2.y);        inner2.innerFunction();    }}</code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li><li>30</li><li>31</li><li>32</li><li>33</li><li>34</li><li>35</li><li>36</li></ul>
<code class="hljs markdown has-numbering">console:调用内部类的方法100<span class="hljs-strong">*****</span><span class="hljs-strong">*****</span><span class="hljs-strong">*****</span><span class="hljs-strong">*****</span>0调用内部类的方法</code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li></ul>

2.使用this关键字获取内部类与外部类的引用

<code class="hljs java has-numbering"><span class="hljs-keyword">package</span> cn.com.inner;<span class="hljs-javadoc">/** * 通过this获取外部类内部类的引用 *<span class="hljs-javadoctag"> @author</span> wutz * */</span><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">TheSameName</span> {</span>    <span class="hljs-keyword">private</span> <span class="hljs-keyword">int</span> x;    <span class="hljs-keyword">private</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Inner</span>{</span>        <span class="hljs-keyword">private</span> <span class="hljs-keyword">int</span> x = <span class="hljs-number">9</span>;        <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">doit</span>(<span class="hljs-keyword">int</span> x){            x++;                    <span class="hljs-comment">//调用的是形参x</span>            System.out.println(x);            <span class="hljs-keyword">this</span>.x++;               <span class="hljs-comment">//调用的是内部类x</span>            System.out.println(<span class="hljs-keyword">this</span>.x);            TheSameName.<span class="hljs-keyword">this</span>.x++;   <span class="hljs-comment">//调用的是外部类x</span>            System.out.println(TheSameName.<span class="hljs-keyword">this</span>.x);        }    }    <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">main</span>(String[] args) {        TheSameName outClass = <span class="hljs-keyword">new</span> TheSameName();        TheSameName.Inner inner = outClass.<span class="hljs-keyword">new</span> Inner();        inner.doit(<span class="hljs-number">100</span>);    }}</code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li></ul>
<code class="hljs avrasm has-numbering"><span class="hljs-label">console:</span><span class="hljs-number">101</span><span class="hljs-number">10</span><span class="hljs-number">1</span></code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li></ul>

局部内部类
局部内部类是指在类的方法中定义内部类,它的作用范围也是在这个方法体内

<code class="hljs java has-numbering"><span class="hljs-keyword">package</span> cn.com.inner;<span class="hljs-javadoc">/** * 局部内部类<br> * 定义在方法内的类,作用方法仅限该方法 *<span class="hljs-javadoctag"> @author</span> wutz * */</span><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">SellOutClass</span> {</span>    <span class="hljs-keyword">private</span> String name;    <span class="hljs-keyword">public</span> <span class="hljs-title">SellOutClass</span>(){        name = <span class="hljs-string">"苹果"</span>;    }    <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">sell</span>(){        class Apple{            <span class="hljs-keyword">int</span> innerPrice = <span class="hljs-number">0</span>;            <span class="hljs-keyword">public</span> <span class="hljs-title">Apple</span>(<span class="hljs-keyword">int</span> price){                innerPrice = price;            }            <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">price</span>(){                System.out.println(<span class="hljs-string">"现在开始销售:"</span>+name);                System.out.println(<span class="hljs-string">"价格:"</span>+innerPrice);            }        }        Apple apple = <span class="hljs-keyword">new</span> Apple(<span class="hljs-number">100</span>);        apple.price();    }    <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">main</span>(String[] args) {        SellOutClass outClass = <span class="hljs-keyword">new</span> SellOutClass();        outClass.sell();    }}</code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li><li>30</li><li>31</li><li>32</li><li>33</li><li>34</li><li>35</li><li>36</li><li>37</li></ul>
<code class="hljs css has-numbering"><span class="hljs-tag">console</span>:现在开始销售:苹果价格<span class="hljs-pseudo">:100</span></code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li></ul>

匿名内部类
在编写程序代码时,不一定要给内部类取一个名字,可以直接以对象名来代替。匿名内部类的所有实现代码都需要在大括号之间进行编写。

<code class="hljs java has-numbering"><span class="hljs-keyword">package</span> cn.com.inner;<span class="hljs-javadoc">/** * 服务于匿名内部类 *<span class="hljs-javadoctag"> @author</span> wutz * */</span><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">interface</span> <span class="hljs-title">OuterString</span> {</span>    <span class="hljs-keyword">public</span> String <span class="hljs-title">filterBlankChar</span>();}</code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li></ul>
<code class="hljs java has-numbering"><span class="hljs-keyword">package</span> cn.com.inner;<span class="hljs-javadoc">/** * 匿名内部类 *<span class="hljs-javadoctag"> @author</span> wutz * */</span><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">OutString</span>{</span>    <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">main</span>(String[] args) {        <span class="hljs-keyword">final</span> String sourceStr = <span class="hljs-string">"h e l l o w o r d"</span>;        OuterString outString = <span class="hljs-keyword">new</span> OuterString() {            <span class="hljs-annotation">@Override</span>            <span class="hljs-keyword">public</span> String <span class="hljs-title">filterBlankChar</span>() {                <span class="hljs-keyword">return</span> sourceStr.replaceAll(<span class="hljs-string">" "</span>,<span class="hljs-string">""</span>);            }        };        System.out.println(<span class="hljs-string">"源字符串:"</span> + sourceStr);        System.out.println(<span class="hljs-string">"转换后的字符串:"</span> +outString.filterBlankChar());    }}</code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li></ul>
<code class="hljs avrasm has-numbering"><span class="hljs-label">console:</span>源字符串:h e l l o w o r d转换后的字符串:helloword</code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li></ul>

静态内部类
在内部类前添加修饰符static,这个内部类就变成静态内部类。一个静态内部类中可以声明static成员,但是在非静态内部类中不可以声明静态成员。静态内部类有一个最大的特点,就是不可以使用外部类的非静态成员。所以静态内部类在程序开发中比较少见。

静态内部类具有以下两个特点:
1.创建静态内部类的对象,不需要先创建外部类对象。
2.不能从静态内部类的对象中访问非静态外部类的对象。

<code class="hljs java has-numbering"><span class="hljs-keyword">package</span> cn.com.inner;<span class="hljs-javadoc">/** * 静态内部类1 *<span class="hljs-javadoctag"> @author</span> wutz * */</span><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">StaticInnerClass</span> {</span>    <span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">int</span> x = <span class="hljs-number">0</span>;    <span class="hljs-keyword">static</span> class InnerClass{        <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> doInner() {            System.out.println(x);        }    }    <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">main</span>(String[] args) {        StaticInnerClass.InnerClass b = <span class="hljs-keyword">new</span> StaticInnerClass.InnerClass();        b.doInner();    }}</code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li></ul>
<code class="hljs java has-numbering"><span class="hljs-keyword">package</span> cn.com.inner;<span class="hljs-javadoc">/** * 静态内部类2 *<span class="hljs-javadoctag"> @author</span> wutz * */</span><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">StaticInnerClass</span> {</span>    <span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">int</span> x = <span class="hljs-number">0</span>;    <span class="hljs-keyword">static</span> class InnerClass{        <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> doInner() {            System.out.println(x);        }        <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">main</span>(String[] args) {            doInner();        }    }}</code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li></ul>

内部类的继承

<code class="hljs cs has-numbering">package cn.com.inner;<span class="hljs-keyword">public</span> <span class="hljs-keyword">class</span> Outer {    class Inner{    }}</code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li></ul>
<code class="hljs java has-numbering"><span class="hljs-keyword">package</span> cn.com.inner;<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">InnerExtend</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Outer</span>.<span class="hljs-title">Inner</span>{</span>    <span class="hljs-keyword">public</span> <span class="hljs-title">InnerExtend</span>(Outer outer) {        outer.<span class="hljs-keyword">super</span>();    }}</code>
0 0
原创粉丝点击