精华内容
下载资源
问答
  • 匿名内部类访问外部局部变量必须是final修饰的,Java 1.8 会默认为其加上final 例子如下: public void send(String topicName, T obj) { String jsonObj; if (obj instanceof String) { jsonObj = String...

    匿名内部类访问外部局部变量必须是final修饰的,Java 1.8 会默认为其加上final

    例子如下:

    public void send(String topicName, T obj) {
            String jsonObj;
            if (obj instanceof String) {
                jsonObj = String.valueOf(obj);
            } else {
                jsonObj = JSON.toJSONString(obj);
            }
            LOGGER.info("send message = {}", jsonObj);
    
            // 发送消息
            ListenableFuture<SendResult<String, Object>> future = kafkaTemplate.send(topicName, jsonObj);
    
            future.addCallback(new ListenableFutureCallback<SendResult<String, Object>>() {
                @Override
                public void onFailure(Throwable throwable) {
                    OrderBaseInfo baseInfo = JSONObject.parseObject(jsonObj, OrderBaseInfo.class);
                    LOGGER.info("Producer: send fail: {}", throwable.getMessage());
                }
    
                @Override
                public void onSuccess(SendResult<String, Object> stringObjectSendResult) {
                    LOGGER.info("Producer: success: {}", stringObjectSendResult.toString());
                }
            });
        }

    在java1.8的环境下,可以不用手动给jsonObj添加 final关键词修饰,而final已经被默认添加final修饰了

    详细原因参看:https://www.cnblogs.com/hapjin/p/5744478.html (使得 访问 内部类的局部变量,作用域变大了)

    转载于:https://www.cnblogs.com/mlfz/p/10772620.html

    展开全文
  • Java匿名内部类访问外部类的局部变量,那么这个局部变量需要用final修饰吗? 为什么我的测试没有用final却可以?
  • 对于Java语言中的final使用,大家应该很...一、问题的提出Java编程中,使用匿名内部类访问外部方法的局部变量是一件很常见的事件,比如以下代码,使用匿名内部类设置控件的监听器是再常见不过了,下面的例子中,因...

    对于Java语言中的final使用,大家应该很熟悉,可以修饰类,表示不可继承;可以修饰方法,表示不可被子类重写;可以修饰变量,表示不可以被二次赋值。那么,Java匿名内部类访问外部变量,为何需被标志为final?这跟上述三个特性有关系吗?

    一、问题的提出

    Java编程中,使用匿名内部类访问外部方法的局部变量是一件很常见的事件,比如以下代码,使用匿名内部类设置控件的监听器是再常见不过了,下面的例子中,因为匿名监听器类访问了外部局部变量name,编译器提示name变量必须使用final修饰。

    //初始化按钮的监听器

    public void initListener(Button btn ){

    final int name = "王大锤"; //必须标记为final

    btn.setOnClickListener(new View.OnClickListener() {

    @Override

    public void onClick(View v) {

    btn.setText(name); //动态改变按钮的文字

    }

    });

    }

    为何name变量需被标志为final?这深层次的原因是什么?为什么有这样一个让人摸不着头脑的规定?

    二、解释

    这要从闭包说起,匿名内部类和外部方法形成了一个闭包,因此,匿名内部类能够访问外部方法的变量,看起来是一种“天经地义”的事情,Java语言当然也需要实现这种特性,但是这里遇到了一个问题。

    匿名内部类的生命周期可能比外部的类要长,因此访问外部局部变量有可能是访问不到的。

    那怎么办呢?Java语言为了实现这种特性, 只好将外部的局部变量偷偷的赋值了一份给匿名内部类。那这样匿名内部类就可以肆无忌惮的访问外部局部变量了。

    问题又来了,这种通过赋值的形式有一个缺陷,匿名内部类不可以修改“原来的局部变量”,因为是一份“复制品”,修改复制品对原变量没什么影响啊。

    那怎么办? Java语言干脆强制要求被匿名内部类访问的外部局部变量必须是final的,什么意思呢?就是“一刀切”,不让修改了。

    展开全文
  • 内部类的作用:内部类可以很好的实现功能隐藏,可以添加private、protected等权限控制可以避免修改接口而实现同一个类中两种同名方法的调用可是实现多重继承(重要)内部类外部类相互调用方式:一:非静态内部类内部...

    内部类的作用:

    内部类可以很好的实现功能隐藏,可以添加private、protected等权限控制

    可以避免修改接口而实现同一个类中两种同名方法的调用

    可是实现多重继承(重要)

    内部类和外部类相互调用方式:

    一:非静态内部类

    内部类调用外部类

    1.非静态内部类,不能存在静态方法

    2.非静态方法,调用外部类的非静态方法、静态方法都可以直接调用

    外部类调用内部类

    1.非静态方法,调用内部的非静态方法 new Inner().innerMethod();

    2.静态方法,调用内部类的非静态方法 new Outer().new Inner().innerMethod();

    二:静态内部类

    内部类调用外部类

    1.非静态、静态方法,调用静态方法直接调用

    2.非静态、静态方法,调用非静态方法 new Outer().outMethod();

    外部类调用内部类

    1.非静态、静态方法,调用非静态方法 new Outer.StaticInner().innerMethod();

    2.非静态、静态方法,调用静态方法 Outer.StaticInner.innerStaticMethod();

    **示例代码

    public class Outer {

    private void outMethod(){

    System.out.println("i am out non-static method");

    new Inner().innerMethod();

    new Outer.StaticInner().innerMethod();

    Outer.StaticInner.innerStaticMethod();

    }

    private static void outStaticMethod(){

    System.out.println("i am out static method");

    new Outer().new Inner().innerMethod();

    new Outer.StaticInner().innerMethod();

    Outer.StaticInner.innerStaticMethod();

    }

    class Inner{

    private void innerMethod(){

    System.out.println("i am inner non-static method");

    outMethod();

    outStaticMethod();

    }

    // //error non-static class canot have static cmethod

    // private static void innerStaticMethod(){

    // System.out.println("i am inner static method");

    // }

    }

    static class StaticInner{

    private void innerMethod(){

    System.out.println("i am staticinner non-static method");

    outStaticMethod();

    new Outer().outMethod();

    }

    private static void innerStaticMethod(){

    System.out.println("i am staticinner static method");

    outStaticMethod();

    new Outer().outMethod();

    }

    }

    }

    展开全文
  • 今天学习了内部类的知识,知道内部类是可以持有外部类的this,从而在内部类中可以使用OuterClass.this.medthod()来引用相应外部类方法。但是我写出下代码,可以运行,然而其中的调用逻辑我不是很明白,望赐教!...

    今天学习了内部类的知识,知道内部类是可以持有外部类的this,从而在内部类中可以使用OuterClass.this.medthod()来引用相应外部类方法。但是我写出下代码,可以运行,然而其中的调用逻辑我不是很明白,望赐教!

    public class test {

    public void report(){

    System.out.println("I'm invoked!");

    }

    public void perform(){

    new Speaker().handleAction(new Action(){

    @Override

    public void action() {

    report();//???为什么能调用report??

    }

    });

    }

    public static void main(String[] args) {

    new test().perform();//测试代码

    }

    }

    class Speaker{

    void handleAction(Action act){

    act.action();

    }

    }

    interface Action{

    void action();

    }

    其中设计是这样的,test对象调用perform方法,该方法其中新建一个Speaker匿名类对象,该对象调用了其handleAction方法,该方法的参数是一个Action接口,接口需要重写action抽象方法。我使用了属于test的report方法。输出是正常的。

    那么我想知道,test对象的方法中有一个匿名类的局部对象,局部对象参数是一个实现接口的匿名类,为什么在这个匿名类中可以调用report?它持有test.this指针吗?

    我理解中,new Speaker().handleAction(new Action(){....这里面的实现逻辑和test.this一点关系都没有,也没有必要持有test.this???

    展开全文
  • 那么,Java匿名内部类访问外部变量,为何需被标志为final?这跟上述三个特性有关系吗? 一、问题的提出 Java编程中,使用匿名内部类访问外部方法的局部变量是一件很常见的事件,比如以下代码,使用匿名内部类...
  • 首先当一个匿名内部类访问外部得到局部变量的时候,需要引用外部的局部变量的引用,当外部的对象被gc的时候,匿名内部类则相当于引用了一个不存在的地址,在说一说加final之后的变量存放位置,当一个变量被final修饰...
  • 匿名内部类不能访问外部类方法中的局部变量,除非变量被声明为final类型 这里所说的“匿名内部类”主要是指在其外部类的成员方法内定义,同时完成实例化的类,若其访问该成员方法中的局部变量,局部变量必须要被...
  • 原文地址 ... ...对于Java语言中的final使用,大家应该很熟悉,可以修饰类,表示不...那么,Java匿名内部类访问外部类的局部变量,为何需被标志为final?这跟上述三个特性有关系吗? 一、问题的提出 Java编
  •  在《Java编程思想》关于内部类的介绍中有这样一句话:如果定义一个匿名内部类,并且希望它使用一个在外部定义的对象,那么编译器器会要求其参数引用是 final 的。 interface Destination{ String readLabel...
  • 如果定义一个匿名内部类,并且希望它使用一个在其外部定的对象,那么编译器会要求其参数引用是final的。 1.匿名内部类肯定是局部内部类(在一个方法里面定义的内部类),因为在java中,语句必须写在方法里,而匿名...
  • 引用那个匿名内部类的函数执行完了就没了,所以内部类中引用外面的局部变量需要是final的,这样在回调的时候才能找到那个变量,而如果是外围类的成员变量就不需要是final的,因为内部类本身都会含有一个外围了的引用...
  • [img=https://img-bbs.csdn.net/upload/201701/09/1483958956_263015.png][/img]
  • 而局部变量也是如此,局部变量时存在于栈内存中的,使用完了就立即被消灭掉了,而匿名内部类访问局部变量,也是对它的一个拷贝而已;那么试想,局部变量都没了,匿名内部类还存在,这个匿名内部类要去哪找这个变量呢...
  • 如果定义一个匿名内部类,并且希望它使用一个在其外部定的对象,那么编译器会要求其参数引用是final的。 1.匿名内部类肯定是局部内部类(在一个方法里面定义的内部类),因为在java中,语句必须写在方法里,而匿名...
  • 如题所示,为什么必须是final呢?
  • 内部类访问外部类里面的可以自由访问外面的,规则和static一样。(访问非静态时必须先创建对象)具体如下:非静态内部类的非静态方法直接访问public class Outter {int i = 5;static String string = "Hello";class ...
  • 1. 内部类里面使用外部类的局部变量时,其实就是内部类的对象在使用它,内部类对象生命周期中都可能调用它,而内部类试图访问外部方法中的局部变量时,外部方法的局部变量很可能已经不存在了,那么就得延续其生命,...
  • 一、什么是内部类内部类顾名思义就是在类的内部再定义一个类,内部类依赖于外部类而存在,**内部类可以分为成员内部类、静态内部类、局部内部类、匿名内部类**。内部类仍然是一个独立的类,在编译之后内部类会被编译...
  • 在 Java 中,广泛意义上的内部类一般来说包括这四种:成员内部类、局部内部类、匿名内部类和静态内部类。下面就先来了解一下这四种内部类的用法。成员内部类成员内部类是最普通的内部类,它的定义为位于另一个类的...
  • (1)内部类里面使用外部类的局部变量时,其实就是内部类的对象在使用它,内部类对象生命周期中都可能调用它, 而内部类试图访问外部方法中的局部变量时,外部方法的局部变量很可能已经不存在了,那么就得延续其生命...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,393
精华内容 957
关键字:

匿名内部类访问外部