8.内部类概述和访问特点
A:内部类概述
B:内部类访问特点
a:内部类可以直接访问外部类的成员,包括私有。
b:外部类要访问内部类的成员,必须创建对象。
```java package com.briup.inner;
class Outer { int num = 30;
public class Inner {
public void function() {
System.out.println(num);
}
}
public void method() {
Inner inner = new Inner();
inner.function();
}
}
public class OuterTest { public static void main(String[] args) { Outer outer = new Outer(); outer.method();
}
} ```
外部类名.内部类名 对象名 = 外部类对象.内部类对象;
```java package com.briup.inner;
import com.briup.inner.Outer.Inner;
class Outer { int num = 30;
public class Inner {
public void function() {
System.out.println(num);
}
}
public void method() {
Inner inner = new Inner();
inner.function();
}
}
public class OuterTest { public static void main(String[] args) { Outer.Inner inner = new Outer().new Inner(); inner.function(); } } ```


8.1成员内部类私有使用
private
```java package com.briup.inner;
class Outer { private int num = 30;
private class Inner {
public void function() {
System.out.println(num);
}
}
public void method() {
Inner inner = new Inner();
inner.function();
}
}
public class OuterTest { public static void main(String[] args) { Outer.Inner inner = new Outer().new Inner(); inner.function(); } } ```
8.2 练习题
```java package com.briup.inner;
class Outer { private int num = 30;
public class Inner {
int num = 20;
public void function() {
int num = 10;
System.out.println(num);
}
}
public void method() { Inner inner = new Inner(); inner.function(); }
}
public class OuterTest { public static void main(String[] args) { Outer.Inner inner = new Outer().new Inner(); inner.function(); } } ```
8.2 静态成员内部类
static
B:成员内部类被静态修饰后的访问方式是:
外部类名.内部类名 对象名 = 外部类名.内部类对象;
```java package com.briup.inner;
class Outer { private int num = 30;
static class Inner {
int num = 20;
public void function() {
int num = 10;
System.out.println(num);
}
}
}
public class OuterTest { public static void main(String[] args) { Outer.Inner inner = new Outer.Inner(); inner.function(); } } ```
```java package com.briup.inner;
class Outer { private int num = 30;
static class Inner {
int num = 20;
public static void function() {
int num = 10;
System.out.println(num);
}
}
}
// 如果内部类定义了内部成员,那么该类一定是静态的 public class OuterTest { public static void main(String[] args) { //Outer.Inner inner = new Outer.Inner(); //inner.function(); Outer.Inner.function(); } } ```

8.3 成员内部类的面试题
A:面试题
要求:使用已知的变量,在控制台输出30,20,10。
class Outer {
public int num = 10;
class Inner {
public int num = 20;
public void show() {
int num = 30;
System.out.println(?);
System.out. (??);
System.out.println(???);
}
}
}
class InnerClassTest {
public static void main(String[] args) {
Outer.Inner oi = new Outer().new Inner();
oi.show();
}
}
8.4 局部内部类访问局部变量的问题


```java package com.briup.inner;
class Outer { private int num = 30;
public void method() {
class Inner {
public void print() {
System.out.println("sssss");
}
}
Inner inner = new Inner();
inner.print();
}
}
public class OuterTest { public static void main(String[] args) { } } ```
A:案例演示
局部内部类访问局部变量必须用final修饰
局部内部类在访问他所在方法中的局部变量必须用final修饰,为什么? 因为当调用这个方法时,局部变量如果没有用final修饰,他的生命周期和方法的生命周期是一样的,当方法弹栈,这个局部变量也会消失,那么如果局部内部类对象还没有马上消失想用这个局部变量,就没有了,如果用final修饰会在类加载的时候进入常量池,即使方法弹栈,常量池的常量还在,也可以继续使用
但是jdk1.8取消了这个事情,所以我认为这是个bug
```java package com.briup.inner;
class Outer { private int num = 30;
public void method() {
class Inner {
public void print() {
System.out.println(num);
}
}
Inner inner = new Inner();
inner.print();
}
}
public class OuterTest { public static void main(String[] args) { } } ```
8.5 匿名内部类的格式和理解

A:匿名内部类
就是内部类的简化写法。
B:前提:存在一个类或者接口
这里的类可以是具体类也可以是抽象类。
C:格式:
new 类名或者接口名(){
重写方法;
}
D:本质是什么呢?
是一个继承了该类或者实现了该接口的子类匿名对象。
E:案例演示
按照要求来一个匿名内部类
8.6 匿名内部类重写多个方法调用
A:案例演示
匿名内部类的方法调用
8.7 匿名内部类在开发中的应用
A:代码如下
```java //这里写抽象类,接口都行 abstract class Person { public abstract void show(); }
class PersonDemo { public void method(Person p) { p.show(); } }
class PersonTest { public static void main(String[] args) { //如何调用PersonDemo中的method方法呢? PersonDemo pd = new PersonDemo ();
}
} ```
8.8 匿名内部类的面试题
A:面试题
按照要求,补齐代码
java interface Inter { void show(); } class Outer { //补齐代码 } class OuterDemo { public static void main(String[] args) { Outer.method().show(); } }
要求在控制台输出”HelloWorld”