首先我们要知道什么是static以及instance
一. static(静态)
1. static关键字
- 一个类可以创建n个对象,如果n个对象中的某些数据需要n个对象共用,就需要使用static关键字修饰这些数据。
- Java中,一般情况下调用类的成员都需要先创建类的对象,然后通过类的对象进行调用。使用static关键字可以实现通过类名加“.”直接调用类的成员,不需要创建类的对象,但是类的对象也是可以调用的。
2. static修饰属性
- 使用static修饰的属性称为静态属性或类变量。使用static修饰的属性属于类,不属于具体的某个对象。类属性在类名首次出现时初始化,即使没有创建对象,类属性也是存在的。
3. static修饰方法
- 用static修饰的方法称为静态方法或者类方法,类方法不依赖于任何对象,用类名直接加“.”调用即可,对象名也可以调用。使用static修饰的方法属于类,不属于具体的某个对象。类方法在类名首次出现时初始化,即使没有创建对象,类方法也是存在的。
public class Boke {
public static void showDetails(String name,int age){
System.out.println("自我介绍一下,姓名:"+name+",年龄:"+age);
}
public static void main(String[] args) {
Boke.showDetails("张三",20);//类名调用静态方法
}
}
4. static块
还可以定义static块
类名首次出现时,先为静态变量分配内存,然后调用静态块,静态块可以为静态变量初始化。还可以干别的事情。
静态块只在类名首次出现时调用一次,以后再也不调用了。
例如:
public class Demo{
//构造为实例变量初始化
public Demo(int i){
this.i = i;
}
//静态块,为static变量初始化,静态块在首次类名出现时调用,但后于分配静态变量。
static{
age = 20;
}
static int age=0;
int i;
}
二. instance(实例)
在面向对象程序设计中,“类”在实例化之后叫做一个“实例”。 “类”是静态的,不占进程内存,而“实例”拥有动态内存。
1. 实例变量
- 没有使用static修饰的属性称为实例变量或叫成员变量
private String shopName;
private double shopPrice;
private int shopNum;
2. 实例方法
- 不使用static修饰的方法称为实例方法
public double getAllTotal(){
if(this.goods==null){
throw new RuntimeException("商店中没有任何商品,无法统计总金额");
}
double sum = 0;
for (int i = 0; i
三. static和instance的区别
1. 大致区别
static:静态(属于类,只有一份)
instance:实例(实例也叫对象,就是new出来的堆的内存空间,实例是每个对象专有的,每new一次就分配一次内存)
- 实例变量是在new类时在堆中分配内存的。
- 构造函数可以为实例属性初始化。构造函数不会为静态属性初始化。
- 由于静态属性是所有对象共有的,所有对象就是类,因此静态属性也称为类属性,或者类变量,或者类成员。
- 既然静态属性属于类,不属于某个具体的对象,因此在new对象时,不会给静态属性分配内存。那静态时什么时候分配内存呢?
- 当在程序运行期间,首次出现类名时,会暂时停止程序运行,去为类的静态属性分配内存,然后继续运行。
- 静态变量被分配在方法区中,常驻内存,永不回收。静态变量只有一份。相当于c语言的全局变量。
- 静态变量由类名操作,由类名赋值,取值。
- 类名调用静态属性时,可以省略类名。
2. 静态方法和实例方法的区别
1、调用方式
-
在外部调用静态方法时,可以使用 类名.方法名 的方式,也可以使用 对象.方法名 的方式,而实例方法只有后面这种方式。也就是说,调用静态方法可以无需创建对象 。
-
不过,需要注意的是一般不建议使用 对象.方法名 的方式来调用静态方法。这种方式非常容易造成混淆,静态方法不属于类的某个对象而是属于这个类。因此,一般建议使用 类名.方法名 的方式来调用静态方法。
2、访问类成员是否存在限制
- 静态方法在访问本类的成员时,只允许访问静态成员(即静态成员变量和静态方法),不允许访问实例成员(即实例成员变量和实例方法),而实例方法不存在这个限制。
3. 静态方法是不能调用非静态成员的,为什么呢?
- 静态方法是属于类的,在类加载的时候就会分配内存,可以通过类名直接访问。而非静态成员属于实例对象,只有在对象实例化之后才存在,需要通过类的实例对象去访问。
public class Test {
public static void main(String[] args) {
}
public void sayHello(){
}
public static void sayHi(){
sayHello();
}
}//此时静态方法是无法调用不知道是否存在的非静态成员的
- 在类的非静态成员不存在的时候静态成员就已经存在了,此时调用在内存中还不存在的非静态成员,属于非法操作。
【信息由网络或者个人提供,如有涉及版权请联系COOY资源网邮箱处理】
© 版权声明
部分内容为互联网分享,若有侵权请联系站长删除。
THE END
暂无评论内容