Java内部类之匿名内部类

??我们都知道Java中可以使用内部类,将一个类的定义放在另一个类的定义的内部,这就是内部类,但是匿名内部类往往使我们摸不着头脑,因为它并没有特定的名称,那么该如何使用它呢?

定义一个匿名内部类

public interface Contents
{
    int value();
}

public class Test1
{
    private Contents contents()
    {
        return new Contents()
        {
            private int i = 11;
            @Override
            public int value()
            {
                return i;
            }
        };
    }

    public static void main(String[] args)
    {
        Test1 test = new Test1();
        Contents con = test.contents();
        System.out.println(con.value());
    }
}

??如上,我们就定义了一个匿名内部类,它实现了Contents接口,通过new表达式返回的引用被自动向上转型为对Contents的引用,输出结果就是11。这是一个最基本的匿名内部类,只是输出了一个结果,下面我们来看看使用外部对象的匿名内部类。

使用带参数的匿名内部类

public interface Destination
{
    String readLabel();
}

public class Test2
{
    private Destination destination(final String dest)
    {
        return new Destination()
        {
            private String label = dest;
            @Override
            public String readLabel()
            {
                return label;
            }
        };
    }

    public static void main(String[] args)
    {
        Test2 test2 = new Test2();
        Destination d = test2.destination("Wu Han");
        System.out.println(d.readLabel());
    }
}

??上面的匿名内部类传入了一个参数,该匿名内部类使用了一个在外部定义的对象,那么编译器就要求其参数引用是final的。但是在JDK1.8中,就算没有设置为final也没有报错。

对匿名内部类初始化

public interface Destination
{
    String readLabel();
}

public class Test3
{
    public Destination destination(final String dest, final float price)
    {
        return new Destination()
        {
            private int cost;
            {
                cost = Math.round(price);
                if(cost > 100)
                {
                    System.out.println("超出预支");
                }
            }

            private String label = dest;
            @Override
            public String readLabel()
            {
                return label;
            }
        };
    }

    public static void main(String[] args)
    {
        Test3 test3 = new Test3();
        Destination d3 = test3.destination("Wu Han", 101.1F);
        System.out.println(d3.readLabel());
    }
}

??如上,该匿名内部类中对cost进行了初始化,由于匿名内部类是没有名称的,所以初始化方法自然也是没有名称的了。

??在使用匿名内部类后,我们再使用工厂方法,该方法就可以变得十分简洁易用。

??在最后说一下为什么我们需要内部类,最吸引我们的一个原因是:每个内部类都能独立地继承一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内部类都没有影响。在上面我们也看到了,使用匿名内部类,匿名内部类会直接实现接口,这在某些条件下会给我们带来便捷性。

时间: 2024-10-01 05:10:48

Java内部类之匿名内部类的相关文章

Java内部类:匿名内部类(四)

Java内部类分为4个部分进行阐述,分别为概览.成员内部类.局部内部类和匿名内部类. 在本文中是Java内部类的匿名内部类,主要讲述匿名内部类的概念.匿名内部类的好处.匿名内部类的使用前提.和匿名内部类的应用场景. 1.匿名内部类的概念 没有类名的类就称作为匿名内部类 2.匿名内部类的好处 简化书写 3.匿名内部类的使用前提 必须存在继承或者实现关系才能使用 4.匿名内部类的应用场景 匿名内部类一般是用于实参 示例代码: package com.rk.innerclass; public cla

java内部类和匿名内部类

内部类即是包含在类里面的又一个类. java内部类分为: 成员内部类.静态嵌套类.方法内部类.匿名内部类 . 内部类的共性 (1).内部类仍然是一个独立的类,在编译之后内部类会被编译成独立的.class文件,但是前面冠以外部类的类名和$符号 . (2).内部类不能用普通的方式访问.内部类是外部类的一个成员,因此内部类可以自由地访问外部类的成员变量,无论是否是private的 . (3).内部类声明成静态的,就不能随便的访问外部类的成员变量了,此时内部类只能访问外部类的静态成员变量 . 成员内部类

java 内部类、匿名内部类

一:内部类 1:什么是内部类? 大部分时候,类被定义成一个独立的程序单元.在某些情况下,也会把一个类放在另一个类的内部定义,这个定义在其他类内部的类就被称为内部类(有些地方也叫做嵌套类),包含内部类的类也被称为外部类(有些地方也叫做宿主类) 我们先创建一个基本的内部类结构: class Outer{//外部类 //内部类 class Inner{ } } 2:内部类的划分 内部类分为成员内部类和局部内部类.内部类也会生成.class文件. 2.1: 成员内部类 定义在外部类中的成员位置,与类中的

深入理解java内部类和匿名内部类

1.如果有人问你在java中接口可以new吗?我想答案应该是yes,实现匿名内部类的时候. http://blog.csdn.net/cntanghai/article/details/6094481 2.如果有人问你类是否可以被private等修饰,我想答案是yes,内部类的好处之一. 1.内部类可以很好的实现隐藏 一般的非内部类,是不允许有 private 与protected权限的,但内部类可以 2.内部类拥有外围类的所有元素的访问权限 3.可是实现多重继承 4.可以避免修改接口而实现同一

java 内部类、匿名内部类、嵌套类的使用

我们都知道java的类可以由public.default(缺省.不写)来修饰,分别表示的含义是允许公开访问以及只允许包内其它类访问,而同一包内的类通常是为完成同一个功能而协作. 除此之外,我们还会遇到一些类,它们只是其它某个类的实现或组成的一部分,它们不应该被独立的创建出来,当它们创建的时候需要跟"宿体"连在一块,这就是内部类.就好像人类的心脏,你没法单独的new一个出来,它只能依赖于人体而存活(这本来就是它存在的目的),至少现代医学做不到离体存活,现代医学能做的只是把一个心脏取出来,

Java 内部类和匿名内部类

1.内部类: 1 /* 2 局部内部类: 在一个类 的方法内部定义另外一个类,那么另外一个类就称作为局部内部类. 3 4 局部内部类要注意的细节: 5 1. 如果局部 内部类访问了一个局部变量,那么该局部变量必须使用final修饰. 6 7 8 */ 9 class Outer{ 10 11 String name= "外部类的name"; 12 13 public void test(){ 14 //局部变量 15 final int y =100; // y 什么时候从内存中消失?

java 内部类3(匿名内部类)

匿名内部类: 1.没有类名的类就叫匿名内部类 2.好处:简化书写. 3.使用前提:必须有继承或实现关系......不要想着你自己没有钱你没可是你爸有 4.一般用于于实参.(重点) class Outer{ class Inner{ public void show(){ System.out.println(“内部累的show方法”); } } public void print(){ new Inner().show(); } }

Java内部类小程序(成员内部类,静态内部类,匿名内部类)

1 /** 2 * 测试java内部类(成员内部类,静态内部类,匿名内部类) 3 * 局部内部类不常用,就不写了. 4 * @package :java05 5 * @author shaobn 6 * @Describe : 7 * @Time: 2015-9-6 下午8:32:38 8 */ 9 public class TestInner { 10 11 /** 12 * @author shaobn 13 * @Describe : 14 * @param args 15 * @Time

Java内部类详解--成员内部类,局部内部类,匿名内部类,静态内部类

说起内部类这个词,想必很多人都不陌生,但是又会觉得不熟悉.原因是平时编写代码时可能用到的场景不多,用得最多的是在有事件监听的情况下,并且即使用到也很少去总结内部类的用法.今天我们就来一探究竟.下面是本文的目录大纲: 一.内部类基础 二.深入理解内部类 三.内部类的使用场景和好处 四.常见的与内部类相关的笔试面试题 若有不正之处,请多谅解并欢迎批评指正. 请尊重作者劳动成果,转载请标明原文链接: http://www.cnblogs.com/dolphin0520/p/3811445.html 一