- Java的静态对象与非静态对象的区别
静态 | 非静态 | |
拥有属性 | 类共同拥有 | 各实例对象独立拥有 |
内存分配 | 位于“数据区”,且唯一 | 位于“堆空间”,每new一个对象创建一份 |
分配顺序 | 先分配静态对象的空间 | 然后为非静态对象分配空间 |
- Java中静态对象的用处
- 静态成员表示全局性、唯一性;
- 引用方便,类名.静态变量或类名.静态函数;
- static final 用来修饰成员变量和成员方法,可简单理解为“全局常量”。对于变量,表示一旦给值就不可修改;对于方法,表示不可覆盖。
- static方法
- 静态方法只能调用静态方法;
- 静态方法只能访问静态数据;
- 不能以任何方式引用this和super(this涉及到对象,super 与继承有关)。
- static变量
按照是否静态的,对类成员变量进行分类可分两种:一种是被static修饰的变量,叫静态变量或类变量;另一种是没有被static修饰的变量,叫实例变量。两者的区别是:
对于静态变量在内存中只有一个拷贝(节省内存),JVM只为静态分配一次内存,在加载类的过程中完成静态变量的内存分配,可用类名直接访问(方便),当然也可以通过对象来访问(但是这是不推荐的)。
对于实例变量,没创建一个实例,就会为实例变量分配一次内存,实例变量可以在内存中有多个拷贝,互不影响(灵活)。
- static代码块
static代码块也叫静态代码块,是在类中独立于类成员的static语句块,可以有多个,位置可以随便放,它不在任何的方法体内,JVM加载类时会执行这些静态的代码块,如果static代码块有多个,JVM将按照它们在类中出现的先后顺序依次执行它们,每个代码块只会被执行一次。
- static类——静态内部类(内嵌类)?????
- 静态内部类跟静态方法一样,只能访问静态的成员变量和方法,不能访问非静态的方法和属性,但是普通内部类可以访问任意外部类的成员变量和方法;
- 静态内部类可以声明普通成员变量和方法,而普通内部类不能声明static成员变量和方法,但是可以声明static final 成员变量和方法。
- 静态内部类可以单独初始化:
Inner i =
new
Outer.Inner();
普通内部类初始化:
Outer o =
new
Outer();Inner i = o.
new
Inner();
- static和final一块用表示什么
static final用来修饰成员变量和成员方法,可简单理解为“全局常量”!
对于变量,表示一旦给值就不可修改,并且通过类名可以访问。
对于方法,表示不可覆盖,并且可以通过类名直接访问。
特别要注意一个问题:
对于被static和final修饰过的实例常量,实例本身不能再改变了,但对于一些容器类型(比如,ArrayList、HashMap)的实例变量,不可以改变容器变量本身,但可以修改容器中存放的对象,这一点在编程中用到很多。