run方法里能php 给静态变量赋值值,在另一个类里获取的一直为空

新手求助,多线程run 方法中的变量(会改变的值)如何在其他类中引用
[问题点数:40分,结帖人qq_]
新手求助,多线程run 方法中的变量(会改变的值)如何在其他类中引用
[问题点数:40分,结帖人qq_]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
匿名用户不能发表回复!|java在类里给其他类的全局变量赋值_百度知道
java在类里给其他类的全局变量赋值
A类的path是全局变量,怎么在B类中给path赋值
我有更好的答案
path如果不是静态变量的话 那么需要有A类的一个对象按照你的意思应该是静态变量 那
直接A.path = xxx就行了如果是private 那就用静态方法去获取这个静态变量如果不是静态变量,那么必须是操作某一个对象。操作另外一个对象的属性,这个和静态变量的区别 就是一个用类名 一个用对象
采纳率:70%
来自团队:
全局变量都是静态存储,直接类名.方法名A.path=
为您推荐:
其他类似问题
您可能关注的内容
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。java中 System.out 的静态成员变量(字段) 明明 被赋值一个null 但为什么还能返回一个实例. 什么逻辑? !!_百度知道
java中 System.out 的静态成员变量(字段) 明明 被赋值一个null 但为什么还能返回一个实例. 什么逻辑? !!
你说神奇不神奇.
我有更好的答案
你应该能发现里面有个静态块&&&&static&{&&&&&&&&registerNatives();&&&&}看一下注释:通过静态初始化注册native方法,该方法会令vm通过调用initializeSystemClass方法来完成初始化工作看看initializeSystemClass方法FileInputStream&fdIn&=&new&FileInputStream(FileDescriptor.in);FileOutputStream&fdOut&=&new&FileOutputStream(FileDescriptor.out);FileOutputStream&fdErr&=&new&FileOutputStream(FileDescriptor.err);setIn0(new&BufferedInputStream(fdIn));setOut0(new&PrintStream(new&BufferedOutputStream(fdOut,&128),&true));setErr0(new&PrintStream(new&BufferedOutputStream(fdErr,&128),&true));注意setOut0便是初始化out的代码
采纳率:55%
不神奇啊,这个地方只是声明这个变量,在其它地方肯定会实例化的。在这个方法里面初始化的:&&&&这个方法做了很多初始化操作。
突然想起来了个问题. System.out 是被 静态 而且 final 修饰过的 为什么会改变null呢?
final不是 不能改变值吗?
确实啊,我也不知道怎么回事了
1、在类加载的准备阶段给System.out引用赋值为空2、在类加载的初始化阶段执行cinit(类构造器) , 执行静态代码块initializeSystemClass3、调用setOut0设置System.out引用setOut0是一段本地C/C++程序 , 直接操作内存的。而用static final修饰的out只是在编译阶段会禁止修改 , 在运行期间可以直接通过内存修改
1条折叠回答
为您推荐:
其他类似问题
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。静态变量缓存需要注意的事
编辑:www.fx114.net
本篇文章主要介绍了"静态变量缓存需要注意的事",主要涉及到静态变量缓存需要注意的事方面的内容,对于静态变量缓存需要注意的事感兴趣的同学可以参考一下。
在项目过程中,我们有时经常喜欢用静态变量(static)来缓存一些不便的公共数据,但是这么做有一点需要注意:静态变量的保护。
由于一些因素(比如查询数据库),我们无法对静态变量加上final属性,因此如果静态变量暴漏后,如果有对静态变量写操作(即修改变量)的话,很可能会引起意想不到的错误。当然平时我们用缓存几乎都是读取操作,所以这个问题不容易引起我们的注意。
例子说明:
import java.util.ArrayL
import java.util.I
import java.util.L
public class Cache {
private static List&Student&
students = new ArrayList&Student&();
Student student1 = new Student();
student1.setName(&张三&);
student1.setAge(18);
Student student2 = new Student();
student2.setName(&李四&);
student2.setAge(17);
Student student3 = new Student();
student3.setName(&王五&);
student3.setAge(20);
Student student4 = new Student();
student4.setName(&赵六&);
student4.setAge(18);
Student student5 = new Student();
student5.setName(&刘七&);
student5.setAge(18);
students.add(student1);
students.add(student2);
students.add(student3);
students.add(student4);
students.add(student5);
public static List&Student& findAllStudents() {
public static Student getStudentByName(String name) {
for (Student student : students) {
if (student.getName().equals(name)) {
public static void main(String[] args) {
List&Student& students1 = Cache.findAllStudents();
System.out.println(students1.size());
for (Iterator&Student& iter = students1.iterator(); iter.hasNext();) {
Student student = iter.next();
if (student.getName().equals(&李四&)) {
iter.remove();
List&Student& students2 = Cache.findAllStudents();
System.out.println(students2.size());
class Student {
public String getName() {
public void setName(String name) {
this.name =
public int getAge() {
public void setAge(int age) {
this.age =
我们运行代码后,结果发现:第一次打印为5,第二次却为4了。
因为一些业务上的原因,有时我们会对结果进行过滤,虽然大多人都采用如下方式
public static void main(String[] args) {
List&Student& students1 = Cache.findAllStudents();
System.out.println(students1.size());
List&Student& students1new = new ArrayList&Student&();
for (Student student : students1) {
if (student.getName().equals(&李四&)) {
students1new.add(student);
List&Student& students2 = Cache.findAllStudents();
System.out.println(students2.size());
这样确实不会对缓存产生影响,但如果我们编程时需要用到remove或add等操作时,便会对缓存产生影响。
要想了解造成此现象的原因,需要了解java内存机制和指针的相关知识,感兴趣的大家查阅相关资料,此知识不是本篇重点。我们继续看。
其实上述代码中关于缓存获取的方法(findAllStudents)是有问题的,正确的如下:
public static List&Student& findAllStudents() {
return new ArrayList&Student&(students);
这样就不会把缓存数据students直接暴漏给外面。
但是getStudentByName方法还是有问题的,运行如下代码
public static void main(String[] args) {
List&Student& students1 = Cache.findAllStudents();
Student studentOld =
for (Student student : students1) {
if (student.getName().equals(&李四&)) {
studentOld =
System.out.println(studentOld.getName());
Student student = Cache.getStudentByName(&李四&);
student.setName(&李四李四&);
System.out.println(studentOld.getName());
结果:第一次打印为李四,第二次却变成了李四李四。
虽然我们保护了缓存数据students,但list中数据的指针指向的还是同一份,所以缓存数据students中某一数据发生变化,同样会影响到其他数据list。
那么解决办法是:
public static Student getStudentByName(String name) {
for (Student student : students) {
if (student.getName().equals(name)) {
Student studentNew = new Student();
studentNew.setAge(student.getAge());
studentNew.setName(student.getName());
return studentN
如果有commons-beanutils-1.8.0.jar包,可以用以下方式
return (Student) BeanUtils.cloneBean(student);
} catch (Exception e) {
throw new RuntimeException(e);
通过以上改进后,我们就能确保静态变量缓存的安全行了,有时编程稍不注意或者修改静态变量方式不对的话,很容易因改变静态变量而造成系统异常,正确理解new、内存机制、指针的概念才能避免发生意外。
Java有很多需要我们深入理解的地方,停留在表面上的代码,不仅效率低下而且可靠性也无法保障,造成系统又慢又易崩溃,所以打好基础,脚踏实地,不断追求自我提高和代码重构、精进才能有朝一日成为独当一面的程序员。
版权声明:本文为博主原创文章,未经博主允许不得转载。
一、不得利用本站危害国家安全、泄露国家秘密,不得侵犯国家社会集体的和公民的合法权益,不得利用本站制作、复制和传播不法有害信息!
二、互相尊重,对自己的言论和行为负责。
本文标题:
本页链接:java 中什么不能把static 修饰的变量赋值给没有static修饰的变量啊?_百度知道
java 中什么不能把static 修饰的变量赋值给没有static修饰的变量啊?
例如:public class TestStatic {
static int vote = 0;
static void getAll() {
System.out.println(count);
}}static 的方法中都不能使用非static的变量吗?为啥啊?
我有更好的答案
通俗点讲:局部变量若加上static就表示该变量值在函数运行结束后是下一次函数运行时的初始值。函数包括全局变量若加上static表示其作用范围只在本模块/本文件内可用。static的变量 和c语言的全局变量意思差不多普通的变量每一个类的实例都有只属于自己的那一份 而static的变量是属于类的 所有的实例共享同一个static的变量
采纳率:79%
来自团队:
因为在java中static修饰的变量、方法等都是在类加载的时候就开始初始化、分配内存空间等工作。而非static的变量、方法是在程序执行时才开始初始化。因此在static 的方法使用非static的变量的情况就是:static 的方法初始化时却碰到还没有初始化的变量,这时候程序就有问题了。因此static 的方法中是不能使用外部非static的变量,只能使用内部非static的变量。如:public class TestStatic {
static int vote = 0;
static void getAll() {
//因为count在static方法里面,在类加载时一并初始化了。
System.out.println(count);
}}//这样写就可以了
如果方法被标记为static,那么只能是用表示static的方法和变量。原因是,被标记为static的方法和变量,是在类加载的时候加入到内存,可以直接使用,值永远只有一份。而非static的方法和变量,要等到类被实例化以后才能使用。你可以这么理解,就是类存在,static的变量和方法就存在,而非static的变量和方法,只有实例存在才存在。望采纳!谢谢。
上面代码不能赋值是因为Java中的一条原则:静态成员不能访问非静态的成员,你的getAll()方法为静态的,而count为非静态的,违反规则这条原则的原理是:Static修饰的成员属于类,而非Static修饰的成员属于对象,很有可能调用Static修饰的属性的时候,根本就没有实例化一个对象,当然就会出错了,因此Java有了这条原则
其他1条回答
为您推荐:
其他类似问题
static的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。}

我要回帖

更多关于 php 静态变量赋值 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信