首页 > 编程语言 >java面向对象基础语法之成员变量和局部变量的区别(详细)

java面向对象基础语法之成员变量和局部变量的区别(详细)

时间:2024-02-03 21:33:02浏览次数:32  
标签:java 变量 静态 Car 局部变量 面向对象 实例 carName

一:概述

在面向对象一开始的学习中,对一些其中基础语法的了解和熟悉非常的重要,有助于更深入的去学习面向对象的知识。在这里具体的说明一下成员变量和局部变量的区别。

二:具体说明

<1>java中变量的分类

java面向对象基础语法之成员变量和局部变量的区别(详细)_局部变量

<2>成员变量和局部变量的定义说明。

成员变量:成员变量分为静态变量(类变量)和实例变量。静态变量有static修饰,它从该类的初始阶段就已经存在,直到这个类系统被摧毁,静态变量的作用域与这个类的生存范围相同也就是随着类的加载而加载实例变量没有static修饰,它从该类的实例被创建时就存在,直到系统摧毁这个实例,实例变量的作用域与对应实例的生存范围相同,静态变量的作用范围较实例变量来说范围更广存活时间周期长。

静态变量和实例变量的区别:静态变量使用类名访问,不需要创建实例,

类。静态变量

而实例变量需要通过实例访问,需要先new一个实例。

实例.实例变量

具体的代码实例

public class Car {
      // 静态变量
      static String carName = "奥迪";  // 汽车名称
      // 实例变量
      double price;   // 汽车的价格

}

public class CarTest {
         public static void main(String[] args) {
             Car c1 = new Car();
             Car c2 = new Car();
             Car.carName = "上汽大众";
             System.out.println("汽车的名称为:" + Car.carName);
             System.out.println("c1的价格:" + c1.price);
             System.out.println("c2的价格:" + c2.price);
         }

运行结果截图:

java面向对象基础语法之成员变量和局部变量的区别(详细)_静态变量_02





对上面这个代码简单说明一下,当程序第一次执行Car类时,系统先加载这个类,并初始化这个类,在类的准备阶段,系统就为该类的类变量分配内存空间,并指定默认初始值(静态变量name也是在这个阶段完成了初始化);然后接下来系统就在堆内存中为Car类分配了一块内存区,且为price默认值为0,然后生成了Car对象,并通过引用变量c2指向该对象。

当再次执行Car类时,已经不需要再为Car类初始化了,所以直接生成了Car对象,通过c2指向它。

局部变量:它有三种不同的表现形式:

  • 形参:在定义方法时定义变量,形参的作用域在整个方法内有效。通常方法可以传参也可以不传参,具体看实际应用情况。
  • 方法局部变量:在方法体中定义的变量,作用域从定义该变量的地方生效,到方法结束之时失效。
  • 代码块局部变量:在代码块中定义的变量,作用域从定义该变量的地方生效,到该代码结束时失效,代码块可用于初始化变量。优先于类的加载。

和成员变量不同的是,局部变量除了形参之外,都需要指定一个初始值,否则就无法访问。

局部变量在内存中的运行机制。

因为局部变量需要显示初始化,所以系统不会对它进行初始画dwwcn,即系统并没有给局部变量分配内存空间,只有它赋值之后,系统才会分配内存将该值放入其中
因为局部变量不属于任何对象或者类,所以局部变量存放在栈内存中,且栈内存中的变量不需要系统垃圾回收,因为它们会随着方法或者代码运行结束而结束;所以局部变量只保存基本类型或者对象的引用(引用变量),所以
局部变量占用内存比较小;

注意:java语法允许局部变量和成员变量重名,但是如果在一个方法里,局部变量会覆盖成员变量。如果想要在该方法中访问成员变量,需要通过**this关键字(针对实例变量)去调用或者类名(针对静态变量),**作为调用者来限定访问成员。this关键在的作用就是区分成员变量和局部变量,使用的原则是,谁离它进就用谁。

具体代码说明:

public class CarTest2 {
    // 静态变量  类变量
    static String carName = "奥迪";  // 汽车名称
    // 实例变量
    double price = 500000;   // 汽车的价格

    public static void main(String[] args) {

        // 局部变量 和静态变量carName = “奥迪”重名
        String carName = "劳斯莱斯";

        // 静态变量carName被这里的局部变量所覆盖,所以输出劳斯莱斯
        System.out.println("汽车的名字:" + carName);


        // 这时候如果想要调用静态变量可以使用类名.变量名去调用
        // 在这里不能使用this去调用,因为main方法是静态方法
        System.out.println("汽车名称:" + CarTest2.carName);

        // 调用方法
        new CarTest2().check();
    }

    public void check() {
        // 局部变量 和实例变量price = "500000"重名
        double price = 600000;
        // 因为实例变量carName被这里的局部变量覆盖,所以输出为“600000”
        System.out.println("汽车的价格为:" + price);
        // 这时候如果想要调用实例变量可以使用this调用
        System.out.println("汽车价格为:" + this.price);
    }


}

运行结果截图:

java面向对象基础语法之成员变量和局部变量的区别(详细)_静态变量_03

<3>成员变量和局部变量的区别

  1. 类中位置不同:**成员变量(类中方法外)局部变量(方法内部或方法声明上)
  2. 内存中位置不同:**成员变量(堆内存)局部变量(栈内存)
  3. 生命周期不同:**成员变量(随着对象的存在而存在,随着对象的消失而消失)局部变量(随着方法的调用而存在,醉着方法的调用完毕而消失)
  4. 初始化值不同:**成员变量(有默认初始化值)局部变量(没有默认初始化值,必须先定义,赋值才能使用)






标签:java,变量,静态,Car,局部变量,面向对象,实例,carName
From: https://blog.51cto.com/u_15912723/9570198

相关文章

  • 【Java基础】BlockingQueue及其子类
    ArrayBlockingQueue(数组实现的有界阻塞队列)特点:基于数组的有界阻塞队列,按先进先出(FIFO)原则排序元素。可以选择公平性(即按线程等待的先后顺序访问队列)或非公平性,默认是非公平的。用途:适用于需要固定大小的队列场景。LinkedBlockingQueue(链表实现的阻塞队列)特点:基于链表的可选边界(有......
  • 地铁最优线路算法的求解(三)-深度优先搜索java实现
    多的不说,showmethecode,先上一段java代码1/*2*深度优先算法(DFS)算法生成所有可能路径3*startId:出发站4*endId:到达站5*graph:辅助邻接矩阵,若99站与35站相邻,6*则graph[35][99]=1,graph[99][35]=17*8*......
  • Java套接字编程学习
    一、前言Java套接字编程用于不同JRE上运行的应用程序之间进行通信,可以是面向连接或无连接的。Socket类和ServerSocket类用于面向连接的套接字编程,DatagramSocket类和DatagramPacket类用于无连接的套接字编程。我们需要根据服务器IP地址和端口号来区分套接字。Socket类用于客户端和......
  • Java生成微信小程序二维码的方式有哪些?
    大家好我是咕噜美乐蒂,很高兴又见面啦!今天我们来谈一下如何使用Java生成微信小程序二维码,有哪些方式方法呢?生成微信小程序二维码是开发微信小程序时的常见需求之一。在Java中,我们可以使用多种方式来生成微信小程序二维码。本文将为您介绍几种常用的方式。一、使用第三方库1.zxingzxi......
  • linux的java服务启动,停止sh脚本
    #!/bin/bash#######################################################Copyright2019PhamNgocHoai##LicensedundertheApacheLicense,Version2.0(the"License");#youmaynotusethisfileexceptincompliancewiththeLicense.#Youmay......
  • Java 中的Map集合
    Map1.Map接口中常用的方法importjava.util.Collection;importjava.util.HashMap;importjava.util.Map;/*java.util.Map接口中常用的方法:Map和Collection没有继承关系Map集合以key和value的方式存储数据:键值对key和value都是引用数据类型key和value都是存储对象的地......
  • 如何在 JavaScript 中验证 URL
    如何在JavaScript中验证URL统一资源定位符URL(UniformResourceLocator)引导你进入互联网上的一个页面或文件。URL是互联网上事物的地址。所有有效的URL都遵循某些模式。因此,如果你知道这些模式,你就可以在你的程序中确定一个URL是否有效,并给出反馈、抛出一个错误,等等。......
  • java项目启动脚本
    #!/bin/sh##javaenv##API_NAME:包名API_NAME=dsJAR_NAME=`ls$API_NAME*.jar`#PID代表是PID文件PID=$API_NAME\.pid#使用说明,用来提示输入参数usage(){echo"Usage:sh执行脚本.sh[start|stop|restart|status]"exit1}#检查程序是否在运行is_ex......
  • java中如何获取Stream流
    在Java中获取Stream流主要有以下几种方式:通过集合类(Collection)获取:所有的java.util.Collection接口的实现类,包括List,Set,和Queue等,都可以使用.stream()方法来获取一个Stream。例如:List<String>list=Arrays.asList("a","b","c");Stream<String>streamOfList=......
  • 关于java时间类型和格式化到微秒问题
    常规的问题此处略,因为网络上到处都是,这里主要讨论三个问题:1.数据库的时间戳类型(含微秒)对应java的什么类型java的常见时间类型比较多:java.util.Datejava.sql.Datejava.sql.Timestampjava.util.Calendarjava.time.LocalDatejava.time.LocalTimejava.time.LocalDateTime......