`

内部类和final关键字

    博客分类:
  • java
 
阅读更多
首先,内部类被编译的时候会生成一个单独的内部类的.class文件,这个文件并不与外部类在同一class文件中。  
当外部类传的参数被内部类调用时,从java程序的角度来看是直接的调用例如:  
public void dosome(final String a,final int b){  
  class Dosome{public void dosome(){System.out.println(a+b)}};  
  Dosome some=new Dosome();  
  some.dosome();  
}  
从代码来看好像是那个内部类直接调用的a参数和b参数,但是实际上不是,在java编译器编译以后实际的操作代码是  
class Outer$Dosome{  
  public Dosome(final String a,final int b){  
  this.Dosome$a=a;  
  this.Dosome$b=b;  
}  
  public void dosome(){  
  System.out.println(this.Dosome$a+this.Dosome$b);  
}  
}}  
从以上代码看来,内部类并不是直接调用方法传进来的参数,而是内部类将传进来的参数通过自己的构造器备份到了自己的内部,自己内部的方法调用的实际是自己的属性而不是外部类方法的参数。  
这样理解就很容易得出为什么要用final了,因为两者从外表看起来是同一个东西,实际上却不是这样,如果内部类改掉了这些参数的值也不可能影 响到原参数,然而这样却失去了参数的一致性,因为从编程人员的角度来看他们是同一个东西,如果编程人员在程序设计的时候在内部类中改掉参数的值,但是外部 调用的时候又发现值其实没有被改掉,这就让人非常的难以理解和接受,为了避免这种尴尬的问题存在,所以编译器设计人员把内部类能够使用的参数设定为必须是 final来规避这种莫名其妙错误的存在。”
 (简单理解就是,拷贝引用,为了避免引用值发生改变,例如被外部类的方法修改等,而导致内部类得到的值不一致,于是用final来让该引用不可改变)
分享到:
评论

相关推荐

    Java中final关键字详解

    谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字。另外,Java中的String类就是一个final类,那么今天我们就来了解final这个关键字的用法。 主要介绍:一.final关键字的基本...

    Java面向对象编程中final关键字的使用方法详解

    主要介绍了Java面向对象编程中final关键字的使用方法详解,包括对内部匿名类无法访问外面的非 final 的变量问题的解读,需要的朋友可以参考下

    5.尚硅谷_java基础_高级类特性

    static 关键字 final 关键字 抽象类(abstract 关键字) 接口(interface 关键字) 内部类

    day10-final、接口、多态.pdf

    首先,final 关键字用于修饰不可改变的内容,可以修饰类、方法和变量。被 final 修饰的类不能被继承,方法不能被重写,变量不能被重新赋值。例如,String、Math 和 Scanner 等类都是被 final 修饰的,目的是供我们...

    Javaw基础课程笔记.zip

    Java 视频教程目录: day01、Java 语言发展史_JDK的安装_HelloWorld程序的编写_关键字_标识符_基本数据类型。 day02、Java 数据类型转换_...day11:Java final 关键字_内部类_成员内部类_局部内部类_匿名内部类。

    11【final、权限、内部类】1

    第一章 final关键字1.1 概述学习了继承后,我们知道,子类可以在父类的基础上改写父类内容,比如,方法重写。那么我们能不能随意的继承API中提供的类,改写其

    终于明白为什么要加 final 关键字了!

    作者:guanpj ...在开发过程中,由于习惯的原因...在 Java 8 之前,匿名内部类在使用外部成员的时候,会报错并提示 “Cannot refer to a non-final variable arg inside an inner class defined in a different method”:

    day11【final、权限、内部类】1

    第一章 final关键字1.1 概述学习了继承后,我们知道,子类可以在父类的基础上改写父类内容,比如,方法重写。那么我们能不能随意的继承API中提供的类,改写其

    尚硅谷_佟刚_Java基础_高级类特性

     1.static 关键字  2.final 关键字  3.抽象类(abstract 关键字)  4.接口(interface 关键字)  5.内部类

    旁路final:即时从源代码中删除final关键字,并允许模拟final方法和类。 它可以与任何测试工具(例如PHPUnit或Mockery)一起使用

    即时从源代码中删除最终关键字,并允许模拟最终方法和类。 它可以与任何测试工具(如PHPUnit,Mockery或。 安装 推荐的安装方式是通过Composer: composer require dg/bypass-finals --dev 它需要PHP版本7.1(在...

    观看韩顺平学习整理java的笔记到异常

    final关键字 6 抽象类 8 抽象类--模板设计模式 9 接口 9 内部类 11 匿名内部类的使用(重要!!!!!!!) 13 成员内部类的使用 13 静态内部类的使用 14 枚举的二种实现方式 14 自定义类实现枚举 14 使用 enum 关键字实现...

    【Java面试+Java学习指南】 一份涵盖大部分Java程序员所需要掌握的核心知识

    final关键字特性 Java类和包 抽象类和接口 代码块和代码执行顺序 Java自动拆箱装箱里隐藏的秘密 Java中的Class类和Object类 Java异常 解读Java中的回调 反射 泛型 枚举类 Java注解和最佳实践 JavaIO流 多线程 深入...

    JAVA编程基础_06面向对象高级特性.doc

    5. final关键字的使用:包括final关键字的应用和final关键字在继承中的作用。 类的继承是面向对象编程的核心机制之一,它允许一个类继承另一个类的所有属性和方法,从而实现代码的重用和简化编程。Java中只支持单...

    spark-Bench环境搭建文档.pdf

    * final 关键字的使用:在 Java 中,final 关键字用于修饰变量、方法和类。这里,我们需要将 clusters 声明为 final 类型,因为在内部类中只能使用 final 关键字修饰的外部变量。 * SparkBench 的搭建:SparkBench ...

    java语言关键字.pdf

    类和对象关键字 * abstract:用在类的声明中,指明一个类是不能被实例化的,但是可以被其它类继承。 * class:用来定义一个类,它包含有关对象的信息,包括名称、方法、属性和事件。 * extends:用来继承一个类,...

    php类中的$this,static,final,const,self这几个关键字使用方法

    本篇文章主要分项了一下关于php类中的$this,static,final,const,self这几个关键字使用方法。  $this  $this表示当前实例,在类的内部方法访问未声明为const及static的属性时,使用$this->value=’phpernote’...

    PHP100视频教程 22:PHP面向对象开发的学习(六)

    1、关键字 :final 用来定义类和方法的一个重要关键字,当定义类的时候该类将不能被继承,当用来定义方法的时候该方法将不能被重载2、关键字 : self 用来用类访问当前类中的内容的关键字,类似与$this关键字,但$...

    Java编程学习之java的不可变数据结构.doc

    许多开发人员认为,只要使用final关键字或val关键字就可以使对象不可变,但是这是一种误解。不可变数据结构具有许多优势,例如没有无效的状态、线程安全、易于理解的代码、更容易测试代码、可用于值类型等。 首先,...

    PHP100视频教程 22:PHP面向对象开发的学习(六).rar

     用来定义类和方法的一个重要关键字,当定义类的时候该类将不能被继承, 当用来定义方法的时候该方法将不能被重载 2、关键字 : self  用来用类访问当前类中的内容的关键字,类似与$this关键字,但$this是需要 ...

    java基础笔试题(标准答案已整理).docx

    final 关键字是 Java 中的修饰符,用于修饰类、接口、抽象类、方法和属性。final 关键字可以防止类被继承、方法被重写、变量被修改等。 十二、线程 线程是 Java 中的并发编程机制,用于实现多任务处理。线程可以...

Global site tag (gtag.js) - Google Analytics