[Java入门笔记] 面向对象编程基础(三):成员变量和局部变量

在类中,变量根据定义的位置不一样,能够分为成员变量和局部变量。spa

成员变量是在类体内,方法以外定义的变量,局部变量是在方法中定义的参数。对象

成员变量

成员变量分为类属性实例属性,定义时没有static修饰的称为实例属性,有static修饰的称为类属性,类属性和实例属性的区别就是类属性是属于类的,它并不属于哪个对象,它从这个类的准备阶段就一直存在,一直到这个类彻底销毁。实例属性属于对象,只有某个对象被建立时,它才被建立,对象被回收,从属于该对象的实例属性也就被销毁了。blog

类属性的定义语法:

[修饰符] static 数据类型 变量名 [ = 值];

修饰符能够是public、protected、private和不写内存

数据类型能够是基本数据类型和引用数据类型字符串

static是修饰类属性必须的修饰符class

变量名由本身定义,不过要遵循标识符定义规则变量

值能够一开始就设置一个默认值,也能够不填,不填系统会分配一个默认值循环

  byte、short、int、long默认为0数据类型

  double、float默认为0.0语法

  char默认为'\u0000'

  boolean默认为false

  引用类型默认为null

 

访问:

类名.类属性名

 

固然,在Java中也可使用对象名访问类属性,可是不推荐这样使用,由于在逻辑上来讲,类属性是属于类的,而不该该用属性来访问它。

 

实例属性的定义语法:

[修饰符] 数据类型 变量名 [ = 值];

 

 规则相似类属性,只是没有static修饰。

访问:

对象名.属性名

 

 

例:

复制代码

public class Person{
    //定义两个实例属性
    public String name;
    public int age;
    //定义两个类属性,并为其设置默认值
    public static int eyeNum = 2;
    public static int mouthNum = 1;
}

复制代码

 

访问

复制代码

public class Test{
    public static void main(String[] args){
    Person p = new Person();
    p.name = "张三";
    p.age = 20;
    System.out.println("个人名字是:" + p.name);
    System.out.println("我有" + Person.mouthNum + "个嘴巴");

    Person p2 = new Person(); 
    p2.name = "李四"; 
    p2.age = 25; System.out.println("个人名字是:" + p2.name); 
    System.out.println("我有" + Person.mouthNum + "个嘴巴");
    }
}

复制代码

 

 

 

 

运行后输出:

个人名字是:张三
我有1个嘴巴
个人名字是:李四
我有1个嘴巴
 

实例属性和类属性建立和使用时在内存中的演示

前面咱们说过,类属性在类准备加载时就被加载到了内存中,存储在数据区(data segment),他们从类被加载以后就存在。

当咱们的代码执行到 Person p = new Person(); 建立对象,会为对象建立好实例变量,若是没有赋默认值就有系统分配默认值:

由上面咱们能够看到,尽管eyeNum和mouthNum属于Person类的类属性,可是其实p对象仍是能够经过引用找到类属性,可是咱们前面提到过,不建议使用对象得到或修改类属性。

咱们能够经过p对象设置或得到name和age属性

name是一个不可变的字符串引用数据类型String,后面的blog咱们再详细看看它,欢迎你们围观,它如今在内存中大体是这样的。

 

继续建立p2对象:

咱们能够看到,不管建立多少个Person对象,都只有一个eyeNum和mouthNum。

为p2赋值:

因此,改变p2时,是不会影响到p对象的值的,可是,若是咱们修改了类属性的值呢?

咱们在上面的例子中再加上几句句代码:

复制代码

public class Test{
    public static void main(String[] args){
    Person p = new Person();
    p.name = "张三";
    p.age = 20;
    //System.out.println("个人名字是:" + p.name);
    //System.out.println("我有" + Person.mouthNum + "个嘴巴");

    Person p2 = new Person(); 
    p2.name = "李四"; 
    p2.age = 25; 
    //System.out.println("个人名字是:" + p2.name); 
    //System.out.println("我有" + Person.mouthNum + "个嘴巴");

    //新加的代码,修改类属性的值
    p.mouthNum = 2;
    System.out.println("个人名字是:" + p.name);
    System.out.println("我有" + p.mouthNum + "个嘴巴");
    System.out.println("个人名字是:" + p2.name); 
    System.out.println("我有" + p2.mouthNum + "个嘴巴");
    }
}

复制代码

 

 

输出:

个人名字是:张三
我有2个嘴巴
个人名字是:李四
我有2个嘴巴

 

咱们能够看到,新的代码咱们使用 对象名.类属性 的方式访问类属性,获得的是一个值,因此也能够看书,类属性是属于类的,修改类属性,相互之间是有影响的。

局部变量

局部变量能够分为三种:

形参:在定义方法时方法所须要的参数值,在整个方法内有效。

方法局部变量:在方法体内定义的变量,在变量定义开始到方法结束时有效。

代码块局部变量:在代码块中定义的变量,在变量定义开始到代码块结束时有效。例如循环或者判断中定义的变量

例:

复制代码

public class Test{
  public static void main(String[] args){
    new Test().printHello(2);
  }

  public void printHello(int i1){  //i1是一个形参,在整个方法执行过程当中一直有效
    int i2 = 1;  //i2是一个方法局部变量,从这里开始,到方法结束一直有效
    while(i2 <= i1){
      int i3 = 1;  //i3是一个代码块局部变量,从这里开始,到循环体结束有效
      System.out.println("Hello");
      i3++;
      i2++;
    }
  }
}

复制代码

 

 

 

局部变量建立和使用在内存中的演示

当执行到 new Test().printHello(2); 时,调用printHello方法,传入一个参数:

向下执行:int i2 = 1;

向下执行,循环判断,i2小于i1,进入循环,执行 int i3 = 1;

继续执行,输出,i2,i3自加1

语句块结束,i3被清除,继续判断循环语句,i2<=i1知足条件,继续进入循环体

向下执行,再次定义i3,赋值1

继续向下执行,输出,i2,i3自加1

再次判断循环,条件不成立,循环结束。向下执行,方法结束,清空该方法中全部变量。

相关文章
相关标签/搜索