关于static

1.static,本意静态的,与它对应的是非静态的。其实我觉得静态的和非静态的最本质的区别是他们创建的时机,以及他们归谁所有。有static关键字修饰的变量或者方法,也就是静态变量,静态方法,或者说静态成员,或者说类成员。这些都是它的名字。

首先是静态变量,它是在类被载入的时候创建的,归类所有。而区别于非静态变量,是在对象创建的时候创建的。它归对象所有,对象之间的非静态成员互不干扰。


下面例子:

public class StaticClassTest {
    private static int age1=1;
    private int age2=1;
    public void changeAge(){
        age1++;
        age2++;
        System.out.println("age1 is "+age1+", age2 is"+age2);
    }
   
}

public class MainClass {
    public static void main(String[] args) {
        StaticClassTest st1=new StaticClassTest();
        st1.changeAge();
        StaticClassTest st2=new StaticClassTest();
        st2.changeAge();

    }
}

运行的结果是

age1 is 2, age2 is2
age1 is 3, age2 is2

对于静态变量age1而言,它是归类所有的,也可以说是归所有对象所有的,所以对象st1和对象st2所拥有的age1其实是同一份,任何一个对象对静态变量进行了改变,其结果都会反映在其他的对象上面。而age2因为不是静态变量,所以st1对它的修改,并不会反映在对象st2上面,也就是说它是归对象所有的,而不是归类所有。

2.其实静态方法我觉得最大的特点,就是它可以直接用类名进行调用,而不需要先生成一个对象,当然你要生成一个对象再去调用静态方法也是可以的。但这只是java给我们的自由。本意上,静态方法,表示的是这个方法归类所有,它是不需要创建对象就能使用的。所以在该静态方法里,你不能去调用任何需要产生对象才能生成的变量。也就是,在静态方法中,你不能调用非静态变量,你也不能调用this和super关键字,因为这些都是需要产生对象才生成的。

下面例子:

public class StaticClassTest {
    private static int age1=1;
    private int age2=1;
    public static void changeAge(){
        age1++;
        age2++;
        System.out.println("age1 is "+age1+", age2 is"+age2);
    }
}

在eclipse里会报错,错误为:

Cannot make a static reference to the non-static field age2

就是说,在静态方法中,不能引用非静态的变量age2.

下面例子:

public class StaticClassTest {
    private static int age1=1;
    private int age2=1;
    public static void changeAge(){
        this.age1++;
        this.age2++;
        System.out.println("age1 is "+age1+", age2 is"+age2);
    }  
}

同样也会收到错误。

3.静态代码块。

静态代码块可以放在任何地方,它以static关键字来标记,以括号包围起来。当类首次被载入的时候,静态代码块执行,此后再载入,就不会执行了,也就是说静态代码块只在类初次载入的时候被执行一次。看下面代码》

public class StaticClassTest {
    protected static int age1=1;
    private int age2=1;
    static{
        age1++;
        System.out.println("today is saturday");
    }
    public static void changeAge(){
        System.out.println("superclass age1= "+age1);
    }
}


    public static void main(String[] args) {
        StaticClassTest.changeAge();
        StaticClassTest.changeAge();
    }

如果观察运行结果,可以看到,控制台首先会打出today is saturday 这条语句,而后马上没有了。这是因为我在main方法中载入了两次类。但是我们依然可以通过输出的结果来发现问题。

superclass age1= 2
superclass age1= 2

上述结果说明,age1++这行代码只被执行了一次,也就是在第一个    StaticClassTest.changeAge();语句的时候执行。随后就没有再被执行了。

4.静态方法能不能被重写呢?

5.关于静态的类,什么时候用到静态类呢?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
静态成员和实例成员是面向对象编程中的概念。 实例成员是指每个类的实例(对象)拥有的成员,它们与特定的对象实例相关联。每个对象都有自己的实例成员副本,它们在不同的对象之间是相互独立的。实例成员可以是字段、属性、方法或事件。 静态成员是属于类本身的成员,而不是属于类的实例(对象)的成员。静态成员被所有类的实例共享,它们只有一个副本在内存中存在。静态成员可以是静态字段、静态属性、静态方法或静态事件。 区别: 1. 内存分配:实例成员在每个对象实例中都有自己的内存分配,而静态成员只在内存中分配一次。 2. 访问方式:实例成员只能通过对象实例来访问,而静态成员可以通过类名直接访问,不需要创建对象实例。 3. 生命周期:实例成员的生命周期与对象实例相关联,当对象销毁时,实例成员也会被销毁。而静态成员的生命周期与类相关联,它们在应用程序运行期间一直存在,直到应用程序结束。 使用场景: - 当一个成员需要被多个对象共享时,可以将其定义为静态成员,例如记录类的实例数量。 - 当一个成员与对象的状态无关时,可以将其定义为静态成员,例如工具类中的方法。 - 当一个成员需要访问静态成员时,必须将其定义为静态成员,例如静态方法中只能访问静态成员。 总之,实例成员与对象实例相关联,而静态成员与类相关联。它们在内存分配、访问方式和生命周期等方面有所区别。根据实际需求选择使用哪种类型的成员。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值