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

成员内部类
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>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值