JAVA学习-5 内部类种类

内部类的作用:可以间接实现多继承
Java中的内部类共分为四种:

  • 静态内部类static inner class (also called nested class)
  • 成员内部类member inner class
  • 局部内部类local inner class
  • 匿名内部类anonymous inner class

1、静态内部类

最简单的内部类形式。

类定义时加上static关键字

不能和外部类有相同的名字。

被编译成一个完全独立的.class文件,名称为OuterClass$InnerClass.class的形式。

只可以访问外部类的静态成员和静态方法,包括了私有的静态成员和方法。

生成静态内部类对象的方式为:

OuterClass.InnerClass inner = new OuterClass.InnerClass();

静态内部类使用代码:

package com.learnjava.innerclass;

class StaticInner
{
    private static int a = 4;

    // 静态内部类
    public static class Inner
    {
        public void test()
        {
            // 静态内部类可以访问外部类的静态成员
            // 并且它只能访问静态的
            System.out.println(a);
        }

    }
}

public class StaticInnerClassTest
{

    public static void main(String[] args)
    {
        StaticInner.Inner inner = new StaticInner.Inner();
        inner.test();
    }
}

2、成员内部类

成员内部类也是定义在另一个类中,但是定义时不用static修饰。

成员内部类和静态内部类可以类比为非静态的成员变量和静态的成员变量。

成员内部类就像一个实例变量。

它可以访问它的外部类的所有成员变量和方法,不管是静态的还是非静态的都可以。

在外部类里面创建成员内部类的实例:

this.new Innerclass();

在外部类之外创建内部类的实例:

(new Outerclass()).new Innerclass();

在内部类里访问外部类的成员:

Outerclass.this.member

详情见代码例子:

class MemberInner
{
    private int d = 1;
    private int a = 2;

    // 定义一个成员内部类
    public class Inner2
    {
        private int a = 8;

        public void doSomething()
        {
            // 直接访问外部类对象
            System.out.println(d);
            System.out.println(a);// 直接访问a,则访问的是内部类里的a

            // 如何访问到外部类里的a呢?
            System.out.println(MemberInner.this.a);
        }

    }

}

public class MemberInnerClassTest
{

    public static void main(String[] args)
    {

        // 创建成员内部类的对象
        // 需要先创建外部类的实例
        MemberInner.Inner2 inner = new MemberInner().new Inner2();

        inner.doSomething();
    }
}

3、局部内部类

局部内部类定义在方法中,比方法的范围还小。是内部类中最少用到的一种类型。

像局部变量一样,不能被public, protected, private和static修饰。

只能访问方法中定义的final类型的局部变量。

局部内部类在方法中定义,所以只能在方法中使用,即只能在方法当中生成局部内部类的实例并且调用其方法。

class LocalInner
{
    int a = 1;

    public void doSomething()
    {
        int b = 2;
        final int c = 3;
        // 定义一个局部内部类
        class Inner3
        {
            public void test()
            {
                System.out.println("Hello World");
                System.out.println(a);

                // 不可以访问非final的局部变量
                // error: Cannot refer to a non-final variable b inside an inner
                // class defined in a different method
                // System.out.println(b);

                // 可以访问final变量
                System.out.println(c);
            }
        }

        // 创建局部内部类的实例并调用方法
        new Inner3().test();
    }
}

public class LocalInnerClassTest
{
    public static void main(String[] args)
    {
        // 创建外部类对象
        LocalInner inner = new LocalInner();
        // 调用外部类的方法
        inner.doSomething();
    }

}

4、匿名内部类
匿名内部类就是没有名字的局部内部类,不使用关键字class, extends, implements, 没有构造方法。

匿名内部类隐式地继承了一个父类或者实现了一个接口。

匿名内部类使用得比较多,通常是作为一个方法参数。

import java.util.Date;

public class AnonymouseInnerClass
{

    @SuppressWarnings("deprecation")
    public String getDate(Date date)
    {
        return date.toLocaleString();

    }

    public static void main(String[] args)
    {
        AnonymouseInnerClass test = new AnonymouseInnerClass();

        // 打印日期:
        String str = test.getDate(new Date());
        System.out.println(str);
        System.out.println("----------------");

        // 使用匿名内部类
        String str2 = test.getDate(new Date()
        {
        });// 使用了花括号,但是不填入内容,执行结果和上面的完全一致
            // 生成了一个继承了Date类的子类的对象
        System.out.println(str2);
        System.out.println("----------------");

        // 使用匿名内部类,并且重写父类中的方法
        String str3 = test.getDate(new Date()
        {

            // 重写父类中的方法
            @Override
            @Deprecated
            public String toLocaleString()
            {
                return "Hello: " + super.toLocaleString();
            }

        });

        System.out.println(str3);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 《Java虚拟机精讲》是一本介绍Java虚拟机的权威性书籍。该书的作者是豆瓣高分图书《深入理解Java虚拟机:JVM高级特性与最佳实践》的作者陈晓明。 该书共分为12章,全面解析了Java虚拟机的原理、结构、内存管理、垃圾收集、安全性等方面的内容。 首先,该书通过介绍Java虚拟机的历史背景和发展,引出了Java虚拟机在Java程序运行中的重要性以及其作用。 接着,该书详细介绍了Java虚拟机的架构,包括Java虚拟机的运行时数据区域、执行引擎、类加载机制等。 然后,该书详细解析了Java虚拟机的内存管理,包括Java堆、方法区、运行时常量池等各个内存区域的作用、实现原理以及优化技巧。 此外,该书还对Java虚拟机的垃圾收集机制进行深入介绍,包括垃圾收集算法、垃圾收集器的分类和选择原则,并提供了相应的性能调优方法。 另外,该书还涵盖了Java虚拟机的安全性问题,包括如何保证Java程序的安全、如何进行代码审计等内容。 最后,该书还介绍了Java虚拟机的性能调优方法,包括如何进行性能诊断、性能优化等方面的内容。 总之,《Java虚拟机精讲》是一本全面而深入介绍Java虚拟机的书籍,对于想要深入了解Java虚拟机原理、优化Java程序性能的开发者和爱好者来说,是一本不可多得的好书。通过阅读该书,读者可以全面掌握Java虚拟机的工作原理,为编写高性能、稳定的Java程序提供指导。 ### 回答2: 《Java虚拟机精讲》是一本详细讲解Java虚拟机(JVM)原理和内部实现的电子书。这本书系统地介绍了JVM的结构、执行引擎、垃圾回收器、类加载机制等关键组件。 首先,本书对JVM的结构进行了详细讲解。它将JVM分为类加载子系统、执行引擎、内存管理和垃圾回收子系统等几个模块,每个模块都被详细讲解了其内部的工作原理和实现细节。读者可以通过对JVM结构的了解,深入理解JVM的内部运作方式。 其次,本书对JVM的执行引擎进行了深入解析。它介绍了JVM的运行时数据区域、栈帧的结构和数据传递方式等关键概念,帮助读者理解Java字节码的执行过程。 此外,垃圾回收是JVM的重要特性之一,而本书也对JVM的垃圾回收器进行了详细的介绍。它解释了不同类型的垃圾回收器(如Serial、Parallel、CMS、G1等)的原理和适用场景,并且通过一些实例帮助读者理解垃圾回收器的工作过程。 最后,本书还对类加载机制进行了解析。它包括类加载的过程、双亲委派模型、类的初始化和链接等内容,帮助读者深入理解Java类的加载和运行机制。 总之,《Java虚拟机精讲》是一本深入讲解JVM原理和内部实现的电子书。通过阅读本书,读者可以更全面地了解JVM的结构、执行引擎、垃圾回收机制和类加载机制等关键组成部分,为深入理解Java编程和性能优化提供了基础。 ### 回答3: 《Java虚拟机精讲PDF》是一本系统而全面地介绍Java虚拟机的教材。Java虚拟机(JVM)是Java程序在执行过程中所依赖的运行环境,它可以解释和执行Java字节码。此书围绕着JVM的运行机制、内存管理、垃圾回收等方面展开详细的介绍。 首先,该书详细讲解了JVM的执行过程和各个组件的作用。它深入探讨了类加载器、字节码解释器、即时编译器等核心组件,并结合实例进行解释。读者能够学习到JVM执行Java代码的具体流程,了解JVM是如何加载并执行Java类的。 其次,该书重点介绍了JVM的内存管理机制。它详细解释了Java内存模型、堆、栈、方法区等内存结构,以及垃圾回收机制。读者可以了解到Java虚拟机是如何管理和分配内存的,以及如何通过垃圾回收来优化内存的使用。 此外,该书还涵盖了性能调优、多线程并发等高级主题。它介绍了如何通过设置JVM参数来优化应用程序的性能,并提供了一些常见的性能调优技巧。同时,它也介绍了Java多线程编程的基本原理和常用的线程安全机制。 总的来说,《Java虚拟机精讲PDF》是一本对于深入了解和研究Java虚拟机非常有帮助的教材。通过阅读本书,读者可以系统全面地掌握Java虚拟机的原理和实现机制,从而更加高效地进行Java程序的开发和调优。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值