内部类的概述@H_301_2@
内部的访问特点:
<span style="color: #ff0000;">A:内部类可以直接访问外部类的成员,<a href="https://www.jb51.cc/tag/baokuo/" target="_blank" class="keywords">包括</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;">class</span><span style="color: #000000;"> Inner {
</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> show() {
</span><span style="color: #008000;">//</span><span style="color: #008000;">内部类可以直接访问外部类的成员,<a href="https://www.jb51.cc/tag/baokuo/" target="_blank" class="keywords">包括</a>私有。</span>
<span style="color: #000000;"> System.out.println(num);
}
}
</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> method() {
</span><span style="color: #008000;">//</span><span style="color: #008000;">找不到符号
</span><span style="color: #008000;">//</span><span style="color: #008000;">show();
</span><span style="color: #008000;">//</span><span style="color: #008000;">外部类要访问内部类的成员,必须创建对象。</span>
Inner i = <span style="color: #0000ff;">new</span><span style="color: #000000;"> 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) {
}
}
内部类位置@H_301_2@
成员位置:在成员位置定义的类,被称为成员内部类。
<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;">//</span><span style="color: #008000;">成员位置</span>
<span style="color: #008000;">/*</span><span style="color: #008000;">
class Inner {
}
</span><span style="color: #008000;">*/</span>
<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> method() {
</span><span style="color: #008000;">//</span><span style="color: #008000;">局部位置</span>
<span style="color: #0000ff;">class</span><span style="color: #000000;"> 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) {
}
}
如何直接访问成员内部类的成员@H_301_2@
</span><span style="color: #ff0000;">class</span><span style="color: #000000;"><span style="color: #ff0000;"> Inner</span> {
</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> 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;">//</span><span style="color: #008000;">格式:外部类名.内部类名 对象名 = 外部类对象.内部类对象;</span>
<span style="color: #ff0000;">Outer.Inner oi = new Outer().new</span><span style="color: #000000;"><span style="color: #ff0000;"> Inner();</span>
oi.show();
}
}
成员内部类的修饰符:@H_301_2@
案例:我有一个人(人有身体,身体内有心脏。)
class Body {
<span style="color: #ff0000;"> private</span> class Heart {
public void operator() {
System.out.println("心脏搭桥");
}
}
public void method() {
<span style="color: #ff0000;">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;">//</span><span style="color: #008000;">内部类用静态修饰是因为内部类可以看出是外部类的成员</span>
<span style="color: #0000ff;">public</span><span style="color: #ff0000;"> static </span><span style="color: #0000ff;">class</span><span style="color: #000000;"> Inner {
</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> show() {
</span><span style="color: #008000;">//</span><span style="color: #008000;">System.out.println(num); </span>
<span style="color: #000000;"> System.out.println(num2);
}
</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> show2() {
</span><span style="color: #008000;">//</span><span style="color: #008000;">System.out.println(num)<span style="color: #ff0000;">;</span></span><span style="color: #ff0000;">//报错。静态内部类访问的外部类数据必须用静态修饰。</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;">//成员内部类被静态修饰后的访问方式是:
//格式:外部类名.内部类名 对象名 = new 外部类名.内部类名();</span>
Outer.Inner oi = <span style="color: #0000ff;">new</span><span style="color: #000000;"> Outer.Inner();
oi.show();
oi.show2();
</span><span style="color: #ff0000;">//show2()的另一种<a href="https://www.jb51.cc/tag/diaoyong/" target="_blank" class="keywords">调用</a>方式。因为静态<a href="https://www.jb51.cc/tag/fangfa/" target="_blank" class="keywords">方法</a>,可以通过类名<a href="https://www.jb51.cc/tag/diaoyong/" target="_blank" class="keywords">调用</a>。</span>
<span style="color: #000000;"> Outer.Inner.show2();
}
}
内部类和外部类没有继承关系。@H_301_2@
通过外部类名限定this对象@H_301_2@
注意:
1:内部类和外部类没有继承关系。
<span style="color: #ff0000;"> 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();
}
}
局部位置的内部类访问局部变量问题@H_301_2@
</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> method() {
</span><span style="color: #008000;">//</span><span style="color: #008000;">int num2 = 20;</span>
<span style="color: #ff0000;">final int num2 = 20; //局部内部类访问局部变量必须用final修饰</span>
<span style="color: #0000ff;">class</span><span style="color: #000000;"> Inner {
</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> show() {
System.out.println(num);
</span><span style="color: #008000;">//</span><span style="color: #008000;">从内部类中访问本地变量num2; 需要被声明为最终类型</span>
System.out.println(<span style="color: #ff0000;">num2</span>);<span style="color: #008000;">//</span><span style="color: #008000;">20</span>
<span style="color: #000000;"> }
}
</span><span style="color: #008000;">//</span><span style="color: #008000;">System.out.println(num2);</span>
<span style="color: #ff0000;">
Inner i = new
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 类名或者接口名(){
重写<a href="https://www.jb51.cc/tag/fangfa/" target="_blank" class="keywords">方法</a>;
}
本质是什么呢?
是一个继承了该类或者实现了该接口的子类的匿名对象。
<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;">new</span> Inter() { <span style="color: #008000;">//</span><span style="color: #008000;">多态</span>
<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> show() {
System.out.println(</span>"show"<span style="color: #000000;">);
}
</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> show2() {
System.out.println(</span>"show2"<span style="color: #000000;">);
}
};
i.show();</span><span style="color: #008000;">//</span><span style="color: #008000;">是一个继承了该类或者实现了该接口的子类的匿名对象。所以可以<a href="https://www.jb51.cc/tag/diaoyong/" target="_blank" class="keywords">调用</a><a href="https://www.jb51.cc/tag/fangfa/" target="_blank" class="keywords">方法</a></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();
}
}
匿名内部类在开发中的使用@H_301_2@
<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;">//</span><span style="color: #008000;">匿名内部类在开发中的使用
</span><span style="color: #008000;">//</span><span style="color: #008000;">匿名内部类的本质是继承类或者实现了接口的子类匿名对象
</span><span style="color: #008000;">//</span><span style="color: #008000;">用完一次就消失</span>
Person ss = <span style="color: #0000ff;">new</span><span style="color: #000000;"> Person(){
</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> study() {
System.out.println(</span>"好好学习,天天向上"<span style="color: #000000;">);
}
};
pd.method(ss);
</span><span style="color: #008000;">//</span><span style="color: #008000;"> pd.method(new Person(){
</span><span style="color: #008000;">//</span><span style="color: #008000;"> public void study() {
</span><span style="color: #008000;">//</span><span style="color: #008000;"> System.out.println("好好学习,天天向上");
</span><span style="color: #008000;">//</span><span style="color: #008000;"> }
</span><span style="color: #008000;">//</span><span style="color: #008000;"> });</span>
<span style="color: #000000;"> }
}
案例
<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;">
}
}
原文链接:https://www.f2er.com/java/403339.html