您的位置:首页 > 编程语言 > Java开发

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

2016-09-14 04:59 579 查看
成员内部类
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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐