加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

10-05 Java 内部类概述和讲解

发布时间:2020-12-14 06:09:27 所属栏目:Java 来源:网络整理
导读:内部类的概述 举例:在类A中定义了一个类B,类B就是内部类。 内部的访问特点: span style="color: #ff0000;"gt;A:内部类可以直接访问外部类的成员,包括私有。 B:外部类要访问内部类的成员,必须创建对象。 span style="color: #008000;"*/ span style="col

内部类的概述

举例:在类A中定义了一个类B,类B就是内部类。
内部的访问特点:
    <span style="color: #ff0000;"&gt;A:内部类可以直接访问外部类的成员,包括私有。
    B:外部类要访问内部类的成员,必须创建对象。

<span style="color: #008000;">*/
<span style="color: #0000ff;">class<span style="color: #000000;"> Outer {
<span style="color: #0000ff;">private <span style="color: #0000ff;">int num = 10<span style="color: #000000;">;

</span><span style="color: #0000ff;"&gt;class</span><span style="color: #000000;"&gt; Inner {
    </span><span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;void</span><span style="color: #000000;"&gt; show() {
        </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt;内部类可以直接访问外部类的成员,包括私有。</span>

<span style="color: #000000;"> System.out.println(num);
}
}

</span><span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;void</span><span style="color: #000000;"&gt; method() {
    </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt;找不到符号
    </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt;show();

    </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt;外部类要访问内部类的成员,必须创建对象。</span>
    Inner i = <span style="color: #0000ff;"&gt;new</span><span style="color: #000000;"&gt; Inner();
    i.show();
}

}

<span style="color: #0000ff;">class<span style="color: #000000;"> InnerClassDemo {
<span style="color: #0000ff;">public <span style="color: #0000ff;">static <span style="color: #0000ff;">void<span style="color: #000000;"> main(String[] args) {

}

}

内部类位置

成员位置:在成员位置定义的类,被称为成员内部类。

<span style="color: #008000;">*/
<span style="color: #0000ff;">class<span style="color: #000000;"> Outer {
<span style="color: #0000ff;">private <span style="color: #0000ff;">int num = 10<span style="color: #000000;">;

</span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt;成员位置</span>
<span style="color: #008000;"&gt;/*</span><span style="color: #008000;"&gt;
class Inner {

}
</span><span style="color: #008000;"&gt;*/</span>


<span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;void</span><span style="color: #000000;"&gt; method() {
    </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt;局部位置</span>
    <span style="color: #0000ff;"&gt;class</span><span style="color: #000000;"&gt; Inner {

    }
}

}

<span style="color: #0000ff;">class<span style="color: #000000;"> InnerClassDemo2 {
<span style="color: #0000ff;">public <span style="color: #0000ff;">static <span style="color: #0000ff;">void<span style="color: #000000;"> main(String[] args) {

}

}

如何直接访问成员内部类的成员

num = 10</span><span style="color: #ff0000;"&gt;class</span><span style="color: #000000;"&gt;<span style="color: #ff0000;"&gt; Inner</span> { </span><span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;void</span><span style="color: #000000;"&gt; show() { System.out.println(num); } }

}

<span style="color: #0000ff;">class<span style="color: #000000;"> InnerClassDemo3 {
<span style="color: #0000ff;">public <span style="color: #0000ff;">static <span style="color: #0000ff;">void<span style="color: #000000;"> main(String[] args) {
<span style="color: #008000;">//<span style="color: #008000;">需求:我要访问Inner类的show()方法

    </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt;格式:外部类名.内部类名 对象名 = 外部类对象.内部类对象;</span>
    <span style="color: #ff0000;"&gt;Outer.Inner oi = new Outer().new</span><span style="color: #000000;"&gt;<span style="color: #ff0000;"&gt; Inner();</span>
    oi.show();
}

}

成员内部类的修饰符:

案例:我有一个人(人有身体,身体内有心脏。) class Body { <span style="color: #ff0000;"&gt; private</span> class Heart { public void operator() { System.out.println("心脏搭桥"); } } public void method() { <span style="color: #ff0000;"&gt;if(如果你是外科医生) { Heart h = new Heart(); h.operator(); }</span> } } 按照我们刚才的讲解,来使用一下 Body.Heart bh = new Body().new Heart(); bh.operator(); //加了private后,就不能被访问了,那么,怎么玩呢? Body b = new Body(); b.method();

<span style="color: #008000;">*/
<span style="color: #0000ff;">class<span style="color: #000000;"> Outer {
<span style="color: #0000ff;">private <span style="color: #0000ff;">int num = 10<span style="color: #000000;">;
<span style="color: #0000ff;">private <span style="color: #ff0000;">static <span style="color: #0000ff;">int num2 = 100<span style="color: #000000;">;

</span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt;内部类用静态修饰是因为内部类可以看出是外部类的成员</span>
<span style="color: #0000ff;"&gt;public</span><span style="color: #ff0000;"&gt; static </span><span style="color: #0000ff;"&gt;class</span><span style="color: #000000;"&gt; Inner {
    </span><span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;void</span><span style="color: #000000;"&gt; show() {
        </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt;System.out.println(num);            </span>

<span style="color: #000000;"> System.out.println(num2);
}

    </span><span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;static</span> <span style="color: #0000ff;"&gt;void</span><span style="color: #000000;"&gt; show2() {
        </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt;System.out.println(num)<span style="color: #ff0000;"&gt;;</span></span><span style="color: #ff0000;"&gt;//报错。静态内部类访问的外部类数据必须用静态修饰。</span>

<span style="color: #000000;">
System.out.println(num2);
}
}
}

<span style="color: #0000ff;">class<span style="color: #000000;"> InnerClassDemo4 {
<span style="color: #0000ff;">public <span style="color: #0000ff;">static <span style="color: #0000ff;">void<span style="color: #000000;"> main(String[] args) {
<span style="color: #008000;">//<span style="color: #008000;">使用内部类
<span style="color: #008000;">//<span style="color: #ff0000;"> 限定的新静态类
<span style="color: #008000;">//<span style="color: #008000;">Outer.Inner oi = new Outer().new Inner();<span style="color: #ff0000;">//这个访问方式错误
<span style="color: #008000;">//<span style="color: #008000;">oi.show();
<span style="color: #008000;">//<span style="color: #008000;">oi.show2();

    </span><span style="color: #ff0000;"&gt;//成员内部类被静态修饰后的访问方式是:
    //格式:外部类名.内部类名 对象名 = new 外部类名.内部类名();</span>
    Outer.Inner oi = <span style="color: #0000ff;"&gt;new</span><span style="color: #000000;"&gt; Outer.Inner();
    oi.show();
    oi.show2();

    </span><span style="color: #ff0000;"&gt;//show2()的另一种调用方式。因为静态方法,可以通过类名调用。</span>

<span style="color: #000000;"> Outer.Inner.show2();
}
}

?

内部类和外部类没有继承关系。
通过外部类名限定this对象

注意: 1:内部类和外部类没有继承关系。 <span style="color: #ff0000;"&gt; 2:通过外部类名限定this对象 Outer.this

<span style="color: #008000;">*/
<span style="color: #0000ff;">class<span style="color: #000000;"> Outer {
<span style="color: #0000ff;">public <span style="color: #0000ff;">int num = 10<span style="color: #000000;">;
<span style="color: #0000ff;">class<span style="color: #000000;"> Inner {
<span style="color: #0000ff;">public <span style="color: #0000ff;">int num = 20<span style="color: #000000;">;
<span style="color: #0000ff;">public <span style="color: #0000ff;">void<span style="color: #000000;"> show() {
<span style="color: #0000ff;">int num = 30<span style="color: #000000;">;
System.out.println(num);
System.out.println(<span style="color: #0000ff;">this<span style="color: #000000;">.num);
<span style="color: #008000;">//<span style="color: #008000;">System.out.println(new Outer().num);
System.out.println(<span style="color: #ff0000;">Outer.this<span style="color: #000000;"><span style="color: #ff0000;">.num);
}
}
}
<span style="color: #0000ff;">class<span style="color: #000000;"> InnerClassTest {
<span style="color: #0000ff;">public <span style="color: #0000ff;">static <span style="color: #0000ff;">void<span style="color: #000000;"> main(String[] args) {
Outer.Inner oi = <span style="color: #0000ff;">new Outer().<span style="color: #0000ff;">new<span style="color: #000000;"> Inner();
oi.show();
}
}

?

局部位置的内部类访问局部变量问题

注意事项: 局部内部类访问局部变量的注意事项? B:为什么呢? 局部变量是随着方法的调用而调用,随着调用完毕而消失。 而堆内存Inner的内容并不会立即消失。所以,我们加final修饰。 加入final修饰后,这个变量就成了常量。既然是常量。你消失了。 我在内存中存储的是数据20,所以,我还是有数据在使用。 num = 10</span><span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;void</span><span style="color: #000000;"&gt; method() { </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt;int num2 = 20;</span> <span style="color: #ff0000;"&gt;final int num2 = 20; //局部内部类访问局部变量必须用final修饰</span> <span style="color: #0000ff;"&gt;class</span><span style="color: #000000;"&gt; Inner { </span><span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;void</span><span style="color: #000000;"&gt; show() { System.out.println(num); </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt;从内部类中访问本地变量num2; 需要被声明为最终类型</span> System.out.println(<span style="color: #ff0000;"&gt;num2</span>);<span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt;20</span>

<span style="color: #000000;"> }
}

    </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt;System.out.println(num2);</span>

<span style="color: #ff0000;">
Inner i = new<span style="color: #000000;"><span style="color: #ff0000;"> Inner();
i.show();
}
}

<span style="color: #0000ff;">class<span style="color: #000000;"> InnerClassDemo5 {
<span style="color: #0000ff;">public <span style="color: #0000ff;">static <span style="color: #0000ff;">void<span style="color: #000000;"> main(String[] args) {
Outer o = <span style="color: #0000ff;">new<span style="color: #000000;"> Outer();
o.method();
}
}

?

匿名内部类格式,方法调用

前提:存在一个类或者接口 这里的类可以是具体类也可以是抽象类。 格式: new 类名或者接口名(){ 重写方法; } 本质是什么呢? 是一个继承了该类或者实现了该接口的子类的匿名对象。

<span style="color: #008000;">*/
<span style="color: #0000ff;">interface<span style="color: #000000;"> Inter {
<span style="color: #0000ff;">public <span style="color: #0000ff;">abstract <span style="color: #0000ff;">void<span style="color: #000000;"> show();
<span style="color: #0000ff;">public <span style="color: #0000ff;">abstract <span style="color: #0000ff;">void<span style="color: #000000;"> show2();
}

<span style="color: #0000ff;">class<span style="color: #000000;"> Outer {
<span style="color: #0000ff;">public <span style="color: #0000ff;">void<span style="color: #000000;"> method() {

    Inter i </span>= <span style="color: #0000ff;"&gt;new</span> Inter() { <span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt;多态</span>
        <span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;void</span><span style="color: #000000;"&gt; show() {
            System.out.println(</span>"show"<span style="color: #000000;"&gt;);
        }

        </span><span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;void</span><span style="color: #000000;"&gt; show2() {
            System.out.println(</span>"show2"<span style="color: #000000;"&gt;);
        }
    };

    i.show();</span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt;是一个继承了该类或者实现了该接口的子类的匿名对象。所以可以调用方法</span>

<span style="color: #000000;"> i.show2();
}
}

<span style="color: #0000ff;">class<span style="color: #000000;"> InnerClassDemo6 {
<span style="color: #0000ff;">public <span style="color: #0000ff;">static <span style="color: #0000ff;">void<span style="color: #000000;"> main(String[] args) {
Outer o = <span style="color: #0000ff;">new<span style="color: #000000;"> Outer();
o.method();
}
}

匿名内部类在开发中的使用

<span style="color: #0000ff;">class<span style="color: #000000;"> PersonDemo {
<span style="color: #008000;">//
<span style="color: #008000;">接口名作为形式参数
<span style="color: #008000;">//
<span style="color: #008000;">其实这里需要的不是接口,而是该接口的实现类的对象

<span style="color: #0000ff;">public
<span style="color: #0000ff;">void
<span style="color: #000000;"> method(Person p) {
p.study();
}
}

<span style="color: #008000;">//<span style="color: #008000;">实现类
<span style="color: #0000ff;">class Student <span style="color: #0000ff;">implements<span style="color: #000000;"> Person {
<span style="color: #0000ff;">public <span style="color: #0000ff;">void<span style="color: #000000;"> study() {
System.out.println("好好学习,天天向上"<span style="color: #000000;">);
}
}

<span style="color: #0000ff;">class<span style="color: #000000;"> InnerClassTest2 {
<span style="color: #0000ff;">public <span style="color: #0000ff;">static <span style="color: #0000ff;">void<span style="color: #000000;"> main(String[] args) {
<span style="color: #008000;">//<span style="color: #008000;">测试
PersonDemo pd = <span style="color: #0000ff;">new<span style="color: #000000;"> PersonDemo();
Person p = <span style="color: #0000ff;">new<span style="color: #000000;"> Student();
pd.method(p);
System.out.println("--------------------"<span style="color: #000000;">);

    </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt;匿名内部类在开发中的使用
    </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt;匿名内部类的本质是继承类或者实现了接口的子类匿名对象
    </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt;用完一次就消失</span>
    Person ss = <span style="color: #0000ff;"&gt;new</span><span style="color: #000000;"&gt; Person(){
        </span><span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;void</span><span style="color: #000000;"&gt; study() {
            System.out.println(</span>"好好学习,天天向上"<span style="color: #000000;"&gt;);
        }
    };

    pd.method(ss);

    </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; pd.method(new Person(){
        </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; public void study() {
            </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; System.out.println("好好学习,天天向上");
        </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; }
    </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; });</span>

<span style="color: #000000;"> }
}

案例

<span style="color: #0000ff;">class<span style="color: #000000;"> Outer {
<span style="color: #008000;">//
<span style="color: #008000;">补齐代码

<span style="color: #0000ff;">public
<span style="color: #0000ff;">static
<span style="color: #000000;"> Inter method() {
<span style="color: #008000;">//
<span style="color: #008000;">子类对象 -- 子类匿名对象

<span style="color: #0000ff;">return <span style="color: #0000ff;">new<span style="color: #000000;"> Inter() {
<span style="color: #0000ff;">public <span style="color: #0000ff;">void<span style="color: #000000;"> show() {
System.out.println("HelloWorld"<span style="color: #000000;">);
}
};
}
}

<span style="color: #0000ff;">class<span style="color: #000000;"> OuterDemo {
<span style="color: #0000ff;">public <span style="color: #0000ff;">static <span style="color: #0000ff;">void<span style="color: #000000;"> main(String[] args) {
Outer.method().show();
<span style="color: #008000;">/<span style="color: #008000;">
1:Outer.method()可以看出method()应该是Outer中的一个静态方法。
2:Outer.method().show()可以看出method()方法的返回值是一个对象。
又由于接口Inter中有一个show()方法,所以我认为method()方法的返回值类型是一个接口。
<span style="color: #008000;">
/<span style="color: #000000;">
}
}

?

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读