10-05 Java 内部类概述和讲解
内部类的概述
举例:在类A中定义了一个类B,类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 style="color: #000000;"> System.out.println(num);
} <span style="color: #0000ff;">class<span style="color: #000000;"> InnerClassDemo {
} 内部类位置 成员位置:在成员位置定义的类,被称为成员内部类。
<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;">class<span style="color: #000000;"> InnerClassDemo2 {
} 如何直接访问成员内部类的成员
num = 10
</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()方法
} 成员内部类的修饰符: 案例:我有一个人(人有身体,身体内有心脏。)
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 style="color: #000000;"> System.out.println(num2);
<span style="color: #000000;"> <span style="color: #0000ff;">class<span style="color: #000000;"> InnerClassDemo4 {
<span style="color: #000000;"> Outer.Inner.show2(); ? 内部类和外部类没有继承关系。 注意:
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(); } } ? 局部位置的内部类访问局部变量问题
注意事项:
局部内部类访问局部变量的注意事项?
B:为什么呢?
局部变量是随着方法的调用而调用,随着调用完毕而消失。
而堆内存Inner的内容并不会立即消失。所以,我们加final修饰。
加入final修饰后,这个变量就成了常量。既然是常量。你消失了。
我在内存中存储的是数据20,所以,我还是有数据在使用。
num = 10
</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 style="color: #ff0000;"> 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: #000000;"> i.show2(); <span style="color: #0000ff;">class<span style="color: #000000;"> InnerClassDemo6 { 匿名内部类在开发中的使用
<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<span style="color: #000000;"> InnerClassTest2 {
<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 { ? (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |