成员变量与局部变量、实例变量与类变量

前言:变量命名规则:

  1. 变量必须以字母、"_"或"$"开头
  2. 变量可以包含数字,不能以数字开头
  3. 除了"_"或"$",变量名不能包含其它特殊字符
  4. Java区分大小写
  • 变量的作用域即变量的有效范围,是程序的一个区域,变量在其作用域内可访问.
  • 作用域也决定系统什么时候为变量创建和清除内存.

根据变量在程序中声明的位置,可分为成员变量和局部变量

成员变量

  • 成员变量定义在类中,成员变量的作用域在类的范围内
  • 可以添加修饰符(public,private,protected,static,final,native)
  • 如果没有赋初值,则初值由相应数据类型的默认值决定
  • 存放在内存共享区:Java堆

局部变量及方法参数

  • 可以定义在方法体中/语句块中/参数列表中,作用域从变量定义部分到方法体/语句块结束
  • 变量前不能加控制修饰符和static修饰符
  • 局部变量在使用前必须明确赋值(因为没有默认值)
  • 存放在内存私有区:虚拟机栈

示例:


public class Scope  {
    public int x;  //   类中定义的成员变量,局部变量默认为0;
    public void method(int a) {
        int x = 8;  //  方法中定义的局部变量
        int y;
        System.out.println("x="+x);//   输出结果为8,本地局部变量将会把成员变量隐藏
        System.out.println("x=" +this.x);// 输出结果为0,如果想在本地方法中使用重名变量,使用this
        for ( int i=1;i<a;i++)  //  语句块内部定义的局部变量
        {      x = x+i;
        }
       // System.out.println(i);//  编译出错,代码块中定义的局部变量,作用域为语句块
       // System.out.println(y);//  编译出错,局部变量没有默认值
        System.out.println(a);
    }
    public static void main(String a[])  {
        Scope x = new Scope();  //  局部变量x
        x.method(6);
    }
}

 

注意:

在用一作用域中 不能定义两个同名变量;

如果成员变量与局部变量同名,局部变量具有更高优先级,同名访问的是局部变量,如果想调用同名成员变量,则使用this.成员变量名

局部变量又可以分为实例变量、类变量

实例变量

  • 所属于对象,没有static修饰
  • 存放在堆内存中
  • 生存周期和对象的生存期相同

访问形式:

  1. 在本类中直接访问:变量名
  2. 通过类的一个对象访问 obj.变量名

 

类变量(静态变量)

  • 所属于类,static修饰
  • 存放在本地内存区(早期版本为方法区)
  • 静态变量的生存期是整个程序运行期

访问形式:

  1. 在本类中直接访问:变量名
  2. 通过类名访问:类名.变量名
  3. 通过类的一个对象访问 obj.变量名

 

示例:

class test {
   static int x=5;
   static { x+=10; }
   public static void main(String args[ ]) {
      System.out.println("x="+x);
   }
   static { x=x-5; }
}

注:执行结果:x=10-->所有静态初始化在类的装载时就执行

 

 

这里也说一下方法也可以分为实例方法,静态方法:

静态方法(类方法)

  • 用static修饰的方法
  • 在static方法中只能处理类变量,也可以访问其它static方法
  • 在static方法中绝不能直接访问任何归属对象空间的变量或方法

解释:因为静态代码块在类加载时就执行了,所以此时有可能对象还未被加载,因此不能引用

实例方法

  • 没有static修饰
  • 可以处理类变量,实例变量;
  • 可以直接访问实例方法,static方法

解释:因为实例方法执行时,静态代码块已经装载,因此实例方法调用没有太高的限制

示例:

public class TEST {
        long a[ ] = new long[10];
        public static void main ( String arg[ ] ) {
            System.out.println ( a[6] );//会出现编译错误
        }
    }

 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值