3.primitive主数据类型和引用 认识变量

news2025/1/12 5:58:17

3.1 声明变量

Java注重类型。它不会让你做出把长颈鹿类型变量装进兔子类型变量中这种诡异又危险的举动——如果有人对长颈鹿调用“跳跃”这个方法会发生什么样的悲剧?并且它也不会让你将浮点数类型变量放进整数类型的变量中,除非你先跟编译器确认过数字可以损失掉精确度(例如说舍去所有的小数值)。

编译器会指出大部分的问题:
Rabbit hopper = new Giraffe();
这样的程序过不了编译器这关。

为了要让类型安全能够发挥作用,必须声明所有变量的类型,指定它是个int类型或是个Dog类型。变量有两种口味:清凉的primitive主数据类型与香辣的对象引用。primitive主数据类型用来保存基本类型的值,包括整数、布尔和浮点数等。而对象引用保存的是对象的引用。

先记住下面这条声明变量的规则:
variables must have a type
变量必须拥有类型。另一条规则是必须要有名称。
variables must have a name—

int count;
类型 名称

注意:当你读到“X 类型的 Y 对象”时,类型(type)此时与类是相通的同义字。

3.2 Primitive主数据类型

变量就像是杯子,是一种容器,承装某些事物。

primitive主数据类型

类型   位数   值域

boolean与char

boolean  (Java虚拟机决定)  true或false

char   16 bits   0~65535

数值(带正负号)

integer

byte   8 bits   -128 ~ 127

short   16 bits   -32768 ~ 32767

int   32 bits   -2147483648 ~ 2147483647

long   64 bits   -很大 ~ +很大   

浮点数

float   32 bits   范围规模可变

double   64 bits   范围规模可变

primitive主数据类型的声明与赋值声明

int x;

x = 234;

byte b = 89;

boolean isFun = true;

double d = 3456.98;

char c = 'f';

int z = x;

boolean isPunkRock;

isPunkRock = false;

boolean powerOn;

powerOn = isFun;

long big = 3456789;

float f = 32.5f;

除非加上f,否则所有带小数点的值都会被Java当作double处理

当心溢出,要确保变量能存下所保存的值

编译器不允许将大变量赋值给小变量,但是反过来可以

3.3 Java关键字

类、方法、变量命名规则:

  • 名称必须以字母、下划线(_)或$符号开头,不能用数字开头
  • 除了第一个字符之外,后面就可以用数字
  • 避开Java的保留字

3.4 引用变量

  • 事实上没有对象变量这样的对象存在
  • 只有引用(reference)到对象的变量
  • 对象引用变量保存的是存取对象的方法
  • 它并不是对象的容器,二十类似指向对象的指针。或者可以说是地址。但在Java中我们不会也不该知道引用变量中实际装载的是什么,它只是用来代表单一的u对象。只有Java虚拟机才会知道如何使用引用来取得该对象。

无法将对象装进变量中

虽然primitive主数据类型变量是以字节来代表实际的变量值,但对象引用变量却是以字节来表示取得对象的方法

使用圆点运算符(.)来对引用变量表示,取得圆点前面的对象,然后求出该对象在圆点后面的事物。

3.5 对象的声明与赋值

对象引用也只是个变量值,还是会有东西放进杯子中,只是引用所放进去的是遥控器

Primitive主数据类型变量

byte x = 7;

代表数值7的字节被放进变量中(00000111)

引用变量

Dog myDog = new Dog();

代表取得Dog对象的方法以字节形式放进变量中,对象本身并没有放进变量中

对primitive主数据类型中的变量来说,变量值就是所代表的值(如5、-26.7或a’)。对引用变量来说,变量值是取得特定对象的位表示法。 

1.声明一个引用变量

Dog myDog = new Dog();

要求Java虚拟机分配空间给引用变量,并将此变量命名为myDog。此引用变量将永远被固定为Dog类型。换句话说,它是个控制Dog的遥控器,不会是Cat或皮卡丘的遥控器。

2.创建对象

Dog myDog = new Dog();

要求Java虚拟机分配堆空间给新建立的Dog对象

3.连接对象和引用

 Dog myDog = new Dog();

将新的Dog赋值给myDog这个引用变量,换言之就是设定遥控器

3.6 可回收堆空间

1.在垃圾收集堆上的生活

Book b = new Book();

Book c = new Book();

声明两个Book的引用变量并创建两个Book对象,然后将Book对象赋值给引用变量。现在这两个Book对象生活在堆上。

引用数:2

对象数:2

Book d = c; 

声明新的Book引用变量,但不创建新的Book变量而将变量c的值赋给值给变量d。这代表“将c的字节组合拷贝给变量d”

c与d引用到同一对象

相同值的两份拷贝,一台电视两个遥控器。

引用数:3

对象数:2

c = b;

把变量b的值赋给变量c。变量b的字节组合被拷贝一份给c

b与c两者都引用相同的对象 

引用数:3

对象数:2

2.堆上的生与死

Book b = new Book();

Book c = new Book();

声明两个Book的引用变量并创建两个Book对象,然后将Book对象赋值给引用变量。现在这两个Book对象生活在堆上。

引用数:2

对象数:2

b = c;

把变量c的值赋给变量b,两者带有相同的值。

对象1被抛弃且能够作垃圾收集器(GC)。

引用数:2

对象数:2

被抛弃对象数:1

对象1已经没有引用,变成无法存取的。

c = null; 

将null值赋给c。这代表它不再引用任何事物,但还是个可以被指定引用其他Book的引用变量

对象2还引用到,所以不能够作垃圾收集器(GC)

作用中的引用数:1

null引用数:1

可存取对象数:1

被抛弃对象数:1

3.7 数组

数组犹如杯架

1.声明一个int数组变量。数组变量是数组对象的遥控器

int[] nums;

2.创建大小为7的数组,并将它赋值给之前声明为int[]的变量nums

nums = new int[7];

3.赋予int数组的每一个元素一个int值。在int数组中的每个元素皆为int类型的变量

nums[0] = 6;

nums[1] = 19;

nums[2] = 44;

nums[3] = 42;

nums[4] = 10;

nums[5] = 20;

nums[6] = 1;

数组也是对象,不论被声明来承载的是primitive主数据类型或对象引用

Java的标准函数库包含了许多复杂的数据结构,比如map、tree和set(见附录B),但如果需要快速、有序、有效率地排列元素时,数组是不错的选择。数组能够让你使用位置索引来快速、随机地存取其中的元素。

数组中的每个元素都是变量。换言之,会是8种primitive主数据类型变量中的1种,不然就是引用变量。可以放进该类型变量中的值都可以当作此类型数组的元素。所以在int类型的数组中,每个元素可以装载一个int。所以在Dog的数组中(Dogll)每个可以装载一个Dog吗?错,要记得引用变量只会保存引用,而不是对象本身。因此Dog数组的元素持有的是Dog的遥控器。当然啦,我们还得创建Dog对象。

创建Dog数组

1.声明一个Dog数组变量

Dog[] pets;

2.创建大小为7的Dog数组,并赋值给前面所声明出的Dog[]类型变量pets

pets = new Dog[7];

3.创建新的Dog大小并将他们赋值给数组的元素。

pets[0] = new Dog();

pets[1] = new Dog();

控制Dog(通过引用变量)

Dog fido = new Dog();

fido.name = "Fido";

我们创建出Dog对象并使用圆点运算符来操作引用变量fido并存取它的name变量。
我们可以运用fido这个引用来让Dog执行bark()或其他的方法。
fido.bark();

fido.chaseCat();

如何存取Dog数组中的Dog

对数组的操作可以不需要变量名称,只需要数组索引(位置)就可以操作特定对象

Dog[] myDogs = new Dog[3];

myDogs[0] = new Dog();

myDogs[0].name = "Fido";

myDogs[0].bark();

Java注重类型
一旦数组被声明出来,你就只能装入所声明类型的元素。

举例来说,你不能将Cat放到Dog数组中(如果有人尝试要让数组中的每个元素都汪汪叫一次会出现什么状况?)。double也不能放进int数组中。但是你可以将byte放进int的数组中,因为byte可以放进int尺寸的杯子中。这被称为隐含展开(implicit widening,稍后会有更多的说明,现在只需要注意编译器会根据数组所声明的类型来防止错误的类型)。

public class Dog {
    String name;

    public static void main(String[] args) {
        //创建Dog对象
        Dog dog1 = new Dog();
        dog1.bark();
        dog1.name = "Bart";

        //创建Dog数组
        Dog[] myDogs = new Dog[3];
        //关门放狗
        myDogs[0] = new Dog();
        myDogs[1] = new Dog();
        myDogs[2] = dog1;

        //通过数组引用存取Dog
        myDogs[0].name = "Fired";
        myDogs[1].name = "Marge";

        //myDog[2]的名字是
        System.out.print("last dog's name is ");
        System.out.println(myDogs[2].name);

        //逐个对Dog执行bark()
        int x = 0;
        while (x < myDogs.length) {
            myDogs[x].bark();
            x = x + 1;
        }
    }
    public void bark() {
        System.out.println(name + " says Ruff!");
    }
    public void eat() { }
    public void chaseCat() { }
}

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

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

相关文章

自动驾驶传感器技术

自动驾驶传感器技术是自动驾驶系统的关键组成部分&#xff0c;它使车辆能够感知并理解周围环境。本文将深入探讨自动驾驶传感器技术&#xff0c;包括常见类型、工作原理以及它们在自动驾驶中的作用。 1. 摄像头 摄像头的工作原理 摄像头是基于光学原理的传感器&#xff0c;其…

知识图谱1_2——下载neo4j客户端

客户端下载 这里展现一种通过客户端进行操作的方法 https://neo4j.com/download/ 下载desktop客户端 填写完成后开始下载 下载完成后&#xff0c;在命令行输入 chmod x <文件名> #给予文件权限 sudo add-apt-repository universe #安装.appimage所需的包fuse&#x…

Gooxi国鑫搭载第四代英特尔至强可扩展处理器系列服务器焕新登场

由算力驱动的数字经济渗透到了百行千业&#xff0c;在驱动传统经济转型升级和效能优化的同时&#xff0c;也大幅度增加了各行业数据处理能力的需求 。 面对千行百业加速创新应用和AIGC时代像潮水一样奔涌算力需求&#xff0c;得益于第四代英特尔至强可扩展处理器以及基于Gooxi最…

功率谱密度估计 - welch方法的实现

因本人知识欠缺&#xff0c;后续再对下述展开讲述。 clc;clear;close all; fs 44100; t 0:1/fs:1-1/fs; x randn(size(t));load("myfir64.mat"); filtercoe myfir64; y filter(filtercoe, 1, x);[Hx, w] freqz(filtercoe, 1, fs); fx w*fs/2/pi; subplot(211…

RK3568平台开发系列讲解(驱动篇)rk3568 的 pinctrl 子系统驱动

🚀返回专栏总目录 文章目录 一、pinctrl 子系统简介二、rk3568 的 pinctrl 子系统驱动2.1、PIN_BANK2.2、PIN_BANK_IDX2.3、MUX2.4、phandle沉淀、分享、成长,让自己和他人都能有所收获!😄 📢Linux 是一个庞大而完善的系统,尤其是驱动框架,像 GPIO 这种最基本的驱动不…

MySQL8 间隙锁在11种情况下的锁持有情况分析

测试环境及相关必要知识 测试环境为mysql 8 版本 间隙锁&#xff08;Gap Lock&#xff09;&#xff1a;用于锁定索引范围之间的间隙&#xff0c;防止其他事务在此间隙中插入新记录。间隙锁主要用于防止幻读问题。 在可重复读的隔离级别下默认打开该锁机制&#xff0c;解决幻…

Hadoop设置hdfs全局指令

在终端进入用户个人环境变量配置文件 vim ~/.bashrc 然后添加如下内容 export PATH$PATH:/usr/local/hadoop/bin 添加到你的hadoop下载目录的bin目录为止就可以了 重新激活一下配置文件 source ~/.bashrc hdfs有专属于自己的文件存储目录,加上特殊的指令就可以箱终端一…

windows redis 自启动 Redis服务无法启动报错1067问题

如果你的系统服务里面已经有redis服务并且无法启动&#xff0c;则使用下面的命令卸载此服务 ! 1、停止Redis服务&#xff1a; redis-server --service-uninstall 2、删除系统服务 sc delete redis 进入到你的Redis安装目录&#xff0c;我的在以下目录&#xff0c;谨记此时不…

Pikachu靶场——XSS漏洞(Cross-Site Scripting)

文章目录 1. XSS&#xff08;Cross-Site Scripting&#xff09;1.1 反射型XSS(get)1.2 反射型XSS(post)1.3 存储型XSS1.4 DOM型XSS1.5 DOM型XSS-X1.6 XSS盲打1.7 XSS之过滤1.8 XSS之htmlspecialcharss1.9 XSS之href输出1.10 XSS之JS输出1.11 XSS 漏洞防御 1. XSS&#xff08;Cr…

计算机毕设 招聘网站爬取与大数据分析可视化 - python 分析 可视化 flask

文章目录 0 前言1 课题背景2 实现效果3 Flask框架4 Echarts5 爬虫6 最后 0 前言 &#x1f525; 这两年开始毕业设计和毕业答辩的要求和难度不断提升&#xff0c;传统的毕设题目缺少创新和亮点&#xff0c;往往达不到毕业答辩的要求&#xff0c;这两年不断有学弟学妹告诉学长自…

SpringTask ----定时任务框架 ----苍穹外卖day10

目录 SpringTask 需求分析 快速入门 使用步骤 ​编辑业务开发 SpringTask 定时任务场景特化的框架 需求分析 快速入门 使用cron表达式来使用该框架 使用步骤 添加注解 自定义定时任务类 重点在于以下cron表达式的书写,精确表达触发的间隔 业务开发 主task方法 time使用(-…

No168.精选前端面试题,享受每天的挑战和学习

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入…

JUC第十七讲:JUC集合: ConcurrentLinkedQueue详解

JUC第十七讲&#xff1a;JUC集合: ConcurrentLinkedQueue详解 本文是JUC第十七讲&#xff1a;JUC集合 - ConcurrentLinkedQueue详解。ConcurerntLinkedQueue一个基于链接节点的无界线程安全队列。此队列按照 FIFO(先进先出)原则对元素进行排序。队列的头部是在队列中时间最长的…

【Java】微服务——Feign远程调用

目录 1.Feign替代RestTemplate1&#xff09;引入依赖2&#xff09;添加注解3&#xff09;编写Feign的客户端4&#xff09;测试5&#xff09;总结 2.自定义配置2.1.配置文件方式2.2.Java代码方式 3.Feign使用优化4.最佳实践4.1.继承方式4.2.抽取方式4.3.实现基于抽取的最佳实践1…

老鼠走迷宫java ---递归

题目 有一个八行七列的数组&#xff0c;红色的格子代表墙&#xff0c;白色格子代表可以走的格子&#xff1b; 假定老鼠起点在map【1】【1】&#xff0c;设计算法帮老鼠找到到达终点map【6】【5】的路线。 思路 1.findWay方法就是专门来找出迷宫的路径 2.如果找到&#xff…

阿里测试师用UI自动化测试实现元素定位!

随着IT行业的发展&#xff0c;产品愈渐复杂&#xff0c;web端业务及流程更加繁琐&#xff0c;目前UI测试仅是针对单一页面&#xff0c;操作量大。为了满足多页面功能及流程的需求及节省工时&#xff0c;设计了这款UI 自动化测试程序。旨在提供接口&#xff0c;集成到蜗牛自动化…

第3章 Micro SaaS 的挑战

目录 1.对系统和平台的依赖 2.个人动力/责任随你而止 3.无尽的客户支持 4.模仿者 最后的想法 尽管 Micro SaaS 有很多好处&#xff0c;但这种商业模式并非没有其独特的缺点&#xff0c;您在开始时需要注意这些缺点。 以下是您需要了解的 Micro SaaS 的一些主要挑战&#…

BeanFactory和FactoryBean,ApplicationContext的关系

他们的区别比较容易理解&#xff0c;从字面意思就能区分开来&#xff0c;BeanFactory是Bean工厂&#xff0c;而FactoryBean是工厂BeanBeanFactory&#xff0c;Spring中工厂的顶层规范&#xff0c;他是IOC容器的核心接口&#xff0c;它的职责包括&#xff1a;实例化、定位、配置…

AIGC AI绘画 Midjourney 参数大全详细列表

AIGC ChatGPT 职场案例60集&#xff0c; Power BI 商业智能 68集&#xff0c; 数据库Mysql8.0 54集 数据库Oracle21C 142集&#xff0c; Office&#xff0c; Python &#xff0c;ETL Excel 2021 实操&#xff0c;函数&#xff0c;图表&#xff0c;大屏可视化 案例实战 http:…

最新AI创作程序源码ChatGPT系统网站源码/Ai绘画系统/支持OpenAI GPT全模型+国内AI全模型/详细搭建部署教程

一、AI创作系统 SparkAi创作系统是基于OpenAI很火的ChatGPT进行开发的Ai智能问答系统&#xff0c;支持OpenAI GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI创作Chat…