JDK7中匿名内部类中使用局部变量要加final,JDK8中不需要,但jdk会默认加上final

今天看书的时候看到了局部内部类,书上说局部内部类可以访问局部变量,但是必须是final的。因为局部变量在方法调用之后就消失了,使用final声明的话该局部变量会存入堆中,和内部类有一样的声明周期。但是我写了一个局部内部类,竟然可以访问非final的局部变量,请问这是什么回事呢。ps:我的jdk是8 难道和这个有关系?

public class jubuneibulei {
public void p(int a, int b){

	class te{
		void print(){
			System.out.println(a);
		}
	}
	new te().print();
}
public static void main(String[] args) {
 new jubuneibulei().p(111, 222);

}
}

JDK8中不需要,但jdk会默认加上final
时间: 2024-12-16 21:05:30

JDK7中匿名内部类中使用局部变量要加final,JDK8中不需要,但jdk会默认加上final的相关文章

forEach与jdk8中的lambda, Stream

增强for循环 :forEach 反编译后可以看到实际使用的仍然是Iterator+while遍历的 forEach的优点是写法简单,缺点是不能使用xxx.remove(e)或者iter.remove(), 如果有删除的需要,还是老老实实用Iterator 对于数组的遍历,使用的是length遍历 参考: https://stackoverflow.com/questions/85190/how-does-the-java-for-each-loop-work https://docs.orac

JAVA中内部类(匿名内部类)访问的局部变量为什么要用final修饰?

本文主要记录:在JAVA中,(局部)内部类访问某个局部变量,为什么这个局部变量一定需要用final 关键字修饰? 首先,什么是局部变量?这里的局部是:在方法里面定义的变量. 因此,内部类能够访问某局部变量,说明这个内部类不是在类中定义的内部类,而是在方法中定义的内部类,称之为:局部内部类. 局部变量的作用域:局部变量是在某个方法中定义,当该方法执行完成后,局部变量也就消失了.[局部变量分配在JVM的虚拟机栈中,这部分内存空间随着程序的执行自动回收],也即:局部变量的作用域是在 “方法的范围内”.

关于zendframework中的Zend_Db_Expr(不自动加引号)

在zendframework中使用Db类时,框架会自动给sql语句添加引号以防止数据库攻击 ,这就导致了一个问题,用户无法使用zend db类使用mysql的内置函数(方法,存储过程等).好在zend框架提供了一个类Zend_Db_Expr,此类的构造函数会告诉框架不要对它所转化的类型进行添加引号的操作. 如: $select=$db->select(); $select->from("testtable","*"); $select->where

Java中成员变量、局部变量、局部内部类、局部内部类方法作用域问题。

public class A { String s = "outer class member variable"; //成员变量 public void Method() { //成员方法 final String s1 = "inner class variable"; //局部变量 class InnerClass { //局部内部类 public void innerMethod() { //局部内部类方法 int test = 20; System.out

在线聊天功能 实现中俄双语实时翻译 原创 加精!!

要做一个在线实时聊天系统,而且还要实时双语翻译(中.俄).头疼 先找了一个php在线客服系统 带源码的.看懂源码后在上面加翻译功能,一共耗时4天弄出来的. 代码如下: if(mb_detect_encoding($fdata,"UTF-8, GBK") != "UTF-8"){     //$fdata = mb_detect_encoding($fdata,"UTF-8, GBK")     $fdata = mb_convert_encodi

Android中使用WebView, WebChromeClient和WebViewClient加载网页

在android应用中,有时要加载一个网页,如果能配上一个进度条就更好了,而android 中提供了其很好的支持, 其中webView的一系列用法,比如 webView.getSettings().setJavaScriptEnabled(true); //设置可以使用javascriptwebView.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY); //设置滚动条风格webView.setHorizontalScrollBarEna

weex 加载 .xcassets 中的图片资源

背景 因为 .xcassets 中的图片资源只能通过 imageNamed: 方法加载,所以需要做一些特殊处理,才能提供给 Weex 使用(PS:纯属娱乐,因为 Weex 跨平台的特性,这种针对某一端做实现的方案实用价值并不大). 方案 观察 WeexSDK 发现有 WXImgLoaderProtocol 这个协议,这个协议包含了下面的方法: - (id<WXImageOperationProtocol>)downloadImageWithURL:(NSString *)url imageFr

VC++ 使用WebBrowser控件中html文件以资源形式加载

1 . . . . 2 3 //加载资源文件中的HTML,IDR_HTML1就是HTML文件在资源文件中的ID 4 wchar_t self_path[MAX_PATH] = { 0 }; 5 GetModuleFileName(NULL, self_path, MAX_PATH); 6 CString res_url; 7 res_url.Format(L"res://%s/%d", self_path, IDR_HTML1); 8 m_webbrowser.Navigate(res

Android插件化(二):使用DexClassLoader动态加载assets中的apk

Android插件化(二):使用DexClassLoader动态加载assets中的apk 简介 上一篇博客讲到,我们可以使用MultiDex.java加载离线的apk文件.需要注意的是,apk中的类是加载到当前的PathClassLoader当中的,如果apk文件过多,可能会出现ANR的情况.那么,我们能不能使用DexClassLoader加载apk呢?当然是可以的!首先看一下Doc文档. A class loader that loads classes from .jar and .apk