精华内容
下载资源
问答
  • 导读学习Java的过程,一开始很容易被这些各种变量绕晕,这篇博客主要介绍了这几种变量之间的关系和区别。例程package com.cunyu.demopublic class Demo {private String name; //成员变量、实例变量private int ...

    导读

    学习Java的过程中,一开始很容易被这些各种变量绕晕,这篇博客主要介绍了这几种变量之间的关系和区别。例程

    package com.cunyu.demo

    public class Demo {

    private String name; //成员变量、实例变量

    private int age; //成员变量、实例变量

    private int ID; //成员变量、实例变量

    public static final String school = "卡塞尔学院"; //成员变量、静态变量(类变量)

    public static String level = "SSS"; //成员变量、静态变量(类变量)

    public int getAge() {

    return age;

    }

    public int getId() {

    return ID;

    }

    public String getName() {

    return name;

    }

    public void setAge(int age) {

    this.age = age;

    }

    public void setId(int ID) {

    this.ID = ID;

    }

    public void setName(String name) {

    this.name = name;

    }

    public void study(){

    String subject1 = "屠龙"; //局部变量

    String subject2 = "炼金术"; //局部变量

    System.out.println("学习科目: " + subject1 + "、" + subject2);

    }

    public static void main(String[] args) {

    Demo demo = new Demo();

    demo.setAge(23);

    demo.setId(14000001);

    demo.setName("楚子航");

    System.out.println("ID: " + demo.getId() + "Age: " + demo.getAge() + "Name: " + demo.getName());

    System.out.print("主修科目: ");

    demo.study();

    System.out.println("学院:" + Demo.school);

    System.out.println("等级:" + Demo.level);

    }

    }各变量联系与区别成员变量:作用范围是整个类,相当于C中的全局变量,定义在方法体和语句块之外,一般定义在类的声明之下;成员变量包括实例变量和静态变量(类变量);

    实例变量:独立于与方法之外的变量,无static修饰,声明在一个类中,但在方法、构造方法和语句块之外,数值型变量默认值为0,布尔型默认值为false,引用类型默认值为null;

    静态变量(类变量):独立于方法之外的变量,用static修饰,默认值与实例变量相似,一个类中只有一份,属于对象共有,存储在静态存储区,经常被声明为常量,调用一般是类名.静态变量名,也可以用对象名.静态变量名调用;

    局部变量:类的方法中的变量,访问修饰符不能用于局部变量,声明在方法、构造方法或语句块中,在栈上分配,无默认值,必须经初始化;

    展开全文
  • java类中静态变量是如何被赋值的

    千次阅读 2019-09-08 10:50:57
    我们知道java中类加载的过程分为:加载、连接、初始化,其中连接阶段又分为验证、准备和解析,准备阶段的动作就是为静态变量分配内存,并将其设置为一个默认值,java中各种数据类型的默认值如下: 数据类型 ...

    我们知道java中类加载的过程分为:加载、连接、初始化,其中连接阶段又分为验证、准备和解析,准备阶段的动作就是为类的静态变量分配内存,并将其设置为一个默认值,java中各种数据类型的默认值如下:

    数据类型 默认值
    byte 0
    short 0
    int 0
    long 0
    float 0.0
    double 0.0
    char (空)
    boolean false
    引用类型 null

    初始化过程就是为类的静态变量赋予正确的初始值。
    很多人可能认为静态变量在类中的位置是平行的,位置不同不会导致变量的值不同,这里举两个例子来深刻理解一下准备阶段以及初始化阶段的成员变量的值是如何变化的:
    例1:

    public class MyTest {
        public static void main(String[] args) {
            Singleton singleton = Singleton.getInstance();
            System.out.println("counter1: " + Singleton.counter1);
            System.out.println("counter2: " + Singleton.counter2);
        }
    }
    
    class Singleton {
        public static int counter1;
    
        public static int counter2 = 0;
    
        private static Singleton singleton = new Singleton();
    
        private Singleton() {
            counter1++;
            counter2++;
        }
    
        public static Singleton getInstance() {
            return singleton;
        }
    }
    

    输出结果为:

    counter1: 1
    counter2: 1
    

    在main方法中调用了Singleton 类的静态方法getInstance,因此属于对该类的主动使用,因此Singleton 会进行初始化,关于对类的主动使用在我的另外一篇博客“类加载器的阶段分析”https://blog.csdn.net/weixin_42105936/article/details/100171009中有详细描述。
    在初始化阶段发生之前,先会进行准备阶段,也是就为变量赋予默认值,准备阶段完成之后,各个变量的初始值分别为:

    counter1:0
    counter2:0
    singleton:null
    

    接下来就是初始化:为类的静态变量赋予正确的初始值,初始化顺序如下:

    1. 由于counter1,没有额外指定初始值,所以维持默认值0;
    2. counter2被赋予新的值,仍然为0;
    3. 在给singleton 初始化时,由于使用了new关键字,所以需要执行构造方法,执行counter1++,
      counter2++后counter1和counter2都自增变成了1;

    在初始化阶段完毕之后,counter1为1,counter2为1,因此控制台输出结果如上。
    例2:

    public class MyTest {
        public static void main(String[] args) {
            Singleton singleton = Singleton.getInstance();
            System.out.println("counter1: " + Singleton.counter1);
            System.out.println("counter2: " + Singleton.counter2);
        }
    }
    
    class Singleton {
        public static int counter1;
    
        private static Singleton singleton = new Singleton();
    
        private Singleton() {
            counter1++;
            counter2++;
        }
        public static int counter2 = 0;
    
        public static Singleton getInstance() {
            return singleton;
        }
    }
    
    

    输出结果为:

    counter1: 1
    counter2: 0
    
    

    例2代码与例1代码的唯一不同,就是成员变量counter2 和singleton的位置不同,于是就会产生疑问:静态成员的位置不同也会导致变量成员值的不同吗?
    我们还是来分析一下:
    首先还是准备阶段,给变量依次赋予默认值之后:

    counter1:0
    singleton:null
    counter2:0
    

    同样类需要初始化,初始化步骤如下:

    1. 由于counter1,没有额外指定初始值,所以维持默认值0;

    2. 在给singleton 初始化时,由于使用了new关键字,所以需要执行构造方法,执行counter1++,
      counter2++,在此之前,counter1和counter2都是0,自增之后,counter1和counter2都变成了1;

    3. counter2初始化,被赋予新的值,变成0;

    由上面的两个例子加分析后我们得出一个结论:静态变量在初始化时是顺序执行初始化工作的,静态变量的位置不同有可能导致最终的值不同。关键还是要理解准备阶段和初始化阶段JVM的所进行的动作。

    展开全文
  • 如果方法声明为静态,则它是类的成员,而不是属于该类的对象。可以在不创建该类的对象的情况下调...它主要用作子类的基础,以扩展和实现抽象方法,并覆盖或访问抽象类中已实现的方法。示例abstractclassParent{stati...

    如果方法声明为静态,则它是类的成员,而不是属于该类的对象。可以在不创建该类的对象的情况下调用它。静态方法还具有访问类的静态数据成员的能力。

    静态变量是类变量。将为该类的所有实例创建静态变量的单个副本。可以使用静态方法直接访问它。

    Java中的抽象类是无法实例化的类。它主要用作子类的基础,以扩展和实现抽象方法,并覆盖或访问抽象类中已实现的方法。

    示例abstract class Parent {

    static void display() {

    System.out.println("Static method in an abstract class");

    }

    static int x = 100;

    }

    public class Example extends Parent {

    public static void main(String[] args) {

    Parent obj = new Example();

    obj.display();

    System.out.print(Parent.x);

    }

    }

    输出结果

    输出如下-Static method in an abstract class

    100

    展开全文
  • 局部变量:不是声明在体括号里面的变量。(1)必须要先复赋值,后使用,否则通不过编译,局部变量没有默认...静态变量和实例变量的区别:语法定义上的区别:静态变量前要加static关键字,而实例变量前则不加。程序运...

    局部变量:不是声明在类体括号里面的变量。

    (1)必须要先复赋值,后使用,否则通不过编译,局部变量没有默认初始值。

    (2)作用范围:定义开始到定义它的代码块结束。

    (3)同一范围内,不允许两个局部变量命名冲突。

    参数传递时,简单类型进行值传递,(参数进行传递时都会先去栈中生成一个副本的,使用结束后释放)。

    静态变量和实例变量的区别:

    语法定义上的区别:静态变量前要加static关键字,而实例变量前则不加。

    程序运行时的区别:实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变量才会被分配空间,才能使用这个实例变量。静态变量不属于某个实例对象,而是属于类,所以也称为类变量,只要程序加载了类的字节码,不用创建任何实例对象,静态变量就会被分配空间,静态变量就可以被使用了。总之,实例变量必须创建对象后才可以通过这个对象来使用,静态变量则可以直接使用类名来引用。

    例如:对于下面程序,无论创建多少个实例对象,永远都只分配了一个staticVar变量,并且每创建一个实例对象,这个staticVar就会加1;但是,每创建一个实例对象,就会分配一个instanceVar,即可能分配多个instanceVar,并且每个instanceVar的值都会只自加了1次。

    d3d1421c2f49af460441afde4571b97b.png

    类的静态变量在内存中只有一个,java虚拟机在加载类的过程中为静态变量分配内存,静态变量位于方法区,被类的所有实例共享。静态变量可以直接通过类名进行访问,其生命周期取决于类的生命周期。

    而实例变量取决于类的实例。每创建一个实例,java虚拟机就会为实例变量分配一次内存,实例变量位于堆区中,其生命周期取决于实例的生命周期。

    a4db5673195d089dcf7c89b6783cb90d.png

    结果为:

    9a6cc0e2bd1aa7d2c6c65c722980ab8e.png

    把代码改为:

    f21b31f8b0ac0b4e262a63d853e9c90b.png

    结果则为:

    5bb091c1400ed11de6eaf338f26a662c.png
    展开全文
  • java 静态变量

    2016-08-02 19:28:00
    主要是记录一个奇葩的现象,java类中静态变量,不仅可以通过类名称直接调用,而且还可以通过类的实力对象调用,java是不存在静态类的,如果非要用静态的类那就是内部类。 类中的静态变量是存储在JVM方法区中,...
  • 导读学习Java的过程,一开始很容易被这些各种变量绕晕,这篇博客主要介绍了这几种变量之间的关系和区别。例程package com.cunyu.demo public class Demo { private String name; //成员变量、实例变量 private...
  • 静态变量(被static修饰的变量):,加载的时候被创建,不随对象的创建而改变,静态变量位于方法区,消失对应的变量消失. 非静态变量:不被static修饰的变量,每创建一次对象,就会为变量分配一次内存,存放在堆内存,对象...
  • 作者: Java进阶者 来源:Java进阶学习交流一、static关键字使用static修饰的变量和方法分别称为变量(或称静态变量)和方法(或称静态方法),没有使用static修饰的变量和方法分别称为实例变量和实例方法。二、静态...
  • //类变量(静态变量)//类变量也称为静态变量,在类中以 static 关键字声明,但必须在方法之外。//无论一个类创建了多少个对象,类只拥有类变量的一份拷贝。//静态变量除了被声明为常量外很少使用,静态变量是指声明为...
  • java类全局静态变量在多线程数据混乱问题 解决方法: 可以使用ThreadLocal实现线程内的数据共享,而在另外线程运行时又共享另外一份数据。 用法:http://www.yayihouse.com/yayishuwu/chapter/1174
  • 静态变量在内存只有一个,Java虚拟机在加载的过程中为静态变量分配内存,静态变量位于演绎法我,被的所有实例共享。 静态变量可以直接通过类名被访问。静态变量的生命周期取决于的生命周期,当加载...
  • Java类中静态变量和实例变量有什么 区别呢?今天详细系统的整理一下:  1、静态变量(即类变量)有static修饰,而实例变量没有  2、实例变量必须创建对象后才可以通过这个对象来使用,静态变量则可以直接使用类名...
  • 创建局部变量的方法,构造函数或块时进入,一旦退出方法,构造函数或块变量将被销毁。 访问修饰符不能用于局部变量。 局部变量是可见的,只有内声明的方法,构造函数或块。 局部变量在堆栈级别内部实现...
  • 我们知道的生命周期分为装载、连接、初始化、使用和卸载...静态变量有两种情况:● 静态变量是基本数据类型,这种情况下在的外部不必创建该的实例就可以直接使用● 静态变量是一个引用。这种情况比较特殊,主...
  • 文章目录概述1.运行时数据区介绍2.GC Roots的对象3....本文主要讲述Java类的成员变量(实例变量)、静态变量(类变量)、局部变量的差异(涉及到存储区域,加载时机等方面)。 1.运行时数据区介绍 各个数据区...
  • -类变量也称为静态变量,在类中以static关键字声明,但必须在方法、构造方法和语句块之外。-无论一个类创建了多少个对象,类只拥有类变量的一份拷贝。-静态变量除了被声明为常量外很少使用。常量是指声明为public/...
  • 静态变量在内存只有一个,java虚拟机在加载的过程中为静态变量分配内存,静态变量位于方法区,被的所有实例共享。静态变量可以直接通过类名进行访问,其生命周期取决于的生命周期。 而实例变量取决于...
  • 由关键字static所定义的变量与方法,分别称为静态变量和静态方法,它们又都被称为静态成员1.静态方法无需本的对象也可以调用此方法,调用形式为“类名.方法名”,静态方法常常为其他提供一些方法而被定义。但是...
  • java类的成员变量有俩种: ...类的静态变量在内存只有一个,java虚拟机在加载类的过程中为静态变量分配内存,静态变量位于方法区,被类的所有实例共享。静态变量可以直接通过类名进行访问,其生命周期取决于类...
  • Java中,序列化是一个概念,通过它我们可以将对象的状态写入字节流,以便我们...在下面的Java程序中,Student类具有一个静态变量,我们试图在另一个名为ExampleSerialize的类中对其对象进行序列化和反灭菌。示例i...
  • 下面小编就为大家带来一篇利用反射获取Java类中静态变量名及变量值的简单实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
  • 通过set方法进行赋值 yml: spring datasource ...java类: public class DbHelper(){ private static String url; @Value("${spring.datesource.url}") public void setUrl(String url) { DbHelper...
  • 静态变量静态变量也称为变量,在的对象之间通用,并且也可以使用类名来访问此变量。非静态变量非静态的任何变量称为非静态变量或实例变量。以下是静态变量和非静态变量之间的重要区别。序号键静态的非静态1个...
  • 这里简单做一下笔记,区分Java全局变量里的静态变量与实例变量。1、Java里的全局变量首先了解Java里的全局变量,也叫成员变量。特点:(1)、一个类中既不在方法体内,也不在程序块内定义的变量;(2)、类中所有的方法...
  • 利用反射获取Java类中静态变量名及变量值. JAVA可以通过反射获取成员变量和静态变量的名称,局部变量就不太可能拿到了
  • 成员变量:把内、方法体外定义的变量... 二是有static修饰的,称为变量(静态变量)。变量和实例变量的区别是:变量在内存只存一份,在程序运行时,系统只为变量分配一次内存,只进行一次的初始化。...
  • Java类静态变量的回收

    千次阅读 2015-02-03 22:59:58
    先说下程序上线碰到的一个问题: 我们开发的程序之前是一个服务启动一个JVM 现在是把不同的服务部署到了一个JVM里,不同的服务...静态变量是放在方法区的,放在方法去的还有的属性方法信息。 的数据信息是放在
  • Java 静态、静态方法和静态变量

    万次阅读 多人点赞 2017-11-06 15:44:52
    转载自Java 静态、静态方法和静态变量Java 静态、静态方法和静态变量static 是Java中的一个关键字,我们不能声明普通外层或者包为静态的。static用于下面四种情况。1.静态变量:我们可以将级别的变量声明为...
  • 1. 开始吧!今天,我们来探讨交流下静态变量初始化过程。Java虚拟机在加载期间也同样遵循这个过程。...3. 变量在Java中静态变量也称为变量。也就是说,它们属于一个,而不是一个特定的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 16,341
精华内容 6,536
关键字:

java类中静态变量

java 订阅