1.内部类定义
内部类:是一个相对的概念,即在类中定义类
- 内部类可以直接访问外部类的所有的成员—包括私有的
- 外部类要访问内部类的成员,必须要创建对象
- 内部类:
- 成员内部类:定义在成员的位置
-
2.成员内部类
成员内部类:
语法:
- 定义在成员位置的内部类
- 格式:
- public class Outer{
class Inner{
//代码
}
- }
- 访问格式:
- 成员内部类创建对象,必须有外部类对象,才能有内部类对象
Outer.Inner x=new Outer().new Inner();
在jvm编译的时候,只要有一个class存在就会生成一个.class文件,不管是内部类还是外部类
内部类.class文件的命名:外部类名$内部类名
public class NestedClass {//定义一个成员变量private String name="王嘉尔";//成员内部类--可以使用权限修饰符public class Inner{//内部类中声明方法public void innerMethod(){System.out.println("内部类的方法");//访问外部类中的内容System.out.println("外部的name:"+name);}}//生成get/setpublic String getName() {return name;}public void setName(String name) {this.name = name;}}
public class NestedClassDemo {public static void main(String[] args) {//创建成员内部类的对象NestedClass.Inner inner=new NestedClass().new Inner();inner.innerMethod();}}
3.局部内部类
3.1 局部内部类
语法:
定义在方法的里面—局部
访问格式:
- 1.创建外部类
- 2.通过外部类的对象调用方法来操作局部内部类

注意:定义好局部内部类之后可以使用类—必须使用!!!
//定义好局部内部类之后可以使用类--必须使用!!!InnerClass inner=new InnerClass();inner.innerMethod();
public class NestedClass {//定义一个成员变量private String name="王嘉尔";//外部类的方法public void OuterMethod(){//定义一个局部内部类class InnerClass{//声明一个局部内部类的方法public void innerMethod(){System.out.println("局部内部类的方法");System.out.println("外部类的成员变量name:"+name);}}//定义好局部内部类之后可以使用类--必须使用!!!InnerClass inner=new InnerClass();inner.innerMethod();}//生成get/setpublic String getName() {return name;}public void setName(String name) {this.name = name;}}
public class NestedClassDemo {public static void main(String[] args) {//创建外部类的对象NestedClass nc=new NestedClass();//通过外部类的对象调用方法来操作局部内部类nc.OuterMethod();}}
4.匿名内部类
4.1匿名内部类
匿名内部类:没有名字的内部类
- 创建某个类(接口)的子类对象
- 步骤:
- 1.定义带名字的类
- 2.创建对象
- 意义:
- 匿名内部类是创建某个类型子类的快捷方式—语法简单
- 我们临时定义的一个类的子类,并且创建子类的对象而使用的匿名内部类
- 优点:
- 1.节省代码量
- 2.一次性的
- 格式:
new 父类(){
//重写父类的方法
}
/*** 父类--抽象类** 吃饭,睡觉*/public abstract class Animal {public abstract void eat();public abstract void sleep();}
/*** 实现类--子类** 定义子类的方法* 重写父类的方法*/public class Dog extends Animal{@Overridepublic void eat() {System.out.println("啃骨头");}@Overridepublic void sleep() {System.out.println("睡狗窝");}}
```java public class AnonymousInnerClassDemo { public static void main(String[] args) {
//使用有类名的子类(多态的使用)--父类的引用指向子类的对象Animal ad=new Dog();ad.eat();ad.sleep();System.out.println("-------------------");//使用匿名内部类的方式实现--创建了一个子类Animal a=new Animal() {@Overridepublic void eat() {System.out.println("吃草");}@Overridepublic void sleep() {System.out.println("站着睡");}};//使用匿名内部类的方法
//只是看语法:这个匿名内部类是用来实现线程的--系统中直接拿过来用new Thread(){@Overridepublic void run(){}};}
}
<a name="4vQUe"></a>### 4.2匿名内部类的应用```javapackage nimingneibulei;/*** @author Lynn* @create 2020-12-05-10:48*/public interface Inter {public abstract void eat();void jump();}
package nimingneibulei;/*** @author Lynn* @create 2020-12-05-10:45*/public class Outer {public void study(){/*new Inter(){@Overridepublic void eat() {System.out.println("匿名内部类");}}.eat();*///多次调用匿名内部类/*Inter i=new Inter(){@Overridepublic void eat() {System.out.println("匿名内部类");}};i.eat();i.eat();i.eat();*/}public void method(Inter i){i.jump();}}
package nimingneibulei;/*** @author Lynn* @create 2020-12-05-10:45*/public class OuterDemo {public static void main(String[] args) {Outer o=new Outer();o.study();o.method(new Inter() {@Overridepublic void eat() {}@Overridepublic void jump() {System.out.println("狗跳高");}});o.method(new Inter() {@Overridepublic void eat() {}@Overridepublic void jump() {System.out.println("猫跳高");}});}}
