成员内部类
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>