在Java中static(静态)和instance(实例)的区别

首先我们要知道什么是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. 静态方法是不能调用非静态成员的,为什么呢?

  1. 静态方法是属于类的,在类加载的时候就会分配内存,可以通过类名直接访问。而非静态成员属于实例对象,只有在对象实例化之后才存在,需要通过类的实例对象去访问。
public class Test {
    public static void main(String[] args) {

    }
    public void sayHello(){
        
    }

    public static void sayHi(){
        sayHello();
    }
}//此时静态方法是无法调用不知道是否存在的非静态成员的
  1. 在类的非静态成员不存在的时候静态成员就已经存在了,此时调用在内存中还不存在的非静态成员,属于非法操作。

【信息由网络或者个人提供,如有涉及版权请联系COOY资源网邮箱处理】

© 版权声明
THE END
喜欢就支持一下吧
点赞6 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容