首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Java中的内部类与匿名内部类详解

文章目录 内部类 什么是内部类 成员内部类 访问特点 匿名内部类 前提 格式 使用方式 内部类 什么是内部类 将一个类A定义在另一个类B里面,里面的那个类A就称为内部类,B则称为外部类。...代码举例: class Computer { //外部类 class Cpu { //内部类 } } 访问特点 内部类可以直接访问外部类的成员,包括私有成员。...外部类要访问内部类的成员,必须要建立内部类的对象。...heart.jump(); } } 输出结果: 心脏在跳动 心脏不跳了 内部类仍然是一个独立的类,在编译之后会内部类会被编译成独立的.class文件,但是前面冠以外部类的类名和符号 。...比如,PersonHeart.class 匿名内部类 匿名内部类 :是内部类的简化写法。它的本质是一个带具体实现的父类或者父接口的 匿名的 子类对象。开发中,最常用到的内部类就是匿名内部类了。

1.5K30

内部类, 静态内部类, 局部类, 匿名内部类的解析和区别

而内部类分为成员内部类,局部内部类(Local Classes)和匿名内部类(Anonymous Classes)。...所以内部类的成员变量/方法名可以和外部类的相同。 内部类有什么作用?...而外部类要访问内部类的所有成员变量和方法,内需要通过内部类的对象来获取。(谁叫它是亲儿子呢?) 要注意的是,成员内部类不能含有static的变量和方法。...局部类不仅可以访问外部类的所有成员,还可以访问方法体的局部变量,但必须是final修饰的局部变量。 为什么局部类访问局部变量,变量必须加上final?...这里Java采用了一种copy local variable的方法实现,定义为final的变量,会拷贝一份存到局部内部类中,后续使用持续维护这个对象在生命周期内,所以可以继续访问。

2.5K11
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    java中的匿名内部类总结

    匿名内部类也就是没有名字的内部类 正因为没有名字,所以匿名内部类只能使用一次,它通常用来简化代码编写 但使用匿名内部类还有个前提条件:必须继承一个父类或实现一个接口 实例1:不使用匿名内部类来实现抽象方法...这个时候就引入了匿名内部类 实例2:匿名内部类的基本实现 abstract class Person { public abstract void eat(); } public class...这样便可以省略一个类的书写 并且,匿名内部类还能用于接口上 实例3:在接口上使用匿名内部类 interface Person { public void eat(); } public...,那么其子类中的方法都可以使用匿名内部类来实现 最常用的情况就是在多线程的实现上,因为要实现多线程必须继承Thread类或是继承Runnable接口 实例4:Thread类的匿名内部类实现 public...}; Thread t = new Thread(r); t.start(); } } 运行结果:1 2 3 4 5 文章转载于:java中的匿名内部类总结

    93130

    内部类只能访问final的局部变量_java内部类引用外部变量

    因为在JDK8之前,如果我们在匿名内部类中需要访问局部变量,那么这个局部变量必须用final修饰符修饰。这里所说的匿名内部类指的是在外部类的成员方法中定义的内部类。...既然是在方法中创建的内部类,必然会在某些业务逻辑中出现访问这个方法的局部变量的需求。那么我们下面就会研究这种情况。 为什么java语法要求我们需要用final修饰呢?...,是因为在底层将这个局部变量的值传入到了匿名内部类中,并且以匿名内部类的成员变量的形式存在,这个值的传递过程是通过匿名内部类的构造器完成的。...这里举个栗子:原先局部变量指向的是对象A,在创建匿名内部类后,匿名内部类中的成员变量也指向A对象。但过了一段时间局部变量的值指向另外一个B对象,但此时匿名内部类中还是指向原先的A对象。...那现在我们来谈一谈JDK8对这一问题的新的知识点。在JDK8中如果我们在匿名内部类中需要访问局部变量,那么这个局部变量不需要用final修饰符修饰。

    94720

    Java中,匿名内部类在开发中的使用以及匿名内部类的面试题

    匿名内部类在开发中的使用   我们在开发的时候,会看到抽象类,或者接口作为方法的形式参数。   而这个时候,我们知道实际需要的是一个子类的对象。...如果该方法仅仅调用一次,我们就可以使用匿名内部类的格式进行简化。   Android开发中这种格式见得多,   JavaEE开发中见得少。 为什么呢?...因为匿名内部类的好处是:     匿名内部类用完之后就是垃圾(即只能用一次),就可以立即被垃圾回收器回收,     栈内存没有东西指向你,Android的手机内存小,要及时让这个对象被回收。...示例代码如下: 1 /* 2 匿名内部类在开发中的使用: 3 Android开发中这种格式见得多, 4 JavaEE开发中见得少。...: 42 //匿名内部类的本质是该类的子类或者实现该接口的实现类(子类)的匿名对象。

    1.5K20

    java匿名内部类变量要使用final的原因(转载)

    闭包的结构,如果用λ演算表达式来写,就是多参数的Currying技术。 >λx.λy.x+y 但在Java中我们看不到这样的结构。因为Java主流语法不允许这样的直接的函数套嵌和跨域访问变量。...内部类(Inner Class)通过包含一个指向外部类的引用,做到自 由访问外部环境类的所有字段,变相把环境中的自由变量封装到函数里,形成一个闭包。 4....别扭的匿名内部类 但Java匿名内部类就做得比较尴尬。下面这个例子中,getAnnoInner负责返回一个匿名内部类的引用。...而只有后者才能保持匿名内部类和外部环境局部变量保持同步。 但Java又不肯明说,只能粗暴地一刀切,就说既然内外不能同步,那就不许大家改外围的局部变量。 5....其他和匿名内部类相似的结构 《Think in Java》书里,只点出了匿名内部类来自外部闭包环境的自由变量必须是final的。但实际上,其他几种不太常用的内部类形式,也都有这个特性。

    1.4K00

    【小家java】匿名内部类为什么只能使用外部final的变量

    1、概述 各位都知道,匿名内部类在使用的时候需要使用外部的变量,该变量必须被final修饰,否则编译报错。实际使用中,有时候确实还给我们造成了不少麻烦,可大家可曾想过这是为什么吗?...用final修饰的成员变量表示常量,存在内存中的常量区(常量区位于堆区)(jvm内存结构),放在常量区里面,所以效率上相对来说会高那么一点。 为什么匿名内部类用的变量必须final呢?...因为Java通过类的封装规范了类与类之间的访问权限,而内部类却打破了这种规范,它可以直接访问自身所在的外部类里私有成员,而且自身还可以创建相同的成员,从作用域角度看,内部类的新成员修改了什么值,外部方法也是不知道...,因为程序的运行由外而内的,所以外部根本无法确定内部这时到底有没有这个东西。...对final的使用补充解释,可参考博文java中final关键字使用详解 备注:匿名内部类在编译时也是会生成一个.class文件的哦。具体可参考我做的一个例子:匿名内部类生成.class文件吗?

    92340

    Java的内部类和匿名类 , 您了解过吗?

    最初在大二入门Java的时候,我就了解过Java的匿名类和内部类,那时候觉得这些都是理论性的东西,实际开发不一定能用到,于是就淡化了。...,但是从Java语言开发规范角度来讲,每一个实体类都必须满足封装原则,简单来讲,实体类的成员变量必须为私有类型,并且提供 set 和 get 方法让外部获取、修改变量。...如果你对Java的访问权限不熟悉,可以看一下我这篇文章《一文搞懂Java的 构造方法 和 访问权限》 内部类主要有四种,分别是成员内部类、方法内部类、静态内部类、匿名内部类。...(图片来源于网络,侵删) ---- 2.1 成员内部类 成员内部类,顾名思义就是内部类作为成员存在于类中,和成员变量、成员方法同级。...比如下面这个 People 类,包含了一个内部类 Book,该类和成员变量 userName 、userAge 同级。

    28720

    java内部类----安全问题-----访问外围类的私有变量

    我们知道如果一个变量是私有的,它应该就不希望别人去访问它。 隐秘的访问方法需要拥有包的可见性,所有攻击代码需要与被攻击类放在同一个包中。...当使用了内部类的时候,编译器做了这样一件事: 它在外围类添加了一个静态方法  static boolean access$0(外部类); 内部类方法将调用这个函数 这个是有风险的,因为任何人都可以通过access...$0方法很容易的读取到外围类的私有域 黑客可以使用十六进制编辑器轻松创建一个用虚拟机指令调用这个函数的类文件。...结论就是: 如果内部类访问了私有数据域,就有可能通过附加在外围类所在的包中的其他类访问它们。 请慎用!

    1.5K20

    第38节:hashCode()与toString()与equals()函数的作用,内部类和匿名内部类

    System.out.println(u1.equals(u2)); System.out.println(u1.equals(u3)); } } // false // true 内部类和匿名内部类...A a = new A(); // 内部类的表示 A.B new A().new B() A.B b = new A().new B(); } } 内部类可以直接访问外部类,但是外部类要访问内部类中的成员变量...: 静态内部类;局部内部类;成员内部类;匿名内部类 class A{ // 外部类的变量 int i; class B{ // 内部类的变量 int j; // 内部类的方法...静态内部类只能访问外部类的静态成员和本内部类的成员;且不能访问外部类的非静态成员。 局部内部类: 局部,在一个方法中内的类,为局部内部类,局部内部类不能用访问修饰符,作用域在定义的它的区域内。...局部内部类可以访问外部类的成员属性和静态属性,也可以访问final修饰的局部变量,但不能访问非final的局部变量。

    61520

    为什么局部内部类访问外边的局部变量必须为final

    6.局部内部类访问外边的局部变量时,此变量必须为final类型  马克-to-win:由于技术方面的限制,java的设计者们做出如下语法规定:局部内部类访问外边的局部变量时,此变量必须为final类型...,(为什么请参考我的参考目录)马克-to-win:否则会报一个错误:Cannot refer to a non-final variable i inside an inner class defined...in a different method  例2.6 class ShellMark_to_win {    int x = 100;//x是类变量, 内部类访问时不用加final。    ...void test() {         for (int i = 0; i < 2; i++) { /*马克-to-win:下面的y和str是局部变量,内部类访问时必须加final  */             ...            class Core {                 void display() {                     System.out.println("外部类的

    60430

    java中匿名对象和匿名类的简单理解

    也就是说,在类中的全局变量是随着类的加载而加载,这样,在使用new TestAnonymousClass().name时,由于是匿名的,类就终结了,因此上一个初始化name属性的“tuo”就消失了。...如果通过继承父类来创建匿名内部类时,匿名内部类将拥有和父类相似的  构造器,此处的相似指的是拥有相同的形参列表。...(3)、在Java 8之前,Java要求被局部内部类、匿名内部类访问的局部变量必须使用final修饰,从Java 8开始这个限制取消  了,Java 8更加智能:如果局部变量被匿名内部类访问,那么该局部变量相对于自动使用了...、局部内部类允许访问非final的局部变量 */ System.out.println(age); }...}; a.test(); } } Ps:Java 8将这个功能称为“effectively final”,它的意思是对于被匿名内部类访问的局部变量

    98651

    Flask模板中可以直接访问的特殊变量和方法

    Flask中的特殊变量和方法 在Flask中,有一些特殊的变量和方法是可以在模板文件中直接访问的。...request常用的属性如下: 属性 说明 类型 data 记录请求的数据,并转换为字符串 * form 记录请求中的表单数据 MultiDict args 记录请求中的查询参数 MultiDict cookies...记录请求中的cookie信息 Dict headers 记录请求中的报文头 EnvironHeaders method 记录请求使用的HTTP方法 GET/POST url 记录请求的URL地址 string...访问hello1消费使用flash消息 ? 7.刷新hello1或者访问hello2页面,查看flash消息是否存在 ? ?...可以看到flash的消息只会显示一次,刷新或者访问其他视图的时候,只要被消费了就不会再出现了。

    2.2K10

    你知道匿名内部类、Lambda表达式为嘛只能使用外部final的变量吗?

    作者:A哥(YourBatman) 目录 前言 正文 为什么匿名内部类用的变量必须final呢? 使用场景 总结 前言 各位小伙伴大家好,我是A哥。...各位都知道,匿名内部类在使用的时候需要使用外部的变量,该变量必须被final修饰,否则编译报错。实际使用中,有时候确实还给我们造成了不少麻烦,可大家可曾想过这是为什么吗?...用final修饰的成员变量表示常量,存在内存中的常量区(常量区位于堆区),放在常量区里面,所以效率上相对来说会高那么一点。 为什么匿名内部类用的变量必须final呢?...因为Java通过类的封装规范了类与类之间的访问权限,而内部类却打破了这种规范,它可以直接访问自身所在的外部类里私有成员,而且自身还可以创建相同的成员,从作用域角度看,内部类的新成员修改了什么值,外部方法也是不知道...,因为程序的运行由外而内的,所以外部根本无法确定内部这时到底有没有这个东西。

    1.2K70

    java中匿名内部类的使用(仅限介绍实际使用的两种方法)

    使用的场景: 匿名内部类可以使你的代码更加简洁,你可以在定义一个类的同时对其进行实例化。它与局部类很相似,不同的是它没有类名,如果某个局部类你只需要用一次,那么你就可以使用匿名内部类。...使用步骤 定义匿名内部类 匿名内部类的语法 访问作用域的局部变量、定义和访问匿名内部类成员 匿名内部类实例 两种案例类型 实现接口的匿名类 匿名子类(继承父类) 运行结果: 运行结果: 匿名内部类访问其外部类方法...动物 布谷鸟 从以上两个实例中可知,匿名类表达式包含以下内部分: 操作符:new; 一个要实现的接口或要继承的类,案例一中的匿名类实现了HellowWorld接口,案例二中的匿名内部类继承了Animal...父类; 一对括号,如果是匿名子类,与实例化普通类的语法类似,如果有构造参数,要带上构造参数;如果是实现一个接口,只需要一对空括号即可; 一段被"{}“括起来类声明主体; 末尾的”;"号(因为匿名类的声明是一个表达式...,是语句的一部分,因此要以分号结尾)。

    49320
    领券