Java内部类

文章介绍了Java中的内部类概念,包括成员内部类、局部内部类和匿名内部类的定义、格式及使用示例。成员内部类可以直接访问外部类的所有成员,而外部类需通过实例化内部类来访问其成员。局部内部类定义在方法中,仅在该方法内可见。匿名内部类是简化形式,常用于快速实现接口或父类的特定功能。
摘要由CSDN通过智能技术生成

将一个类A定义在另一个类B里面,里面的那个类A就称为内部类,B则称为外部类。    

内部类分为:成员内部类、局部内部类、匿名内部类

1.成员内部类:

  在描述事物时,若一个事物内部还包含其他事物,就可以使用内部类这种结构。比如,汽车类 Car 中包含发动机 ,发动机类就是汽车类的内部类。
类 Engine ,这时, Engine 就可以使用内部类来描述,定义在成员位置。



###成员内部类格式

class 外部类 {
    class 内部类{ 
    }
}

成员内部类访问特点

  • 内部类可以直接访问外部类的成员,包括私有成员。

  • 外部类要访问内部类的成员,必须要建立内部类的对象。

//创建内部类方式:外部类名.内部类名 对象名 = new 外部类型().new 内部类型();

//++例子++
//dingy类
public class Person {
    private  boolean live = true;
    class Heart {
        public void jump() {
            // 直接访问外部类成员
            if (live) {
                System.out.println("心脏在跳动");            
            }else {
                System.out.println("心脏不跳了");            
            }
        }
    }

    public boolean isLive() {
        return live;
    }

    public void setLive(boolean live) {
        this.live = live;
    }

}
//测试类
public class InnerDemo {
    public static void main(String[] args) {       
        // 创建外部类对象 
        Person p  = new Person();
        // 创建内部类对象
        Heart heart = p.new Heart();

        // 调用内部类方法
        heart.jump();
        // 调用外部类方法
        p.setLive(false);
        // 调用内部类方法
        heart.jump();
    }
}

内部类仍然是一个独立的类,在编译之后会内部类会被编译成独立的.class文件,但是前面冠以外部类的类名和$符号。比如,Person$Heart.class

2.局部内部类

将一个类定义在一个方法中,该类就称之为是局部内部类

例子:

public class Test {
    public static void main(String[] args) {
        Outer outer = new Outer();
        outer.show();
    }
}


public class Outer {
    public void show(){
        // 局部内部类
        class Inner{
            public void method(){
                System.out.println("Inner 局部内部类的method方法执行了....");
            }
        }

        // 在外部类的方法内使用局部内部类
        Inner inner = new Inner();
        inner.method();

    }
}

3.匿名内部类

是内部类的简化写法。它的本质是一个 带具体实现的 父类或者父接口的 匿名的 子类对象

开发中,最常用到的内部类就是匿名内部类了。以接口举例,当你使用一个接口时,似乎得做如下几步操作

         1. 定义子类 
         2. 重写接口中的方法 
         3. 创建子类对象 
         4. 调用重写后的方法

注意:使用内部类前提:匿名内部类必须==继承一个父类==或者==实现一个父接口==。

匿名内部类的写法格式:

 new 父类名或者接口名(){
    // 方法重写
    @Override 
    public void method() {        // 执行语句
    }
};

匿名内部类的使用:

以借口方式为例:

//定义接口
public interface Fly{
    public abstract void fly();
}


//创建匿名内部类,并调用

public class InnerDemo {
    public static void main(String[] args) {
        
        Fly  f = new Fly(){
/*
{}括号内的为类,括号前为类的声明
*/
            public void fly() {
                System.out.println("我飞了~~~");
            }
        };

        //调用 fly方法,执行重写后的方法
        f.fly();
    }
}

常在方法的形式参数是接口或者抽象类时,也可以将匿名内部类作为参数传递。

例子如下:

public class Inner {


    public static void showFly(FlyAble f) {
        f.fly();
    }


    public static void main(String[] args) {                 
        /*
        创建匿名内部类,直接传递给showFly(FlyAble f)
原本的调用方式是直接用showFly(f),直接简化可以写成如下方式在需要调用的方法的参数中使用匿名内部类。如下
        */
        showFly( new Fly(){
            public void fly() {
                System.out.println("我飞了~~~");
            }
        });
    }

    
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ヾ草木萤火(≧▽≦*)o

希望大家多多支持,我会继续分享

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值