<%! int a=0; %> 与<% int a=0; %> 的区别
209
<%! int a=0; %> 与<% int a=0; %> 的区别在于:1.所属范畴不同;2.声明的变量类型不同。所属范畴不同是指,从jsp页面的语法来看,<%! int a=0; %> 属于声明的范畴,而<% int a=0; %>属于脚本片段的范畴。
1.所属范畴不同
从jsp页面的语法角度分析:declaration 声明基本语法:<%! %>;scriptlet 脚本片段基本语法:<% 程序代码区%>。因此,<%! int a=0; %>属于声明的范畴,而<% int a=0; %>属于脚本片段的范畴。
2.声明的变量类型不同
JSP运行时,实际上是转换成一个servlet类,<%! %> 里声明的变量就是它的属性,任何对该属性的改变都会保存在该类的对象中,那就是为什么jsp页面不管执行多少次,上一次对该全局变量执行的结果都是下一次执行的初值。而<% %> 里声明的变量则是作为局部变量,当JSP执行很多次时,调用多少次就会重新初始化多少次。
换种方式理解:当jsp编译为servlet时,<%! int a = 0; %> 声明的是一个成员变量,且a是作为类的属性和方法存在的;而<% int a = 0; %>声明的是某个方法里的局部变量,不能声明方法。
延伸阅读
成员变量和局部变量的区别
成员变量是指Static修饰成为类变量或静态变量,还有就是方法外的变量,其生命周期与类相同;而局部变量就是方法中的变量,生命周期就是在此方法中。但很多人学习都是先学习的C语言,C语言中存在全局变量这个概念,所以,大家对于Java中的成员变量有时候也称之为全局变量,不过需要注意的是:使用static 关键字进行声明的变量叫做全局变量;在函数外面定义的变量叫做成员变量。
成员变量和局部变量的主要区别如下:
- 成员变量定义在类中,在整个类中都可以被访问;局部变量只定义在局部范围内,如:函数内,语句内等,只在所属的区域有效。
- 成员变量随着对象的建立而建立,随着对象的消失而消失,存在于对象所在的堆内存中;局部变量存在于栈内存中,作用的范围结束,变量空间会自动释放。
- 成员变量有默认初始化值;局部变量没有默认初始化值。

