zoukankan      html  css  js  c++  java
  • [Java入门笔记] 面向对象编程基础(三):成员变量和局部变量

    在类中,变量根据定义的位置不同,可以分为成员变量和局部变量。

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

    成员变量

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

    类属性的定义语法:

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

    修饰符可以是public、protected、private和不写

    数据类型可以是基本数据类型和引用数据类型

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

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

    值可以一开始就设置一个默认值,也可以不填,不填系统会分配一个默认值

      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

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

  • 相关阅读:
    聊聊、Highcharts 动态数据
    聊聊、Zookeeper Linux 启动
    聊聊、Zookeeper 客户端 Curator
    聊聊、Zookeeper 客户端 ZkClient
    聊聊、Zookeeper API
    聊聊、Zookeeper 数据结构和操作命令
    聊聊、Java 网络编程
    《Mysql 索引
    《Mysql 事务
    《Mysql 一条 SQL 更新语句是如何执行的?(Redo log)》
  • 原文地址:https://www.cnblogs.com/hopeblog/p/5023192.html
Copyright © 2011-2022 走看看