内部类

本文详细介绍了Java中的四种内部类:成员内部类、局部内部类、匿名内部类和静态内部类。成员内部类可以直接访问外部类的所有成员,而外部类需通过实例化内部类才能访问其成员。局部内部类仅在其定义的方法内有效,可访问外部类和方法的局部变量。匿名内部类通常用于快速实现接口或抽象类的简单子类,常见于回调和事件处理。文章通过示例代码展示了各种内部类的使用场景和创建方式。
摘要由CSDN通过智能技术生成

什么叫内部类?

在 Java 中,可以将一个类定义在另一个类里面或者一个方法里面(局部内部类),这样的类称为内部类。广泛意义上的内部类一般来说包括这四种:成员内部类、局部内部类、匿名内部类和静态内部类。下面就先来了解一下这四种内部类的用法。

成员内部类

在类中的方法,跟成员变量是一个位置

成员内部类的访问特点

  • 内部类可以直接访问外部类的成员,包括私有
  • 外部类要访问内部类的成员,必须要创建对象

创建成员内部类对象格式

//在内部创建成员内部类对象

Inner i = new Inner();

//在外界创建成员内部类格式
//外部类名.内部类名 对象名 = 外部类对象.内部类对象;
Outer.Inner oi = new Outer().new Inner();

成员内部类的推荐使用方案

将一个类设计为内部类的目的,大多数都是不想让外界去访问,所以内部类的定义应该私有化,私有化之后,再提供一个可以让外界调用的方法,方法内部创建内部类对象并调用。

示例代码:

public class Outer {
    private class Inner {
        public void show() {
            System.out.println("内部类show方法被调用。。。");
        }
    }

    //定义方法用来调用内部类
    public void method() {
        //创建内部类对象
        System.out.println("外部类方法被调用。。。");
        Inner i = new Inner();
        i.show();
    }
}

测试类:

public class Test {
    public static void main(String[] args) {
        //创建一个类对象,用来调用内部类的方法
        Outer o = new Outer();
        o.method();

    }

}

局部内部类

  • 局部内部类是在方法中定义的类
  • 外界无法直接使用,需要在方法内部创建对象并使用
  • 可以直接访问外部类的成员,也可以访问方法内的局部变量

匿名内部类

本质:是一个继承了该类或者实现了该接口的子类匿名对象

使用匿名内部类的前提:

存在一个类或接口,这里的类可以是具体类也可以是抽象类

匿名内部类的格式:

new 类名(){重写方法} new 接口名(){重写方法}

new Inter(){
    @Override
    public void method(){}
  }

匿名内部类可以铜鼓多态的形式接受

Inter i = new Inter(){
    @Override
    public void method(){
    }
}

匿名内部类直接调用方法

interface Inter {
    void method();
}

class Test {
    public static void main(String[] args) {
        new Inter() {
            @Override
            public void method() {
                System.out.println("我是匿名内部类");
            }
        }.method(); // 直接调用方法
    }
}

匿名内部类在开发中的使用

当发现某个方法需要接口或抽象类的子类对象时,就可以传递以个匿名内部类过去,来简化代码,而不需要创建多个类来实现接口或者抽象类。

public interface Jumping {
    void jump();
}
public class Cat implements Jumping{
    @Override
    public void jump() {
        System.out.println("猫可以跳了。。。");
    }
}
public class Dog implements Jumping{
    @Override
    public void jump() {
        System.out.println("狗可以跳了。。。");
    }
}

以前的做法: 

public class JumpingTest {
    public static void main(String[] args) {
        Jumping j1 = new Cat();
        j1.jump();
        Jumping j2 = new Dog();
        j2.jump();
    }
}

使用匿名内部类后的做法:

public class JumpingTest {
    public static void main(String[] args) {
        
         Jumping j = new Jumping(){

            @Override
            public void jump() {
                System.out.println(" 袋鼠可以跳了。。。");
            }
        };
        j.jump();
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值