day10_类中成员之变量

news2024/11/25 20:12:25

通过以前的学习,我们知道了成员变量是类的重要组成部分。对象的属性以变量形式存在,下面我们就来详解的学习一下类中的变量

成员变量

成员变量的分类

  • 实例变量:没有static修饰,也叫对象属性,属于某个对象的,通过对象来使用
  • 类变量:有static修饰,也叫类变量,属于整个类的,不是属于某个实例

如何声明成员变量

属性的类型可以是Java的任意类型,包括基本数据类型、引用数据类型(类、接口、数组等)。

例如:声明一个中国人的类

class Chinese{
    static String country;//类变量
    String name;//默认值
    char gender = '男';//显式赋值
}

如何在类外面访问成员变量

类变量

成员变量/实例变量 

 

代码示例

class Chinese {
    static String country;
    String name;
    char gender = '男';
}

public class Demo {
    public static void main(String[] args) {
        //System.out.println(Chinese.name);错误,非静态成员变量必须通过对象.进行访问

        //创建对象
        Chinese c1 = new Chinese();
        
        //对象名.非静态成员变量名
        System.out.println(c1.name);//null
        
        //对象名.非静态成员变量名
        System.out.println(c1.gender);//男

        //类名.静态成员变量名,推荐
        System.out.println(Chinese.country);//null
        
        //静态的成员变量也可以通过对象.进行访问,不推荐
        System.out.println(c1.country);//null

    }
}

成员变量的默认值

每个成员变量声明之后,系统会其数据类型的不同自动赋予不同的默认值,如下图所示

类变量的值是所有对象共享的,当类变量发生改变的时候,任何此类的对象访问该变量都会发生改变。而实例变量的值是每个对象独立的。

代码示例

class Chinese {
    static String country;
    String name;
    char gender = '男';
}

public class Demo {
    public static void main(String[] args) {
        //创建对象c1
        Chinese c1 = new Chinese();

        //创建对象c2
        Chinese c2 = new Chinese();


        //给类变量赋值
        Chinese.country = "中国";//推荐

        //给对象c1的name属性赋值张三
        c1.name = "张三";

        //给对象c2的name属性赋值李四
        c2.name = "李四";

        //给对象c2的gender属性赋值女
        c2.gender = '女';

        //访问各个对象的成员变量
        System.out.println("c1.country = " + c1.country); //中国
        System.out.println("c1.name = " + c1.name); //张三
        System.out.println("c1.gender = " + c1.gender);//男

        System.out.println("c2.country = " + c2.country); //中国
        System.out.println("c2.name = " + c2.name);//李四
        System.out.println("c2.gender = " + c2.gender);//女
    }
}

成员变量的内存图

内存是计算机中重要的部件之一,它是与CPU进行沟通的桥梁。其作用是用于暂时存放CPU中的运算数据,以及与硬盘等外部存储器交换的数据。只要计算机在运行中,CPU就会把需要运算的数据调到内存中进行运算,当运算完成后CPU再将结果传送出来。我们编写的程序是存放在硬盘中的,在硬盘中的程序是不会运行的,必须放进内存中才能运行,运行完毕后会清空内存。Java虚拟机要运行程序,必须要对内存进行空间的分配和管理,每一片区域都有特定的处理数据方式和内存管理方式。

详解

下面我们使用画图的方式来分析一下为什么,类变量的值是当前类创建的所有对象共享的,而实例变量的值是每个对象独立

静态成员变量和实例变量的异同

相同点:

  • 位置类中方法外

不同点:

有无static修饰

  • 静态变量被static修饰
  • 实例变量不能被static修饰

内存中的分数不同  

  • 类变量:内存中只有一份,当前类创建的对象共享
  • 实例变量:每创建一个该类对象都会开辟一份空间,来存储不同对象的实例变量。

调用方式不同

  • 类变量: 可以使用对象名.属性名和类名.属性名调用,推荐使用类名.属性名调用调用
  • 实例变量:对象名.属性名

生命周期不同:

  • 类变量:随着类的加载而加载 随着类的消亡而消亡
  • 实例变量:随着对象的创建 ,对象消失(当对象没有引用指向时) 被垃圾回收器回收

存储的位置不一样

  • 类变量:方法区
  • 实例变量:堆中

成员变量和局部变量的区别

查看下面代码

public class Car {
    String color;// 成员变量

    // 成员方法
    public void drive(String name) {
       //声明在方法上的name和定义在方法里的speed都是局部变量
        int speed = 80;
        System.out.println("汽车正在以" + speed + "迈的速度行驶...");
    }
}

成员变量和局部变量的主要区别如下:

定义的位置不同: 

  • 成员变量定义在类中方法外,
  • 局部变量定义在方法中或者是方法声明上

在内存中的位置不同: 

  • 成员变量是在堆区,
  • 局部变量是在栈区

生命周期不同:

  • 成员变量是随着对象的创建而存在,随着对象的销毁而销毁
  • 局部变量是随着方法的调用而存在,随着方法调用完毕而销毁

默认值不同:

  • 成员变量有默认值
  • 局部变量没有默认值,不赋值不能直接使用

成员变量初始化方式有下面几种

  1. 成员变量有默认值
  2. 显式赋值
  3. 代码块
  4. 构造器只为实例变量初始化,不为静态类变量初始化
  5. 使用setXxx(参数列表)赋值

初始化详解

类初始化

  1. 类初始化的目的:为类中的静态变量进行赋值。
  2. 实际上,类初始化的过程时在调用一个<clinit>()方法,而这个方法是编译器自动生成的。编译器会将如下两部分的所有代码,按顺序合并到类初始化<clinit>()方法体中。 
    • 静态类成员变量的显式赋值语句
    • 静态代码块中的语句
  3. 整个类初始化只会进行一次,如果子类初始化时,发现父类没有初始化,那么会先初始化父类

结论:

每一个类都有一个类初始化方法<clinit>()方法,然后子类初始化时,如果发现父类加载和没有初始化,会先加载和初始化父类,然后再加载和初始化子类。一个类,只会初始化一次。

实例初始化

  1. 实例初始化的目的:为类中非静态成员变量赋值
  2. 实际上我们编写的代码在编译时,会自动处理代码,整理出一个<clinit>()的类初始化方法,还会整理出一个或多个的<init>(...)实例初始化方法。一个类有几个实例初始化方法,由这个类就有几个构造器决定。

实例初始化方法的方法体,由四部分构成:

  1. super()或super(实参列表) 这里选择哪个,看原来构造器首行是哪句,没写,默认就是super()
  2. 非静态实例变量的显示赋值语句
  3. 非静态代码块
  4. 对应构造器中的代码

特别说明:其中(2)和(3)是按顺序合并的,(1)一定在最前面(4)一定在最后面

执行特点:

  • 创建对象时,才会执行
  • 每new一个对象,都会完成该对象的实例初始化
  • 调用哪个构造器,就是执行它对应的<init>实例初始化方法
  • 创建子类对象时,父类对应的实例初始化会被先执行,执行父类哪个实例初始化方法,看用super()还是super(实参列表)

总结:

  • 类初始化肯定优先于实例初始化。
  • 类初始化只做一次。
  • 实例初始化是每次创建对象都要进行。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/647374.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

9k字长文理解Transformer: Attention Is All You Need

作者&#xff1a;猛码Memmat 目录 Abstract1 Introduction2 Background3 Model Architecture3.1 Encoder and Decoder Stacks3.2 Attention3.2.1 Scaled Dot-Product Attention3.2.2 Multi-Head Attention3.2.3 Applications of Attention in our Model 3.3 Position-wise Feed…

Linux 数据库 MySQL

Linux系统分类 ^ 数据库的分类 Linux系统 Centos(获取软件包使用yum、dnf) Ubuntu(获取软件包使用apt-get) Suse 国产系统 华为 欧拉 阿里 龙蜥 腾讯 tencentOS 麒麟&#xff08;银河麒麟、中标麒麟->基于centos 优麒麟-> 基于Ubuntu &#xff09; 统…

流计算、Flink和图计算

流计算 流计算流计算概述静态数据和流数据批量计算和实时计算流计算概念流计算与Hadoop流计算框架 流计算处理流程数据处理流程数据实时采集数据实时计算实时查询服务 流计算的应用开源流计算框架StormStorm简介Storm的特点 FlinkFlink简介为什么选择Flink传统数据处理架构大数…

三年 Android 开发的技术人生,浅谈自身面试的感悟

文章素材来源于网友 本篇主要记录了一个 Android 菜瓜三年的面试之旅&#xff0c;希望对大家面试、跳槽有所帮助。 一些唠叨 从进入这行开始&#xff0c;就是听说Android端凉了&#xff0c;寒冬这又如何那又如何的事情&#xff0c;很多的风言风语缠绕着这个圈子。但是老弟觉得…

电商系统架构设计系列(三):关于「订单系统」有哪些问题是要特别考虑的?

订单系统是整个电商系统中最重要的一个子系统&#xff0c;订单数据也就是电商企业最重要的数据资产。 上篇文章中&#xff0c;我给你留了一个思考题&#xff1a;当系统在创建和更新订单时&#xff0c;如何保证数据准确无误呢&#xff1f; 今天这篇文章&#xff0c;主要聊一下&…

DM8:达梦数据库开启SQL日志sqllog

DM8:达梦数据库开启SQL日志sqllog 环境介绍1 修改配置文件sqllog.ini2 开启与关闭 DMSQLLOG2.1 开启 sql 日志记录功能2.2 查询 sql 日志记录是否开启&#xff1a;0 关闭&#xff0c;1/2/3开启);2.3 关闭 sql 日志记录功能 3 sqllog.ini 详细介绍4 更多达梦数据库使用经验总结 …

辅助驾驶功能开发-功能算法篇(3)-ACC-弯道速度辅助

1、功能架构:ACC弯道速度辅助(CSA) 2、CSA功能控制 2.1 要求 2.1.1 CSA ASM:弯道速度辅助 1. 模式管理器:驾驶员应能够激活/关闭功能 应存在处理 CSA 功能的模式管理器。模式管理器由驾驶员输入和系统状态控制。 模式管理器有两个由 CSAStatus 定义的状态。状态转换定义…

ubuntu 系统解决GitHub无法访问问题

先后试了网上两个教程,终于解决。通过修改host文件实现访问。 教程1: 1)终端输入: sudo gedit /etc/hosts 打开hosts文件; 2)使用ip查找工具查询 http://github.com和IP:http://github.global.ssl.fastly.net的ip地址并添加到hosts文件末尾; 3)关掉hosts文件,在终端…

HTTPS协议-保障数据安全【安全篇】

我们都知道由于HTTP是明文的&#xff0c;整个传输过程完全透明&#xff0c;任何人都能够在链路中监听、修改、伪造请求/响应报文。所以不能满足我们的安全要求。比我如我们上网的信息会被轻易的截获&#xff0c;所浏览的网站真实性也无法验证。黑客可以伪装成银行、购物网站来盗…

接口测试常见接口类型?

常见接口类型 1.根据协议区分 1、webService接口:是走soap协议通过http传输请求报文和返回报文都是xml格式的&#xff0c;我们在测试的时候都用通过工具才能进行调用&#xff0c;测试。可以使用的工具有Soapul、jmeter、loadrunner等; 2、http接口:是走http协议&#xff0c;…

Vue向pdf文件中添加二维码

这两天刚看到一个需求&#xff0c;简单描述一下&#xff0c;就是我们拿到一个pdf文件流&#xff08;文件流可以是后端返回的&#xff0c;也可以是从自己本地选的&#xff09;和一个url链接 &#xff0c;现在要将url链接生成二维码&#xff0c;并将这个二维码添加到这个pdf文件中…

一元线性回归分析

一元线性回归分析&#xff1a; &#xff08;1&#xff09;假设X与Y有线性相关关系&#xff0c;求Y与X样本回归直线方程&#xff0c;并求 的无偏估计&#xff1b; &#xff08;2&#xff09;检验Y和X之间的线性关系是否显著(α0.05)&#xff1b; &#xff08;3&#xff09;当Xx0…

通过电脑屏幕传输文件

简介 本文介绍一套用于通过屏幕传输文件信息的软件。 通过屏幕传输文件&#xff0c;即非接触式&#xff0c;非插入式传递文件&#xff0c;是除了常用的网络传输&#xff0c;硬盘类介质拷贝之外的文件信息传输方式&#xff0c;基本原理就是将待传输的文件转换为二维码&#xf…

SkipList(跳表)

基本概述 SkipList&#xff08;跳表&#xff09;首先是链表&#xff0c;但与传统链表相比有几点差异&#xff1a; 元素按照升序排列存储节点可能包含多个指针&#xff0c;指针跨度不同【根据元素个数不同&#xff0c;可以建立多级指针&#xff08;最多可以建立32级指针&#…

liunx优化命令之free命令

free 这里写目录标题 一、free命令描述&#xff1a;1.free命令的语法&#xff1a;2.free命令的选项&#xff1a;3.free命令的输出格式&#xff1a; 二、压力测试工具stress&#xff1a;1.工具简介&#xff1a;2.参数详解&#xff1a;3.下载压力测试工具&#xff1a; 三、模拟实…

基于51单片机设计的红外遥控器

一、项目介绍 遥控器是现代生活中必不可少的电子产品之一,目前市面上的遥控器种类繁多,应用范围广泛。而 NEC 红外遥控器协议则是目前应用最为广泛的一种协议之一,几乎所有的电视、空调等家用电器都支持该协议。 本项目是基于 51 单片机设计支持 NEC 协议的红外遥控器,实…

TPU-MLIR的环境搭建和使用

1、开发环境配置 Linux开发环境 一台安装了Ubuntu16.04/18.04/20.04的x86主机&#xff0c;运行内存建议12GB以上下载SophonSDK开发包(v23.03.01) &#xff08;1&#xff09;解压缩SDK包 sudo apt-get install p7zip sudo apt-get install p7zip-full 7z x Release_<date&…

docker数据管理---数据卷,数据卷容器

在Docker中&#xff0c;数据卷&#xff08;data volumes&#xff09;和数据卷容器&#xff08;data volume containers&#xff09;是用于在容器之间共享和持久化数据的两种不同的机制。 一、数据卷 数据卷是一个特殊的目录或目录&#xff0c;可以绕过容器文件系统的常规层&a…

CSDN 周赛 58 期

CSDN 周赛 58 期 前言1、题目名称&#xff1a;打家劫舍2、题目名称&#xff1a;小Q的鲜榨柠檬汁3、题目名称&#xff1a;收件邮箱4、题目名称&#xff1a;莫名其妙的键盘后记 前言 很多人都知道&#xff0c;CSDN 周赛的题目出自每日一练&#xff0c;甚至连用例都不会变动&…

【一起啃书】《机器学习》第九章 聚类

文章目录 第九章 聚类9.1 聚类任务9.2 性能度量9.2.1 外部指标9.2.2 内部指标 9.3 距离计算9.3.1 欧氏距离9.3.2 曼哈顿距离9.3.3 切比雪夫距离9.3.4 闵可夫斯基距离9.3.5 标准化的欧几里得距离9.3.6 马氏距离9.3.7 兰氏距离9.3.8 余弦距离9.3.9 汉明距离9.3.10 编辑距离 9.4 原…