‘壹’ 在java中,为什么静态区域的方法不能调用非静态区域的方法
理解起来很简单,因为两者的加载时机不同,静态区的先加载,非静态区的后加载。
具体说:
静态区的方法,在虚拟机加载类文件(.class)的时候,就加载了,而非静态区的方法,是直到有对象被new出来的时候才会加载。
也就是说,如果在非静态区的方法加载之前就调用了它,显然是无法调用到的。所以才会规定静态方法中不能调用非静态的。
‘贰’ java 静态常量加载时机问题
1.只有运行起来的程序才有内存一谈,编译只是把源代码翻译成字节码的过程,字节码是存放在硬盘上的文件,只有当字节码加载到JVM中即类被加载时,才有内存的概念,JVM才会为类中的静态常量分配内存。
2.当类被加载时,其中的所有静态域都会被分配内存,静态方法会被装载。
‘叁’ java静态方法(方法前冠以static)和实例方法(未冠以static)的区别
静态方法(方法前冠以static)和实例方法(前面未冠以static)的区别
调用静态方法或说类方法时,可以使用类名做前缀,也可以使用某一个具体的对象名;通常使用类名。
非static的方法是属于某个对象的方法,而static的方法是属于整个类的,不被任何一个对象单独拥有;
由于static方法是属于整个类的,所以它不能操纵和处理属于某个对象的成员变量,而只能处理属于整个类的成员变量,也即,static方法只能处理static域或静态方法。实例方法可以访问实例域, 静态域或静态方法, 记住都行。
声明为static的方法有以下几条限制: 1.它们仅能调用其他的static方法。
2.它们只能访问static数据。
3.它们不能以任何方式引用this或super(关键 字super与继承有关,在下一章中描述)。
static method Have No this Reference
All instance methods have a hidden parameter—this
So,
Static method can’t access instance methods and fields; it can only
invoke other static class
members.It can access class members only.
instance can use static method.
Instance methods:
If a method is declared without the static modifier keyword,
that method is known as an instance method. Instance methods
are associated with objects – not classes.
It can access either instance or class members.
本章源码
class StaticExa {
static int a = 4;
static int b = 9;
static void call() {
System.out.println("a = " + a);//静态方法可以访问静态属性
}
}
public class Test {
static int c = 43;
public static void main(String args[]) {
/*刚运行到这一步时,debug观察,StaticExa.a的值就等于42,Test.c的值就等于43,
说明系统在我们的程序一开始时,就会给所有的类变量赋值。如果是对象参考, 就是null,
见photoshop的例子*/
。。。。。。。。。。。。。。。。详情网上找“马克-to-win”,参考他的网站或他的网络空间:java第2章的内容
‘肆’ JAVA 实例域和静态域分别是什么意思
实例域:故名意义需要实例如类后方可使用里面的属性、方法
静态域:则不需要可以直接使后,更重的是静态域可以作为系统缓存在不同类中使用,也可以理解全局的概念
‘伍’ java中的静态代码块、代码块、构造器的执行顺序是怎样呢,这三者有什么作用呢
先说执行顺序:我们在new一个对象时,如果类还没加载,就需要先将类加载到内存,此时就会执行静态代码块,在创建对象时,是先执行代码块,然后执行构造器。所以静态代码块、代码块、构造器的执行顺序是:静态代码块→代码块→构造器。
再说作用:静态代码块是用于初始化类的(在加载类时执行,只执行一次),代码块是用于初始化对象的(在创建对象时执行,每次创建对象时都执行),构造器是用于创建对象的。
‘陆’ JAVA 静态类写法和调用
js?还是指JSP的脚本段。先看一般是如何显示数据吧,最后在介绍js:
我们可以使用JSP页面的脚本段,首先写个Bean类:
public class SomeBean{
public String getName(){return "123";}
public void setName(String name){}
}
<!-- test.jsp-->
<%@ page contentType="text/html;charset=utf-8" pageEncoding="utf-8"%>
<%
SomeBean bean=new SomeBean();
out.println("Bean-name is "+bean.getName());
%>
就是这样,脚本段里面的东西其实就是java代码,而JSP页面本质就是servlet。我不太清楚你是否了解JSP的编译,如果你不知道的话我建议你到网络搜一下"JSP的java代码"一类的东西看看,这是基础。
你说的静态类应该是指类中包含静态域吧,除了内部类可以是静态的外,别的类都不行。不论是静态域还是普通域,用上面的脚本段都可以搞定。
再看看struts,静态的显示我放在后面了:
首先我们来写一个Action类:
public class LoginAction{
public String execute(){
return SUCCESS;
}
public void setValue(SomeBean value){
this.value=value;
}
public SomeBean getValue(){
return this.value;
}
private SomeBean value;
}
再写出Bean类:
public class SomeBean{
public String getName(){}
public void setName(String name){}
}
配置Action应该不用说了,没什么特别的,不会就上网查吧。
我们现在说方法。
方法一:
使用OGNL表达式。你可以使用struts自带的标签,他们都支持OGNL,比如s:property。举个例子:
<!--test.jsp-->
<%@ page contentType="text/html;charset=utf-8" pageEncoding="utf-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<s:property value="value.name"/>
你访问LoginAction的时候s:property标签就会显示getValue().getName();
如果你想了解更多的struts2标签和OGNL表达式建议去找更详尽的资料。
方法二:
当然是使用JSP本身的性质了。通过request和session来获取值。
我们把Action类改一下:
public class LoginAction{
public string execute(){
SomeBean value=new SomeBean();
value.setName("sfsfjsfje");
ActionContext context=ActionContext.getContext();
//往request里放attribute
context.put("value",value);
//往session里放
context.getSession().put("value",value);
return SUCCESS;
}
}
接下来我们改页面:
<!-- test.jsp -->
<%@ page contentType="text/html;charset=utf-8" pageEncoding="utf-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<%= ((SomeBean) request.getAttribute("value")).getName() %>
<%= ((SomeBean) session.get("value")).getName() %>
OGNL也可以显示静态域:
public class SomeBean{
public static String name="123";
public static String getAlias(){return "abc";}
}
public class LoginAction{
public String execute(){return SUCCESS;}
}
配置文件不写了。
页面:
<!--test.jsp-->
<%@ page contentType="text/html;charset=utf-8" pageEncoding="utf-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!--还是用s:property-->
<s:property value="@SomeBean@name"/>
<s:property value="@SomeBean@getAlias()"/>
当你访问LoginAction时就会显示SomeBean的name和getAlias()。不知道你是不是问的这个。
如果你要在js中调用数据也很容易:
<!-- test.jsp -->
<%@ page contentType="text/html;charset=utf-8" pageEncoding="utf-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<script language="javascript" type="text/javascript">
var name="<s:property value="@SomeBean@name"/>";
</script>
这样js中就有相应的数据了。
‘柒’ java主函数public static void main(String args[])中static的作用是什么
static关键字,告知编译器main函数是一个静态函数。也就是说main函数中的代码是存储在静态存储区的,即当定义了类以后这段代码就已经存在了。如果main()方法没有使用static修饰符,那么编译不会出错,但是如果你试图执行该程序将会报错,提示main()方法不存在。因为包含main()的类并没有实例化(即没有这个类的对象),所以其main()方法也不会存。而使用static修饰符则表示该方法是静态的,不需要实例化即可使用。
‘捌’ java中两个字符串的内存地址相同
String s1 = new String("I am a student"); 这里 你声明了一个引用 s1\x0d\x0a指向的是 new String("I am a student"); 这个字符串\x0d\x0aString s4 = s1; 这里 你又声明一个引用 指向s1的引用 也就是new String("I am a student"); \x0d\x0aif(s1 == s4) {\x0d\x0aSystem.out.println("这两个字符串的内存位置相同");\x0d\x0a}\x0d\x0a上面还是相等的\x0d\x0a但是 s4 = s4.replace('a', 'A');\x0d\x0as4.replace('a', 'A'); 生成了另一个 字符串 你要知道 String 是final类型的 所以\x0d\x0a这个时候 即原来已经开辟了内存空间的 new String("I am a student"); 是不可能改变内容了的\x0d\x0a这个时候 s4.replace('a', 'A'); 就另开辟了一个内存空间\x0d\x0a 而这个时候 你的S4指向s4.replace('a', 'A'); 而原来的s1还是指向 new String("I am a student"); \x0d\x0a他们肯定不一样的呢
‘玖’ 静态域是什么怎么理解它呢
静态成员变量可以脱离对象而存在,是类本身的属性。所以对于任何对象来说,这个静态成员都是存在的,类似对象间的全局属性。
‘拾’ Java栈和本地方法栈方法调用栈,这些都是什么
JAVA内存里面有一般有四个分类,堆, 栈(堆栈), 静态域, 常量池
栈: 实际上是一个队列, 遵循 FILO的原则(后进先出), 里面储存的是函数的参数值,局部变量,对象的引用(对象本身不在这里)等,因此在每调用一个函数时,堆栈都会分配一部分空间给它,函数返回时,被释放
堆: 储存静态变量,全局变量 和 用new创建的东西,栈中的内存是动态内存,其中的内存在不使用时随时可以被回收
静态域:存放对象中static定义的成员
常量池:存放常量
根据以上解释回答你的问题:
JAVA栈存的是函数的参数值,局部变量,对象的引用
方法调用栈? 没有这说法吧, 方法的调用是存在栈中的
本地方法栈, 和JAVA中的栈一个作用, 只是这个栈是属于本地的,不属于JAVA虚拟机,但受JAVA虚拟机的控制,因为是JAVA虚拟机简单地动态链接并直接调用指定的本地方法。可以把这看作是虚拟机利用本地方法来动态扩展自己
局部变量和对象引用存在 栈 中, 方法调用的栈帧也是在 栈 中
以上是我自己查资料+自己的理解,有错望指出