本文共 2311 字,大约阅读时间需要 7 分钟。
小编今天在java基础的学习过程中出现面试级的细节难题,什么是static静态类?非静态类是什么?为什么用static修饰的静态成员变量不需要实例化就可以用类去调用它的成员和方法?static的初始化和非静态变量的初始化谁的优先级高?final的修饰static会存在什么作用等等。。。这些问题就是本小结的最核心的部分,接下来看分析。
一、static关键字
Java常用static去修饰静态成员或者静态方法,被修饰后的成员和方法均可以在类直接调用,不需要实例化。 这样是不是看起来超级方便?那是肯定的,同时,我们都希望节省内存,static类同时也会节省一定的内存。
这两句话是什么意思呢? 请看如下代码。public class Employee{ private static int nextId;//nextId用static方法定义 private int id; private String name; public int data;//定义一个外部可以访问和随意修改的共有变量data { System.out.println("非静态初始化" + nextId + "==name:" + name); id = nextId; nextId++; } static{ System.out.println("静态初始化"); Employee as = new Employee(); } public int getData() { return data; } public void setData(int data) { this.data = data; } public static int getNextId() { return nextId; } public static void setNextId(int nextId) { Employee12.nextId = nextId; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }//建立一个Employee类 //建立一个外部类调用Employee类中的成员方法public class Test { public static void main(String[] args) { // TODO Auto-generated method stub Employee.setNextId(13);//不需要实例化直接用类名调用类中的方法,同时因为上面设置的属性是private类,所以 Employee e = new Employee();//实例化e e.setName("231");//调用e中的set方法,只有在实例化后才能调用 }}
有上面的例子可得出结论:
1. 使用static关键字定义的无论是静态变量还是静态方法均可以不用通过对类实例化直接调用类去生成类内对应的方法和对象变量。 2.静态的方法属于类,不属于任何独立的对象。所以,共享资源和互相调用是很方便的。 3.含有static关键字的方法或者对象只被初始化一次,这后面会涉及到jvm,在jvm中它在方法区中只被允许分配一块内存。所以使用static是相当节省内存的。 4.静态成员变量的初始化优先于非静态成员变量。二、final关键字
谈到final关键字,就想到String类,因为final和String都有唯一不可变的性质,实际上String类是一个final类里的其中一个部分。
拥有final关键字的语句是具有不可更改的性质,被final关键字修饰的变量必须进行初始化,修饰的方法也不能被重写,同时,修饰的类也不能被继承。 是不是觉得很厉害?但是很多小伙伴还是有很多问题,比如说其中一个,如果final类修饰引用类型呢?引用类型当然可能修改类的对象域中的值,那么此时final不就矛盾了吗?其实不矛盾,我们都说final修饰的类型是不可变的,只有这个是例外,但是我们都不推荐,因为是很危险的,final可以说不用在引用类型。 一、使用final修饰static 在代码中我们都很常见就是public static final <类型> <变量名> 等,看到这一句代码时候,立刻下意识告诉自己就是存在不可修改的变量名,且希望被初始化一次,被所有调用该类的其他类共享这个变量。public class Employee { public static final int p = 3; } public static void main(String[] args) { System.out.println(Employee.p); }
发现如果赋值这里会报错,这就是final关键字的性质了,具有唯一不变性。
转载地址:http://gjtrn.baihongyu.com/