• JavaSE阶段初期的一些问题


    ​​​对于如下问题1:编译阶段Demo1会报错,Demo2不会报错.

    class Demo1{

    int i;

    i = 0;

    }

    class Demo2{

    int i = 0;

    }

        

        事实上,在java中定义一个类,类中只能包含成员变量 成员方法 构造方法 代码块;

    成员变量为类的属性,成员方法为类的行为,构造方法是用于创建类的实例;

    代码块包括静态代码块和非静态代码块:

    static修饰的代码块随着类的加载而加载,一般作为类的驱动;

    没有static修饰的代码块为构造代码块,在构造方法之前执行;

        因此,可以看出在类的成员位置,只能定义,定义一个类的属性特征,而如果在成员位

    置调用某个方法或者执行某条语句,相当于让该类去实现某个动作,这是不合常理的,

    必须通过创建类的实例,通过实例调用方法,在方法中去实现动作.

    class Demo3{

    int i;

    {

    i=0;

    }

    }

        Demo3不会报错,i=0在构造代码块中,这个类和如下类相同:

    class Demo4{

    int i;

    Demo4(){

    i=0;

    }

    }

    相当于在Demo4的构造方法中执行i=0这条语句,最终还是通过调用方法来执行.

    问题2:为什么static不能修饰局部变量,只能修饰成员变量和方法,且可以用类名直接调用.

        static修饰的成员变量或者成员方法随着类的加载而加载.

    在java中,当一个类被虚拟机加载的时候会产生一个类型为Class的类对象存在于

    jvm的方法区中,即所生成的class文件.当创建该类实例的时候,会以这个类对象为模版

    ,在堆内存中开辟一块空间并复制类对象的成员变量,同时会有一个引用指向类对象的

    成员方法,当调用方法的时候,通过引用找到类对象中的方法调用进栈执行.

    而用static修饰的成员变量或者方法实际上是属于类对象的,即这个模版的,并不

    属于类的实例.那么调用static修饰的成员变量或方法则可以直接使用类名来指向该

    变量和方法,当然也可以通过创建对象来调用.

    static为什么不能修饰局部变量呢,首先局部变量存在于方法中,它的作用域在这

    个方法的括号内,而方法的调用需要依靠对象的产生,因此局部变量存在于堆内存中,而

    static修饰的变量随着类的加载会一直存在于方法区中,生命周期和位置都不同,因此

    不能用static修饰局部变量.​​​​

  • 相关阅读:
    160-三个用户同时登录,是怎么实现多线程的?
    159-如何解决缓存穿透?
    158-为什么会引发缓存穿透?
    存储emoji表情,修改字符集为utf8mb4
    java相差小时数
    pom.xml解释
    前端 跨域
    java 获取的是本地的IP地址
    是否超时
    发送验证码
  • 原文地址:https://www.cnblogs.com/doveshelly/p/8526027.html
Copyright © 2020-2023  润新知