名词解释
应用场景
推荐的腾讯云相关产品
产品介绍链接
不能访问外层方法中的本地变量。除非变量是 final,或是数组形式(不受编译器控制) 如果内部类的名称和外面能访问的名称相同,则会把名称覆盖掉。...匿名类中可以包含的东西有:字段、方法、实例初始化代码、本地类 匿名类中不可以包含的东西有: // 匿名类示例 public class Test { public void test() {...在一个方法中定义的。在任何“可以声明局部变量”的地方,都可以声明局部类。...可以访问其外部类的成员 不能访问该方法的局部变量,除非是 final 局部变量。...public class Test { { class AA{}//块内局部类 } public Test(){ class AA{}//构造器内局部类
1.4 成员变量的缺省值 在 C++11 中,可以在类内为成员变量赋予缺省值,这样即使构造函数没有显式赋值,也会使用这些默认值: class Person { private: int _age...如果成员变量未在初始化列表中显式初始化,则有两种情况: 成员变量在类中声明时有缺省值:按照缺省值初始化。...成员变量在类中声明时没有缺省值: 对于内置类型成员,初始化为随机值,可能是默认值 0 等,具体行为依赖于编译器。...(2).初始化顺序不一致 初始化顺序与成员变量声明顺序不一致时,可能导致未定义行为,尤其在成员变量之间存在依赖关系时更需谨慎。...五、内部类 内部类是定义在另一个类中的类。它通常用于封装两者之间的紧密关系,外部类可以控制内部类的行为。内部类在外部类中定义时,默认情况下可以访问外部类的私有成员。
然而,从JavaSE8开始,本地类可以访问封闭块的最终或有效最终的本地变量和参数。一个变量或参数,其值在初始化后从未改变,实际上是最终的。...因此,Java编译器会生成类似于“从内部类引用的本地变量必须是最终的或有效的最终的”的错误消息,其中内部类PhoneNumber尝试访问numberLength变量: if (currentNumber.length...阴影和局部类 局部类中的类型声明(例如变量)在封闭范围内的影子声明中具有相同名称。See Shadowing for more information....匿名类对其成员也有与本地类相同的限制: 不能在匿名类中声明静态初始化器或成员接口。 匿名类可以有静态成员,前提是它们是常量变量。...x是指成员变量FirstLevel.x。 然而,与本地类和匿名类一样,lambda表达式只能访问封闭块的最终或有效最终的局部变量和参数。在本例中,变量z实际上是final;其值在初始化后从未更改。
本节涵盖以下主题: 声明匿名类 匿名类的语法 访问封闭范围的本地变量,并声明和访问匿名类的成员 匿名类示例 声明匿名类 虽然本地类是类声明,匿名类是表达式,这意味着你在另一个表达式中定义类...以下示例,HelloWorldAnonymousClasses,在本地变量frenchGreeting和spanishGreeting的初始化语句中使用了匿名类,但在变量englishGreeting的初始化中使用了本地类...访问封闭范围的本地变量,并声明和访问匿名类的成员 像本地类一样,匿名类可以捕获变量;它们对封闭范围的本地变量具有相同的访问权限: 匿名类可以访问其封闭类的成员。...匿名类无法访问其封闭范围中未声明为final或有效final的本地变量。 像嵌套类一样,在匿名类中声明类型(如变量)会遮蔽封闭范围中具有相同名称的任何其他声明。有关更多信息,请参阅遮蔽。...匿名类在成员方面与局部类具有相同的限制: 您不能在匿名类中声明静态初始化程序或成员接口。 一个匿名类可以有静态成员,只要它们是常量变量。
使用 static 修饰的初始化块,通常用来对类变量做初始化操作、加载资源、加载配置文件等。 随着所在类的加载而执行(只执行一次)。 在同类中优先于 main 方法执行。...静态初始化块(执行顺序与它们在源代码中的排列顺序相同) 实例变量的初始化 及 普通初始化块(执行顺序与它们在源代码中的排列顺序相同) 构造器(先加载父类的字节码文件并调用父类的构造器) main 方法...三、一些类 1、内部类(Inner Classes) 说到类与类之间的关系,很多人首先想到的可能是并列关系,其实还有嵌套关系,比如内部类。...1.2 局部内部类 概念:定义在一个方法或者一个作用域里面的类,它和成员内部类的区别在于局部内部类的访问仅限于方法内或者该作用域内。...,定义在getWoman这个方法内 int age =0; } return new Woman(); } } 1.3 匿名内部类 匿名类是指没有类名的内部类
,如果一个成员变量被我们显式的在初始化列表中写了,那么编译器就不在初始化列表中生成该成员变量的默认初始化了; 每一个类对象的成员变量的定义都发生在构造函数的初始化列表中; 在调用构造函数时,先进行初始化列表中的操作...初始化列表中 变量实际定义初始化 的顺序与变量的声明顺序相同,也就是说变量声明的顺序决定了变量初始化列表初始化的顺序,而与初始化列表中变量书写的顺序无关 这可能与编译器的底层实现有关 class...)都会经过初始化列表, 我们也可以显式的在初始化列表中写, 也就是说,不管我们在初始化列表中是否显式对类成员变量进行定义初始化,成员变量都会在初始化列表被定义初始化 类对象定义时,类成员变量整体 定义初始化...细化类成员变量的 定义初始化: 类成员变量的 定义初始化 发生在初始化列表阶段 即类成员变量在初始化列表进行 定义初始化 而在构造函数内进行的是类成员变量的赋值和其他必要的操作,故在构造函数内进行的不能称之为...d的整数部分,整型引用变量引用的是这个匿名临时引用变量;同时匿名临时变量具有常性,所以整型引用变量rd需要const修饰; 单参数构造函数的隐式类型转换 在C++98中,支持单参数构造函数的隐式类型转换
要点 匿名类的概念和用法 语言规范以及语言的横向对比等 内存泄漏的切入点 总结 没有人类认知意义上的名字 只能继承一个父类或实现一个接口 父类是非静态的类型,则需父类外部实例来初始化 如果定义在非静态作用域内...,会引用外部类实例 只能捕获外部作用域内的final变量 创建时只有单一方法的接口可以用Lambda转换 a.匿名内部类的名字 表面上是没有引用名的, 但其实是有用于定位的“名字”, ?...**即使使用Java 10 的var关键字来定义, 只能继承一个父类或实现一个接口 >- 父类是非静态的类型,则需父类外部实例来初始化 >- 如果定义在非静态作用域内,会引用外部类实例 >-...c.匿名内部类的构造方法(关注:匿名内部类对外部类的引用) 匿名内部类会有外部类的引用, 这个可能导致内存泄漏! 匿名内部类的构造方法是 编译器 帮忙定义的!!!...; 00 01 10 11 捕获 匿名内部类 所在方法内(外部作用域) 的 局部变量快照的情况 匿名内部类重写父类方法时,引用到的外部方法体内的局部final变量 通常,要求要被捕获的局部变量
, 参数的类型是外部类的类型, 在构造方法内部使用这个参数为1中添加的成员变量赋值; 3 在调用内部类的构造函数初始化内部类对象时, 会默认传入外部类的引用。...//所有普通的内部类与类中的一个变量是类似的。静态内部类则与静态成员类似。 } } 内部类的加载 可能刚才的例子中没办法直观地看到内部类是如何加载的,接下来用例子展示一下内部类加载的过程。...与局部变量类似,局部内部类不能有访问说明符,因为它不是外围类的一部分,但是它可以访问当前代码块内的常量,和此外围类所有的成员。...内部类初始化 我们一般都是利用构造器来完成某个实例的初始化工作的,但是匿名内部类是没有构造器的!那怎么来初始化匿名内部类呢?使用构造代码块!利用构造代码块能够达到为匿名内部类创建一个构造器的效果。...其实可以这样想,当方法执行完毕后,局部变量的生命周期就结束了,而局部内部类对象的生命周期可能还没有结束,那么在局部内部类中访问局部变量就不可能了,所以将局部变量改为final,改变其生命周期。
(即方法内的变量),但是变量必须是final的 System.out.println(j); //System.out.println(i); //如果内部类中有与外部类同名的变量,直接用变量名访问的是内部类的变量...如果在匿名类中定义成员变量,你同样能够对其执行初始化操作: public class Parcel8 { // Argument must be final to use inside...如果只是简单地给一个成员变量赋值,那么此例中的方法就可以了。但是,如果你想做一些类似构造器的行为,该怎么办呢?在匿名类中不可能有已命名的构造器(因为它根本没名字!)...,但通过实例初始化,你就能够达到为匿名内部类“制作”一个构造器的效果。...因为i 被传递给匿名类的基类的构造器,它并不会在匿名类内部被直接使用。下例是带实例初始化的“parcel”形式。注意dest()的参数必须是final,因为它们是在匿名类内被使用的。
我们先考虑这样一个问题: 当test方法执行完毕之后,变量a的生命周期就结束了,而此时Thread对象的生命周期很可能还没有结束,那么在Thread的run方法中继续访问变量a就变成不可能了...这个过程是在编译期间由编译器默认进行,如果这个变量的值在编译期间可以确定,则编译器默认会在匿名内部类(局部内部类)的常量池中添加一个内容相等的字面量或直接将相应的字节码嵌入到执行字节码中。...这样一来,匿名内部类使用的变量是另一个局部变量,只不过值和方法中局部变量的值相等,因此和方法中的局部变量完全独立开。 ...Test$1的构造器含有两个参数,一个是指向外部类对象的引用,一个是int型变量,很显然,这里是将变量test方法中的形参a以参数的形式传进来对匿名内部类中的拷贝(变量a的拷贝)进行赋值初始化。 ...也就说如果局部变量的值在编译期间就可以确定,则直接在匿名内部里面创建一个拷贝。如果局部变量的值无法在编译期间确定,则通过构造器传参的方式来对拷贝进行初始化赋值。
, 参数的类型是外部类的类型, 在构造方法内部使用这个参数为1中添加的成员变量赋值; 3 在调用内部类的构造函数初始化内部类对象时, 会默认传入外部类的引用。...//所有普通的内部类与类中的一个变量是类似的。静态内部类则与静态成员类似。 } } 内部类的加载 可能刚才的例子中没办法直观地看到内部类是如何加载的,接下来用例子展示一下内部类加载的过程。...与局部变量类似,局部内部类不能有访问说明符,因为它不是外围类的一部分,但是它可以访问当前代码块内的常量,和此外围类所有的成员。...//因为只有在方法调用时才能进行类加载和初始化。 } } } 匿名内部类 简单地说:匿名内部类就是没有名字的内部类,并且,匿名内部类是局部内部类的一种特殊形式。...内部类初始化 我们一般都是利用构造器来完成某个实例的初始化工作的,但是匿名内部类是没有构造器的!那怎么来初始化匿名内部类呢?使用构造代码块!利用构造代码块能够达到为匿名内部类创建一个构造器的效果。
局部变量 —— 引用类型 引用类型的局部变量,被 fifinal 修饰后,只能指向一个对象,地址不能再更改。但是不影响对象内 部的成员变量值的 修改,代码如下: 3....成员变量 成员变量涉及到初始化的问题,初始化方式有两种,只能二选一: 显示初始化; 构造方法初始化。 被fifinal修饰的常量名称,一般都有书写规范,所有字母都大写。...开发中,最常用到的内部类就是匿名内部类了。以接口举例,当你使用一个接口时,似乎得做如下 几步操作, 1. 定义子类 2. 重写接口中的方法 3....调用重写后的方法 我们的目的,最终只是为了调用方法,那么能不能简化一下,把以上四步合成一步呢?匿名内部类 就是做这样的快 捷方式。...所以,如果想扩展更强大 技能,我们在 Role 中,可以增加接口作为成员变量,来设置不同的技能。
final关键字:final:最终,终极 final:作用:修饰类,变量,方法、成员变量的访问 1.final修饰变量: final修饰局部变量: 把这个局部变量 变成一个厂里,这个厂里只能被赋值一次...final修饰成员变量: 要求这个成员变量 在创建对象之前必须初始化 所以final修饰的成员变量 第一直觉赋值 第二构造方法赋值 但是也只能赋值一次 2.final修饰的类:(太监类) ,不能被子类继承...* * 特点1.在同一个类中 静态代码块是优先于构造方法执行,静态代码块优先于main方法 * 而且只会执行一次,第一次使用到(可能是创建对象,也可能是调用对象的静态成员)这个类就是会执行 在...匿名内部类: 一种语法格式,用来快速创建抽象类的子类或者接口的实现类对象 * * 1.创建一个抽象类 * 2.用一个子类继承抽象类 * 3.创建子类的对象 //dd.eat(); //匿名内部类的第一种写法...3.是否可以在static环境中访问非static变量? 答:static变量在java中是属于类的,它在所有实例中的值都是一样的。 当java虚拟机载入的时候会对static变量进行初始化。
2.1 内部类 在JAVA中,内部类可以访问到外围类的变量、方法或者其它内部类等所有成员(即使它被定义成private了)但是外部类不能访问内部类中的变量。...md.runThread().run(); } } 2.3 匿名内部类 在Java中,方法返回一个被直接实例化的对象则称为匿名内部类。...匿名内部类没有类名,但是拥有更加简介的代码块、并且同样需要重写接口类中的方法。匿名内部类同样属于内部类的一种。...2.5 类的初始化 在Java中,类内允许使用 static 块 或 initializer 块 来对类进行数据初始化,在类被加载的时候会自动执行其内部的代码。...同样的,在闭包中也同样可以使用这两个初始化代码块来对闭包内部类进行初始化,其初始化的顺序也会按照代码编写顺序来执行。
编译器会为内部类的构造方法添加一个参数,进行初始化, 参数的类型就是外部类的类型,如下: innerclass.Outer$Inner(innerclass.Outer); 成员内部类中的Outter...我们在内部类innerMethod方法中,可以看到以下这条指令: 3: bipush 10 它表示将常量10压入栈中,表示使用的是一个本地局部变量。...其实,如果一个变量的值在编译期间可以确定(demo中确定是10了),则编译器会默认在匿名内部类(局部内部类)的常量池中添加一个内容相等的字面量或直接将相应的字节码嵌入到执行字节码中。...我们看到匿名内部类Outer$1Inner的构造器含有两个参数,一个是指向外部类对象的引用,一个是int型变量,很显然,这里是将变量innerMethod方法中的形参a以参数的形式传进来对匿名内部类中的拷贝...(变量a的拷贝)进行赋值初始化。
同时注意,内部静态类Person只在类StaticTest 范围内可见,若在其它类中引用或初始化,均是错误的。...3、另外,就是要注意,内部类Inner及InnterTwo只在类Outer的作用域内是可知的,如果类Outer外的任何代码尝试初始化类Inner或使用它,编译就不会通过。...同时,内部类的变量成员只在内部内内部可见,若外部类或同层次的内部类需要访问,需采用示例程序中的方法,不可直接访问内部类的变量。 四、方法内部类 顾名思义,把类放在方法内。...但是该方法结束之后, 在方法内创建的内部类对象可能仍然存在于堆中!例如,如果对它的引用被传递到其他某些代码,并存储在一个成员变量内。...Car引用变量不是引用Car对象,而是Car匿名子类的对象。 B、接口式的匿名内部类。
2.局部内部类 局部内部类是定义在一个方法或者一个作用域里面的类,它和成员内部类的区别在于局部内部类的访问仅限于方法内或者该作用域内。...根据上图可知,test方法中的匿名内部类的名字被起为 Test$1。 上段代码中,如果把变量a和b前面的任一个final去掉,这段代码都编译不过。...这样一来,匿名内部类使用的变量是另一个局部变量,只不过值和方法中局部变量的值相等,因此和方法中的局部变量完全独立开。 ...我们看到匿名内部类Test$1的构造器含有两个参数,一个是指向外部类对象的引用,一个是int型变量,很显然,这里是将变量test方法中的形参a以参数的形式传进来对匿名内部类中的拷贝(变量a的拷贝)进行赋值初始化...也就说如果局部变量的值在编译期间就可以确定,则直接在匿名内部里面创建一个拷贝。如果局部变量的值无法在编译期间确定,则通过构造器传参的方式来对拷贝进行初始化赋值。
先声明,后使用 1.3 变量都有其对应的作用域 2.不同点: 2.1 在类中声明的位置的不同 属性:直接定义在类的一对{}内 局部变量:声明在方法内、方法形参、代码块内、构造器形参、构造器内部的变量...对对象的属性等进行初始化 如果一个类中定义了多个非静态代码块,则按照声明的先后顺序执行 非静态代码块内可以调用静态的属性、静态的方法,或非静态的属性、非静态的 5.内部类 在Java中,可以将一个类定义在另一个类里面或者一个方法里边...3.匿名内部类 (1)一般使用匿名内部类的方法来编写事件监听代码; (2)匿名内部类是不能有访问修饰符和static修饰符的; (3)匿名内部类是唯一一种没有构造器的类; (4)匿名内部类用于继承其他类或是实现接口...(3)外部类加载时并不需要立即加载内部类 内部类与静态内部类的区别 静态内部类相对与外部类是独立存在的,在静态内部类中无法直接访问外部类中的变量、方法。...在Java中,可以将一个类定义在另一个类里面或者一个方法里边,这样的类称为内部类,广泛意义上的内部类一般包括四种:成员内部类,局部内部类,匿名内部类,静态内部类 。
领取专属 10元无门槛券
手把手带您无忧上云