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/set
public 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/set
public 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{
@Override
public void eat() {
System.out.println("啃骨头");
}
@Override
public 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() {
@Override
public void eat() {
System.out.println("吃草");
}
@Override
public void sleep() {
System.out.println("站着睡");
}
};
//使用匿名内部类的方法
//只是看语法:这个匿名内部类是用来实现线程的--系统中直接拿过来用
new Thread(){
@Override
public void run(){
}
};
}
}
<a name="4vQUe"></a>
### 4.2匿名内部类的应用
```java
package 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(){
@Override
public void eat() {
System.out.println("匿名内部类");
}
}.eat();*/
//多次调用匿名内部类
/*Inter i=new Inter(){
@Override
public 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() {
@Override
public void eat() {
}
@Override
public void jump() {
System.out.println("狗跳高");
}
});
o.method(new Inter() {
@Override
public void eat() {
}
@Override
public void jump() {
System.out.println("猫跳高");
}
});
}
}