关于java static的用法

我知道a不能new出来,需要调用静态getA()方法,然后调用private static A a = new A();因为这两个都是staitic,当程序运行的时候就存在了,一直到程序结束才被释放,但是A里面的public int i = 1;是局部的,当调用private static A a = new A();的时候,我感觉这个和
fun() {
fun();
}
差不多啊!!!如果这样,那岂不是无限new出public int i = 1;?当然我知道那两个static还是不会再开辟内存。就是觉得这样会无限调用自己。求解释!!!
class A
{
public int i = 1;
private static A a = new A();

private A
{
}

public static A getA()
{
return a;
}
}

public class B
{
public static void main(String[] args)
{
A.getA();
}
}

public int i = 1;是局部的
这是谁告诉你的?? 可以去去抽他
这是类变量也叫实例变量
这个类一共只有一个实例
无论调用多少次A.get() 方法
得到的A对象的实例都是那一个
这是标准的 单例模式

private static A a = new A();
这行语句你不是也说了 当程序运行的时候就存在了,一直到程序结束才被释放
这个意思就是在程序运行的时候执行一次以后就不执行了

fun() {
fun();
}

这个是递归.这和你说的东西完全没关系.........追问

那个static我可不可以这样理解?就算A.getA();不执行,private static A a = new A();都会存在,并且只会执行一次就好比C语言的
fun()
{
static a = 5; //a只会被初始化一次,
}
所以那两个静态变量会常驻内存,并且如果不加private可以随意地被访问,因为static的生命周期就是程序从开启到关闭,但是被new A();出来的public int i = 1;并不是静态变量,所以是有生命周期的,但是i什么时候被释放呢?

追答

public int i = 1不是单独存在的 而是和 A这个对象的实例绑定在一起的 这个变量i 是这个对象A的一部分
对象的实例只有失去所有的引用的时候才会被垃圾处理器处理

java和c还是有好多地方是不一样的

fun()
{
static a = 5; //a只会被初始化一次,
}

java里是不允许在非静态的方法里定义静态的变量的 所以没这种情况....

追问

由于A对象是static的,所以不管有没有getA()方法,A对象都存在,getA()只不过是传递地址,但是,i是A new出来的,A既然是static,java没有free,也不会被回收静态变量,所以i怎么会被回收呢?i不是要常驻内存吗?
哎!!!这个问题很纠结!!!为了只被调用一次,A成了静态变量,所以A不会被回收,所以依赖A对象的成员和方法也不会被回收,直到程序运行结束,是不是这样啊?

追答

对啊 就是这样
直到程序终止 A对象和对象中的方法和实例变量都不会被清理的

追问

嗯,最后一个问题,A作为static,i 依赖着A常驻内存,是不是说 i 就可以当作static了?虽然不是statuc,但是可以理解为狐假虎威吧!虽说这个比喻不太恰当。
谢谢了!!!

追答

有没有在编译程序的时候提示过你 不能在非静态的方法里使用静态的变量?????????
记不记得main方法是怎么写的?? public static void main(String[] args)
看出来没??? main方法是静态的 也就是说 main方法里只能使用静态的变量和方法 那为什么一个没有定义任何静态成员的 类可以在main方法里使用呢??? 原因很简单 当你使用new 来实例化一个对象的时候 这个对象的实例就是静态的!!! 这个实例里所有的方法和变量都是静态的(...可以这么理解.....但是直接定义成static的方法和变量尤其是静态变量还是有区别的)

温馨提示:答案为网友推荐,仅供参考
相似回答