关于Java中的static和非static

1、被声明为static的成员,不会让个别对象拥有,而是属于类的。
2、被声明为static的成员,是将类名称作为名称空间,也就是说,可以这样取得圆周率:
System.out.println(Ball.PI);
3、在JVM加载一个类的时候,若该类存在static修饰的成员变量或成员方法,则会为这些成员变量或成员方法在固定位置开辟一个固定大小的内存区域。
4、被static修饰的成员变量和成员方法是独立与该类的,它不依赖于某个特定的实例变量,也就是说它被该类的所有实例所共享。所有实例的引用都指向同一个地方,任何一个实例对其的修改都会导致其他实例的变化。

static变量
静态变量是随着类加载时被完成初始化的,他在内存中仅有一个,且JVM也只会为他分配一次内存,同时类所有的实例都共享静态变量,可以直接通过类名来访问他。
一般在这两种情况下使用静态变量:
对象之间共享数据,访问方便。

static方法
由于他在类加载的时候就已经存在类,他不依赖于任何实例,所以static方法必须实现,也就是说他不能是抽象方法abstract。

static方法中不能使用非static数据成员,static方法或区块中,也不能调用非static方法或区块
由于这句话,所以在理解static上出现类问题。
1、是不是意味着静态方法中只能调用静态成员和静态方法呢?
2、那为什么在public static void main(String[] args)函数中,可以使用非静态成员呢?

class Some{
        void print(){
        System.out.println("test");
    }
}
public class ImportStatic {
    public static void main(String[] args){
        Some some = new Some();
        some.print();
    }
}

解释
静态方法是属于类的,而普通方法是属于对象的。
属于类的静态方法可以在对象不存在的时候就能访问到,而普通方法必须先new一个对象才能用这个对象访问。当我们访问调用静态方法的时候(使用类名.静态方法名)这个时候就没有对象创建,所以普通方法是访问不到的。为了避免这种错误,所以java就不允许在静态方法中访问非静态方法。
main方法也满足我上面说的,你仔细看下,main方法中是不是先创建的对象,然后用对象去访问的呀。
就是说,静态方法是在JVM加载类的时候就已经分配了内存,也就是说static方法必须实现;非静态方法在JVM加载类的时候没有分配内存空间。所以当你在static方法中调用非static方法的时候,非static方法还没有被分配内存,还不知道该如何使用非static方法,因此无法给static方法分配内存,所以static中不能调用非static方法。
但是在上面的main函数中,虽然print()是非static方法,但是在调用该方法前我们先新建了对象,因此我们可以给static方法分配内存空间,这是没有问题的。

其他解释
java中的static和非static方法有什么不同
非静态方法访问静态或者非静态成员的方式是一样的,可以直接访问。
静态方法必须创建对象才能访问非静态成员。静态方法可以不创建对象,直接访问静态成员,也可以通过创建对象来访问。
例如
public void method1(){…}
public void method2(){…}
以上两个是非静态方法
method1和method2可以不创建对象相互访问。
public static void main(String[] args){…}
main是静态方法,在main访问method1和method2要创建对象

这样访问Some类中的print就不可以

class Some{
        void print(){
        System.out.println("test");
    }
}
public class ImportStatic {
    public static void main(String[] args){
        some.print();
    }
}

总结:
在静态方法必须创建对象才能访问非静态成员。要访问静态方法可以不创建对象,直接通过类名称加‘.‘运算符访问静态成员,也可以通过创建对象来访问。
静态方法属于类,非静态方法属于对象。
在静态方法中,只要你创建了对象之后再去访问该对象中的非static方法(即在静态方法中能够确定要分配的内存大小),就没有问题。

静态成员是属于类的,非静态成员是属于对象的。所以在使用过程中,要使用非静态成员,就要先创建对象。

猜你喜欢

转载自blog.csdn.net/c_aflte/article/details/80586305