Java中static与instance的区别

手机游戏开发者 2024-9-12 06:20:01 87 0 来自 中国
1.概念:

java中有个关键字叫static,翻译为静态,用来修饰属性和方法。它所修饰的属性叫静态属性或类变量,修饰的方法叫静态方法或者类方法。而没有使用static修饰的属性和方法就叫实例变量和方法,即instance翻译为实例的意思。

2.static与instance的作用:

static实现了在同一个类的对象中共享数据。即同一个类中的差别对象都必要用到的属性,就像一个班级类,它的每个门生对象都会用到班级名称,是他们所共有的,每一个门生对象都共享这个班级名称,就必要使用static来修饰。

而instance则是每个门生对象本身所独有的属性,比方每个门生对象都有本身的名字、身高、年事等属性就是instance修饰,但只有static才必要特别写出来,instance就不消写出来。

3.static修饰属性和方法:

1.static修饰属性(静态变量):

1   static String className;2.static修饰方法(静态方法):

1   public static void getScore(){            }4.instance属性和方法:

1.实例属性:

1   String name;2.实例方法:

1   public void getScore(){            }4.static与instance的区别:

1.加载时间差别:


  • 静态属性和方法是在初次出现类名时,为类的静态属性和方法分配内存。
  • 实例属性和方法是类new对象的时间,为类的实例属性和方法分配内存。
2.份数差别:


  • 静态属性和方法只有一份多个对象享用,而实例属性和方法是有多少个对象就有多少份。
3.初始化方法差别:


  • 静态变量是除了通过界说时手动确定外还可以通过static块(静态块)来初始化。
    比方:
   static int age=0;    //界说时手动初始化。//静态块,为static变量初始化,静态块在初次类名出现时调用,但后于分配静态变量。 static{        age = 20;    }静态块:
类名初次出现时,先为静态变量分配内存,然后调用静态块,静态块可以为静态变量初始化。静态块只在类名初次出现时调用一次,以后再也不调用了。

  • 动态变量则是除了界说时手动赋值外还通过构造方法赋值(一样寻常用构造方法初始化)
    比方:
    String name= "张三";    //界说时手动初始化。    Test(String name){       //带一个参数的构造方法。        this.name=name;    }    public static void main(String[] args) {        Test t1=new Test("张三");     //通过构造方法初始化。    }4.内存存放所在差别:


  • 静态变量被分配在方法区中,常驻内存,永不回收。
  • 实例变量被分配在堆中,用完回收。
5.调用方法差别:


  • 静态方法只可以调静态方法和变量不可以调用实例方法和变量。
  • 实例方法既可以调用实例变量和方法还可以调用静态变量和方法。
    缘故原由:静态方法是在初次出现类名时分配内存调用的此时并不知道有没有实例变量和方法。
    案例分析:


public class Test {    static int age;    public static void main(String[] args) {        age = 2;   //此方法精确,都是静态的,类名初次出现就分内存    }}


public class Test {    public static void main(String[] args) {    }    public void sayHello(){            }    public static void sayHi(){   //报错,不知道sayHello()有没有        sayHello();    }}


public class Test {    int age;    public static void main(String[] args) {   //报错,不知道age属性有没有。        age = 2;    }}


public class Test {    int age;    public static void main(String[] args) {   //精确,创建对象new Test()调用属性age表明已存在age属性就能调用        new Test().age = 2;    }}
您需要登录后才可以回帖 登录 | 立即注册

Powered by CangBaoKu v1.0 小黑屋藏宝库It社区( 冀ICP备14008649号 )

GMT+8, 2025-2-6 10:51, Processed in 0.183356 second(s), 32 queries.© 2003-2025 cbk Team.

快速回复 返回顶部 返回列表