资讯专栏INFORMATION COLUMN

Java系列之内部类

crelaber / 2979人阅读

摘要:方法内部类就是局部内部类,一般定义在类的局部位置,它可以访问当前代码块及外部类的所有变量。

今天温习一下 Java 中的内部类,内部类一般有如下几种:静态内部类、成员内部类、匿名内部类和方法内部类,下文中将主要介绍静态内部类和成员内部类,主要内容如下:

概述

静态内部类

成员内部类

匿名内部类和方法内部类

总结

概述

顾名思义内部类就是在一个类内部定义的类,它是内部类是一个独立的类,编译之后会生成独立的 .class 文件,其名称前面会有外部类的类名称以及 $ 符号,内部类同样可以使用 private 、default、protected、public 修饰,下面是内部类的写法,具体参考如下:

/**
 * 内部类
 * @author jzman
 */
public class OutterClass {
    //静态内部类
    private static class StaticInnerClass{
        
    }
    //成员内部类
    private class FieldInnerClass{
        
    }
    
    //匿名内部类
    Runnable runnable = new Runnable() {
        @Override
        public void run() {
            
        }
    };
    
    private void method() {
        //方法内部类(局部内部类)
        class InnerClass{
            
        }
    }    
}
静态内部类

静态内部类可以有静态成员和非静态成员;

静态内部类可以直接调用外部类的静态成员和静态方法,但不能调用外部类的非静态成员和非静态方法;

在不相关类中,可以直接创建静态内部类的对象;

静态内部类与其外部类联系很少,其创建基本不依赖与外部类。

/**
 * 静态内部类
 * @author jzman
 */
public class StaticInnerClassDemo {
    public static void main(String[] args) {
        //其他类可以直接创建某个非私有内部类的实例
        OutterClass1.InnerClass innerClassB = new OutterClass1.InnerClass();
        InnerClass innerClassA = new InnerClass();
        innerClassA.testStaticInnerClass();
        //...
    }
}

//外部类
class OutterClass1{
    //非静态成员变量
    int ageA = 18;
    //非静态方法
    public void methodA() {
        
    }
    
    //静态成员变量
    static int ageB = 18;
    //静态方法
    public static void methodB() {
        
    }
    
    private void methodC() {
        //外部类调用静态内部类的方法
        InnerClass innerClass = new InnerClass();
        innerClass.testStaticInnerClass();
    }
    
    //静态内部类
    static class InnerClass{
        
        public void testStaticInnerClass(){
            //静态内部类不能访问其外部类的非静态成员变量和方法
//            System.out.println(ageA);
//            methodA();
            //静态内部类可以访问其外部类的静态成员和方法
            System.out.println(ageB);
            methodB();
        }
    }
}
成员内部类

成员内部类可以访问所有外部类的成员;

成员内部类对象的创建必须依赖于外部类对象,先有外部类才会有内部类;

成员内部类就是外部类的一个成员变量;

成员内部类不能有静态成员,但允许常量存在。

/**
 * 成员内部类
 * @author jzman
 */
public class FieldInnerClassDemo {
    public static void main(String[] args) {
        //成员内部类依赖与其外部类,不能越过外部类直接创建内部类的实例
//        InnerClass innerClass = new InnerClass();
        //正确在其他类创建创建内部类的实例
        OutterClass2 outterClass2 = new OutterClass2();
        OutterClass2.InnerClass innerClass = outterClass2.new InnerClass();
        innerClass.testFieldInnerClassMethod();
    }
}

//外部类
class OutterClass2{
    //非静态成员变量
    int ageA = 18;
    //非静态方法
    public void methodA() {
        
    }
    
    //静态成员变量
    static int ageB = 18;
    //静态方法
    public static void methodB() {
        
    }
    
    private void methodC() {
        //外部类调用成员内部类的方法
        InnerClass innerClass = new InnerClass();
        innerClass.testFieldInnerClassMethod();
    }
    
    //成员内部类
    class InnerClass{
        
        //成员内部类不能有静态成员
//        static int a = 10;
        //成员内部类允许常量形式存在
        static final int b = 10;
        
        public void testFieldInnerClassMethod(){
            //成员内部类可以直接访问其外部类的所有成员变量及方法(静态和非静态)
            System.out.println(ageA);
            methodA();
            System.out.println(ageB);
            methodB();
        }
    }
}
匿名内部类和方法内部类

匿名内部类当然是没有确定的名称,其实现都是在类体中具体实现,最终返回相关类的一个匿名对象,由于最终返回的是一个匿名的实例,所以必须在匿名内部类之后添加分号。方法内部类就是局部内部类,一般定义在类的局部位置,它可以访问当前代码块及外部类的所有变量。

总结

类之间的成员变量的互相调用实际上还是访问对象的成员变量,如成员内部类能够访问外部类的成员变量或方法是因为内部类持有外部类的引用,一般通过 OutterClass.this 获取外部类的对象,如果外部类想要访问内部类的成员变量或方法当然也需要持有内部类的引用,所以外部类访问内部类的成员变量或方法时,必须先创建内部类的对象,然后通过对象来方位相应的成员变量或方法。

可以选择关注微信公众号:jzman-blog 获取最新更新,一起交流学习!

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/74944.html

相关文章

  • java面向对象(下)

    内部类 内部类主要作用 内部类提供了更好的封装,可以吧内部类隐藏在外部类之内,不允许同一个包中的其他类访问该类。 内部类成员可以直接访问外部类的私有数据,因为内部类被当成其外部类成员,同一个类的成员之间可以互相访问,但外部类不能访问内部类的实现细节。 匿名内部类适合用于创建那些仅需要使用一次的类。 定义内部类与外部类的语法大致相同,内部类除需要定义在其他类里面之外,还有两点区别: 内...

    awesome23 评论0 收藏0
  • Java 抽象类、接口、内部类

    摘要:即使抽象类里不包含抽象方法,这个抽象类也不能创建实例抽象类可以包含成员变量方法普通方法和抽象方法构造器初始化块内部类接口枚举种成分。 抽象类 当编写一个类时,常常会为该类定义一些方法,这些方法用以描述该类的行为方式,那么这些方法都有具体的方法体。但在某些情况下,某个父类只是知道其子类应该包含怎样的方法,但无法准确地知道这些子类如何实现这些方法。使用抽象方法即可满足该要求:抽象方法是只有...

    miguel.jiang 评论0 收藏0
  • Java 基础巩固:内部类的字节码学习和实战使用场景

    摘要:内部类的使用场景上面介绍了中种内部类的定义,接着我们介绍这些内部类的一些使用场景。成员内部类的使用场景普通内部类可以访问外部类的所有成员和方法,因此当类需要使用类,同时需要访问的成员方法时,可以将作为的成员内部类。 文章出自:安卓进阶学习指南 主要贡献者: Cloud9527 Alex_赵 Struggle shixinzhang 读完本文你将了解: [TOC] 通过反编译...

    weij 评论0 收藏0

发表评论

0条评论

crelaber

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<