首页 > 编程语言 >【老白学 Java】人以群分,物以类聚

【老白学 Java】人以群分,物以类聚

时间:2024-11-11 15:17:47浏览次数:3  
标签:Java 变量 对象 Dog 人以群分 引用 数组 老白学

人以群分,物以类聚

码老白
文章来源:《Head First Java》修炼感悟。

上一章,Guess 想必让师兄们留下「深刻」印象,也见到了 OOP 应有的样子。 本章老白继续学习 Java 变量相关的知识,感兴趣的师兄可以继续往下看。

一、变量的分类

Java 的数据类型可分为两大类:

  • 基本数据类型
  • 引用数据类型

1.1 基本数据类型

基本类型用于直接存储变量的值,可分为以下 8 种:

基本类型类型名称位数取值范围
boolean布尔型8true 或者 false
char字符型160~65535
byte字节型8-128~127
short短整型16-32768~32767
int整型32-2147483648~2147483647
long长整型64-9223372036854775808~9223372036854775807
float浮点型32-3.4028e+38~3.4028e+38
double双精度浮点型64-1.797e+308~1.797e+308

1.2 引用数据类型

引用类型包括类,接口和数组。引用变量存储的是对象的引用值(内存地址),对象本身存储在可回收的内存堆中。

老白顿悟: 虽然引用变量保存的是对象的内存地址,但不要试图通过「指针」去操作对象。 Java 没有「指针」概念,但你完全可以放心地把对象交给 JVM 去管理。

二、变量的声明和初始化

Java 是一种强类型语言,为确保类型安全,每个变量在使用前必须声明其类型。

2.1 变量的命名规则

  • 变量名不能以数字开头;
  • 变量名必须以字母,下划线 _ 或者美元符号 $ 开头;
  • 变量名应该取一些有实际意义的名字,比如 totalImg 要好过 img1
  • 变量名不能使用 Java 关键字(附在本章最后);
  • 如果变量名是由多个单词组成,建议使用「驼峰」命名法。

老白顿悟:没有必要把 Java 的所有关键字都背下来,用久了自然就会记住。 如果不小心使用了关键字也没关系,编译器不会让你顺利通过。

2.2 变量的声明

type variableName [= value];

2.3 变量的初始化

声明变量时,可同时进行初始化(即赋值),也可以以后再赋值。 例如:

// 基本变量初始化
int number = 2;
int value;
value = 3;

// 引用变量初始化
Dog dog = new Dog();
Cat cat;
cat = new Cat();

三、变量的作用域

Java 作用域可以限制变量的访问范围,分以下三种:

3.1 局部变量

局部变量是在方法、构造器或块中声明的变量,只能在这些区域内访问。

public class Dog {
	public static void main(String[] args) {
		// String 类型的局部变量,只能在这个 main 方法中访问
		String name = "小白";
		System.out.println("老白和" + name);
	}
}

3.2 实例变量

实例变量是在方法之外声明的变量,是类的实例变量,每个对象都有属于自己的实例变量。

public class Dog {

	// 声明 String 类型的实例变量
	public String name = "小白";
	
	// 通过实例对象+圆点符号访问实例变量 name
	public static void main(String[] args) {
		Dog dog = new Dog();
		System.out.println("老白和" + dog.name);
	}
}

3.3 类变量(静态变量)

类变量使用 static 关键字修饰,它只属于当前类,不属于类的实例对象,所有类的实例对象共享这个类变量。 换句话说,无论你创建了多少这个类的实例对象,始终只有这一个类变量。 例如:

public class Dog {
	// String 类型的静态变量,注意使用了 static 关键字
	public static String name = "小白";
	
	// 在其它类中可以通过圆点符号直接访问 Dog 类的静态变量 name
	public static void main(String[] args) {
		System.out.println("老白和" + Dog.name);
	}
}

四、数组对象

数组,是由相同类型的多个变量组成的对象, 数组元素可以是任何数据类型。

4.1 数组的特点

  • 数组元素必须是同一种类型;
  • 数组元素可以是基本类型,也可以是引用类型;
  • 数组的长度固定不变,所占内存空间大小固定。

4.2 定义数组的两种语法

  1. type arrayName[];
  2. type[] arrayName;

4.3 初始化数组两种形式

  1. 静态初始化,显式指定每个数组元素的值,系统自动推测数组长度
    arrayName = new type[] {element1, element2, element3, ...};
  2. 动态初始化,显式指定数组长度,系统自动分配默认值。
    arrayName = new type[length];

4.4 访问数组元素

通过索引访问数组元素,数组的索引从 0 开始,最后一个索引值为数组长度减一。如果超出索引范围,会引发 ArrayIndexOutOfBoundException(数组越界异常)。 例如:

public class StringDemo {
	public static void main(String[] args) {
		// 基本数据类型初始化
		int[] nums = new int[3];
		nums[0] = 0;
		nums[1] = 1;
		nums[2] = 2;
		System.out.println("" + nums[0] + nums[1] + nums[2]); // 012
		
		// 引用数据类型初始化
		String[] str = new String[] {"Hello", " ", "Java"};
		System.out.println(str[0] + str[1] + str[2]); // Hello Java
		
		// 试图访问 str[3] 时引发异常,超出索引范围
		// System.out.println(str[3]);
	}
}

老白顿悟: 数组始终都是对象,需要按照对象方式来处理,即便数组元素是基本数据类型也不例外。

老白顿悟: 数组元素为引用类型时要注意,初始化结束后应该通过某种方式为每一个数组元素赋值。 初学阶段,遇到最多的异常可能就是 NullPointerException(空指针异常)。 大部分原因就是因为数组元素没有实例化,导致引用了一个null 对象。

五、Dog 在「堆」中的生活

很久以前,「堆」中没有任何对象。 自从使用了 new,「堆」中便时常传出「汪汪汪」的叫声:

Dog dogA = new Dog("阿花");
Dog dogB = new Dog("阿草");

上述语句声明了两个引用变量 dogA 和 dogB,同时新建了两个 Dog 对象 「阿花」和 「阿草」。 通过赋值运算符 = 把 Dog 对象赋给两个引用变量,此刻,「堆」中多出了两只狗狗。
new Dog
很快,狗狗的叫声吸引了路人,情况又有了些变化:

Dog dogC = dogB;

起初,引用变量 dogC 还没有自己的 Dog 对象,仅仅做出了声明。 引用变量 dogB 说,你可以试试「阿草」,于是把自己的值赋给了 dogC 。 现在,dogB 和 dogC 共同拥有了「阿草」。
dogC=dogB
由于「阿草」精力过于旺盛,dogA 劝说 dogB 放弃「阿草」并把自己的值赋给了 dogB。

dogB = dogA;

这样一来,dogA 和 dogB 都拥有了「阿花」,而 dogC 独享「阿草」。
dogB=dogA
终于有一天,dogC 再也无法忍受「阿草」,决定放弃领养。 于是:

dogC = null;

此时再来看看「堆」中的情况:
dogC=null
dogA 和 dogB 依然拥有「阿花」,而可怜的「阿草」成为了无主的 Dog 对象,等待它的将是被 GC(垃圾收集器)无情销毁的命运。 其实,「阿草」并没有错,因为它知道,如果不能引起「引用变量」的关注只能是灭亡。

老白顿悟: 如果「堆」中对象不存在任何引用,GC 将适时销毁该对象并释放所占用的资源。

六、本章回顾

  • Java 有两种数据类型:基本类型和引用类型;
  • 声明变量时必须要有类型和名称;
  • 基本数据类型存储的是变量的实际值;
  • 引用数据类型存储的是堆中对象的引用值(地址);
  • 引用变量通过圆点运算符访问对象的实例变量和方法;
  • 如果引用变量没有引用任何对象,其值为 null;
  • 无论数组元素是什么类型,数组始终是对象。

附:Java 关键字

Java8,共 50 个

   -      -      -      -      -   
abstractcontinuefornewswitch
assertdefaultifpackagesynchronized
booleandogotoprivatethis
breakdoubleimplementsprotectedthrow
byteelseimportpublicthrows
caseenuminstanceofreturntransient
catchextendsintshorttry
charfinalinterfacestaticvoid
classfinallylongstrictfpvolatile
constfloatnativesuperwhile

Java17,新增 17 个

   -      -      -      -      -   
exportsopensrequiresusesmodule
permitssealedvarnon-sealedprovides
towithopenrecordtransitive
yield_ (underscore)

Java23(最新版本),新增 1 个

   -      -      -      -      -   
when

截止目前为止,Java 关键字共计 68 个。


《 上一篇 无聊的 Guess,有趣的 OOP

标签:Java,变量,对象,Dog,人以群分,引用,数组,老白学
From: https://blog.csdn.net/liujun_sdn/article/details/143330525

相关文章

  • visualvm远程连接Docker容器中部署的java应用并监控
    visualvm远程连接Docker容器中部署的java应用前言jdk1.8中自带了,java11中需要单独下载下载地址visualvm下载地址简介java虚拟机监控,故障排查及性能分析工具。网络配置局域网与docker内网打通,请参考:办公网络与Docker内网网络互通服务于网络服务名称节点IPj......
  • 将学习型索引ALEX的cmake项目在虚拟机上用java运行
    一、环境配置虚拟机:Centos7gcc-v:11.2.1java-version:1.8.0 二、ALEX实现步骤   1、安装c++输入命令sudoapt-getinstallg++出错sudo:apt-get:找不到命令原因:Centos7中用yum命令下载再次输入命令sudoyuminstallg++再次报错已加载插件:fastestmirror,l......
  • Java 日期 API
    JDK8之前日期与时间戳之间的转换publicclassTest{publicstaticvoidmain(String[]args){Datedate=newDate();System.out.println("date="+date);//date=SunSep2614:48:52CST2021Datedate1=newDate(1632638970000L......
  • Java爬虫:京东商品SKU信息的“偷心盗贼”
    在这个信息爆炸的时代,数据就像是藏在深山里的宝藏,等待着我们这些“数据探险家”去发掘。今天,我们要化身为一名“偷心盗贼”,用Java这把锋利的“剑”,精准地从京东的海洋中窃取商品的SKU信息。别担心,我们这是合法的“盗窃”,因为我们只是在学习如何用代码与网页对话。环境准备:装......
  • Java爬虫精准获得JD商品SKU信息
    在数字化时代,数据的价值日益凸显,尤其是在电商领域。通过爬虫技术,我们可以从网站中提取有价值的信息,用于市场分析、价格监控等。Java作为一种成熟且功能强大的编程语言,拥有丰富的库支持,使其成为编写爬虫的理想选择。本文将详细介绍如何使用Java编写爬虫,以精准获取京东(JD)商品的详......
  • 2024年Java后端开发最全面试攻略,不管你工作几年,都得看看
    互联网公司的面试,从形式上说,一般分为2~3轮技术面+1轮HR面,不过某些公司没有HR面试。在技术面试中,面试官一般会就你所应聘的岗位进行相关知识的考察,也叫基础知识和业务逻辑面试,只要回答的不是特别差,面试官通常会继续跟你聊聊项目,这个时候就开始了项目面试。也就是说,技......
  • jsp页面和Java代码
    EL用于在jsp页面获取servlet传的值使用方式1.在头文件里开启不忽略el表达式<!--jsp头文件isELIgnored="false"这里是不忽视el语法--><%@pagecontentType="text/html;charset=UTF-8"language="java"isELIgnored="false"%>2.使用${name}方式来获取传来的值实......
  • java里面使用groovy案例+详解
    场景:最近有一个计算商品运费的,如果商品的数量大于快递公司设置的数量10那么超出部分也需要计算额外运费,那么这些计算过程代码我能不能不在java里面写呢,用一种可配置化的方式来根据不同的传参计算出运费?页面传参[{“key”:“起订量(大单位)”,“isRequired”:true,“is......
  • 20万字208道Java经典面试题总结(附答案)
    1、JDK和JRE有什么区别?JDK(JavaDevelopmentKit),Java开发工具包JRE(JavaRuntime Environment),Java运行环境JDK中包含JRE,JDK中有一个名为jre的目录,里面包含两个文件夹bin和lib,bin就是JVM,lib就是JVM工作所需要的类库。2、==和 equals 的区别是什么?对于基本类型,==比较的......
  • 2024年最全java面试题(八股文)
    1.Java基础1.1为什么Java代码可以实现一次编写、到处运行?在程序运行前,Java源代码(.java)需要经过编译器编译成字节码(.class)。在程序运行时,JVM负责将字节码翻译成特定平台下的机器码并运行,也就是说,只要在不同的平台上安装对应的JVM,就可以运行字节码文件。1.2一个Java文件里......