请问以下程序片段的输出结果是什么
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修饰