java的static关键字

请问以下程序片段的输出结果是什么

public class Main {
    public static void main(String[] args) {
        Counter a = new Counter();
        System.out.println(a.increment());
        System.out.println(a.anotherIncrement());
        Counter b =new Counter();
        System.out.println(b.increment());
    }
}
class Counter{
    public static int count = 0;
    public int increment(){
        return count++;
    }
    public int anotherIncrement(){
        return ++count;
    }
}

正确答案:022.

这道题考察的知识点比较简单,一个是static关键字;一个是自增运算符的规则。我死在了static关键字的理解上,所以先简单说一下自增运算符的知识点。

count++意思是先赋值,再自增;++count是先自增,在赋值。如果实在记不住可以有一个小窍门,看算式中是变量在前还是运算符在前,哪个在前面,算式的值就优先计算。

比如count++,count变量名在前,因此count++的输出值就是0;

再比如++count,元素安抚在前,因此++count的输出值就是1;

接下来重点就是static关键字。

我是个菜鸡,我一般不喜欢把问题说的太复杂,我喜欢带着实际去看问题。比如我们研究static关键字,不知道你们的第一问题是啥,我的第一问题就是,这哥们是干啥的,有啥特点。

粗俗的理解一下,就是staitc关键字修饰的变量,方法,可以通过 类名.属性名(方法名)进行使用。不需要你new一个对象再进行调用。

使用场景(或者说static关键字的作用)

1 用来记录某个固有属性或者固有行为,与对象无关

2 用来记录某个特定的对象或者数据结构,为其单独分配一个内存地址

其实这两条说的都是一个事情,那就是,与类关联,与类对象无关。这个属性是和类绑定在一起的,由所有此类对象共享。

比如我们定义一个鸭子类。有颜色,重量等属性。但是需求说我还想要鸭子嘴巴的形状(所有的鸭子都是扁嘴巴啊,你是不是撒),正如我们吐槽的,所有鸭子的嘴巴都是扁的,和有多少鸭子没关系。因此,鸭子嘴巴这个属性就可以定义为static的,当鸭子这个类初始化的时候被加载(早于new)

这一点首先就体现在静态成员变量上,在我们常见的单例模式-懒汉模式中,就是利用静态成员变量实现的单例模式

public class Singleton {  
    private static Singleton instance;  
    private Singleton (){}  
  
    public static Singleton getInstance() {  
    if (instance == null) {  
        instance = new Singleton();  
    }  
    return instance;  
    }  
}

其次,static的作用还在与声明静态方法。同样,static方法也是属于类的,不需要创建对象就可以使用。static的调用者是类,而不是对象,这就导致在static方法内不允许出现this和super,也不能使用这个类的非静态成员变量和方法,因为当你调用这个方法的时候,这个类的对象可能还没有被创建。static方法常见于各种工具类中。

第三个就是static代码块

public class Static1 {

    public int count;

    static {
        System.out.println("我是静态代码块");
    }

    public static void main(String[] args) {
        Static1 s = new Static1();
    }
}

我们会看到控制台上出现了打印。

static代码块是一个类中除成员变量,方法之外的第三块代码区域,特点是

1 jvm在加载类的时候会先加载代码块,

2 如果一个类中有多个代码块,这些代码块将会依次执行

3 静态代码块中的代码在整个jvm运行期间,只会被执行一次

4 静态代码块内不允许出现非静态的成员变量,方法。

作用:static代码块常常用来做一些初始化静态变量的工作

第四项,静态内部类

静态内部类有以下特点:

1 不需要外部类实例化就可以实例化。这句话说起来有些拗口,但是其实很好理解。因为所有的非静态内部类的实例化都必须依赖于外部类的实例化。但是静态内部类就不需要。

2 静态内部类不能与外部类具有相同的名字

3 不能访问外部类的非静态成员变量和方法

4 只有内部类可以被staitc修饰

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值