Java 为什么局部内部类对调用的局部变量一定要求为final类型
当局部内部类访问同属于一个方法内的局部变量一定要求这个局部变量为final类型,或者这个局部变量是事实不变的呢
解释:类new出来的对象是存在于堆当中的,而局部变量是跟着方法走的,存在于栈当中的,这就意味着对象的生命周期是大于堆中的方法的;
局部变量用完了之后就会被内存弹栈回收,若对象想在局部变量被回收完成后再调用局部变量,就需要对之前的局部变量进行拷贝再使用,
假若局部变量不是final型的,当num发生了变化,则会导致对象再次使用num的时候产生数据拷贝错误导致程序运行结果不正确,这是不容许发生的。
所以局部内部类在调用局部变量的时候,一定要求局部变量要为final类型的。
自Java 8开始,IDE允许省略final关键字,但是一定要注意:局部变量仍然要求不可以改变。
public class InnerLocalVariable {
public void methodOuter(){
class Inner{//因为你是局部内部类,只能在这个方法块内起作用,所以没有必要也不能写修饰类修饰权限
final int num=10;
public void method(){
System.out.println(num);
}
}
Inner inner=new Inner();
inner.method();
}
}
Java 为什么局部内部类对调用的局部变量一定要求为final类型 相关文章
Java方法详解
1.何为方法 Java方法是语句的集合,它们在一起执行一个功能 方法是解决一切问题的步骤的有序组合 方法包含于类或对象中 方法在程序中被创建,在其他地方被引用 设计方法的原则:方法的本意是功能块,就是实现某个功能的语句块的集合,我们设计方法的时候,最
JAVA基础(三)—— 输入输出处理
JAVA基础(三)—— 输入输出处理 1 输入解析 //Scanner获取输入import java.util.Scanner;Scanner s = new Scanner(System.in);String input = s.nextLine() ; s.close();String [] a = input.split(" ");//多次换行输入for (int i=0;i7;i++) String string
Java基础学习08--JDK1.8特性
1.Lambda表达式 Lambda表达式时特殊的匿名内部类,语法更简洁。它允许把函数作为一个方法的参数(函数作为方法参数传递),将代码像数据一样传递。 1 package com.example.jdk8; 2 3 import java.util.Comparator; 4 import java.util.TreeSet; 5 6 public cla
java web应用连接access数据库的方法
1、下载ucanaccess驱动jar包,下载地址是https://sourceforge.net/projects/ucanaccess/,将下载后解压得到的几个jar文件导入到web应用的WEB-INF/lib文件夹下。共有ucanaccess-5.0.1.jar、commons-lang3-3.8.1.jar、commons-logging-1.2.jar、hsqldb-2.5.0.j
你真的知道为什么要使用void(0)代替undefined吗
我们平时用到的\(\color{#FF3030}{undefined}\)只是\(\color{#FF3030}{window}\)对象下的一个属性。 Object.getOwnPropertyDescriptor(window, undefined);//{value: undefined, writable: false, enumerable: false, configurable: false} 也正是因为如此,
Java实现八大排序算法(转)
1、直接插入排序 ①、基本思想 通常人们整理桥牌的方法是一张一张的来,将每一张牌插入到其他已经有序的牌中的适当位置。在计算机的实现中,为了要给插入的元素腾出空间,我们需要将其余所有元素在插入之前都向右移动一位。 ②、算法描述 一般来说,插入排序
Shiro的 rememberMe 功能使用指导(为什么rememberMe设置了没作用)
原理解释 shiro对cookie做了什么 其实你设置了这个rememberMe之后shiro还是有做一点事情的,它会生成一个cookie值叫 rememberMe 并保存在你的浏览器里面,而且这个参数会随着你调用 subject.logout() 会被自动清除。这个参数的值是一串很长的Base64加密过的
Redis学习(六)----主从复制、读写分离
1、为什么要主从复制、读写分离 Redis在作为缓存的时候,随着项目访问量的增加,对Redis服务器的操作也越加频繁,虽然Redis读写速度都很快,但是一定程度上也会造成一定的延时,甚至出现宕机的可能性,这时候就出现了“单点故障”,那么为了解决访问量大的问
前端异常处理
#前言为什么要处理前端异常,有以下几方面的原因:1.提高代码健壮性:对于开发人员来说,这点很重要,代码的健壮性越好,系统越不容易崩溃;2.提升系统稳定性:异常会导致正常流程无法进行、页面样式错乱、崩溃甚至白屏等问题,严重的会给业务造成损失;3.增
JavaScript遍历对象的几种方法
作为经常使用对象的我们,在有些业务场景下需要对对象的属性进行遍历,下面我总结了几种常用的 JS 遍历对象属性的方法。 太长不看版: JS 遍历对象的主要方法有 for...in 、Object.keys()、Object.getOwnPropertyNames()、Object.getOwnPropertySymbols()、R