当前位置: 首页 > 编程笔记 >

java中变量和常量详解

桑鸿志
2023-03-14
本文向大家介绍java中变量和常量详解,包括了java中变量和常量详解的使用技巧和注意事项,需要的朋友参考一下

变量和常量

在程序中存在大量的数据来代表程序的状态,其中有些数据在程序的运行过程中值会发生改变,有些数据在程序运行过程中值不能发生改变,这些数据在程序中分别被叫做变量和常量。

在实际的程序中,可以根据数据在程序运行中是否发生改变,来选择应该是使用变量代表还是常量代表。

变量

变量代表程序的状态。程序通过改变变量的值来改变整个程序的状态,或者说得更大一些,也就是实现程序的功能逻辑。

为了方便的引用变量的值,在程序中需要为变量设定一个名称,这就是变量名。例如在2D游戏程序中,需要代表人物的位置,则需要2个变量,一个是x坐标,一个是y坐标,在程序运行过程中,这两个变量的值会发生改变。

由于Java语言是一种强类型的语言,所以变量在使用以前必须首先声明,在程序中声明变量的语法格式如下:

数据类型变量名称;

例如:intx;

在该语法格式中,数据类型可以是Java语言中任意的类型,包括前面介绍到的基本数据类型以及后续将要介绍的复合数据类型。变量名称是该变量的标识符,需要符合标识符的命名规则,在实际使用中,该名称一般和变量的用途对应,这样便于程序的阅读。数据类型和变量名称之间使用空格进行间隔,空格的个数不限,但是至少需要1个。语句使用“;”作为结束。

也可以在声明变量的同时,设定该变量的值,语法格式如下:

数据类型变量名称=值;

例如:intx=10;

在该语法格式中,前面的语法和上面介绍的内容一致,后续的“=”代表赋值,其中的“值”代表具体的数据,注意区别“==”代表为判断是否相等。在该语法格式中,要求值的类型需要和声明变量的数据类型一致。

在程序中,变量的值代表程序的状态,在程序中可以通过变量名称来引用变量中存储的值,也可以为变量重新赋值。例如:

intn=5;

n=10;

在实际开发过程中,需要声明什么类型的变量,需要声明多少个变量,需要为变量赋什么数值,都根据程序逻辑决定,这里列举的只是表达的格式而已。

常量

常量代表程序运行过程中不能改变的值。

常量在程序运行过程中主要有2个作用:

1.代表常数,便于程序的修改(例如:圆周率的值)

2.增强程序的可读性(例如:常量UP、DOWN、LEFT和RIGHT分辨代表上下左右,其数值分别是1、2、3和4)

常量的语法格式和变量类型,只需要在变量的语法格式前面添加关键字final即可。在Java编码规范中,要求常量名必须大写。

则常量的语法格式如下:

final数据类型常量名称=值;

final数据类型常量名称1=值1,常量名称2=值2,……常量名称n=值n;

例如:

finaldoublePI=3.14;

finalcharMALE=‘M',FEMALE=‘F';

在Java语法中,常量也可以首先声明,然后再进行赋值,但是只能赋值一次,示例代码如下:

finalintUP;

UP=1;

关于final详解

final用于声明属性(常量),方法和类,分别表示属性一旦被分配内存空间就必须初始化(不会有默认初始化,局部变量也是如此,默认初始化只有普通的非final成员属性,对于static(无final修饰)类变量,类连接时候有默认初始化,对于像privateinta;在类实例化时,构造函数默认初始为0,总之,变量必须初始化后方可用,这是java的安全之一。final这个关键字的含义是“这是无法改变的”或者“终态的”;

那么为什么要阻止改变呢?

java语言的发明者可能由于两个目的而阻止改变:

1).效率问题:

jdk中的某些类的某些方法,是不允许被用户覆盖的,设计者可能认为,所用方法已经是最好的方法,用户私自覆盖,或是由于疏忽而覆盖,就会影响JVM或是系统的系能;

2).设计所需:

众所周知,有些情况必须使用final关键字,比如方法中的匿名内部类的参数传递

【修饰变量】:

final成员变量表示常量,只能被赋值一次,赋值后值不再改变。

【修饰方法】:

final方法不能被子类方法覆盖,但可以被继承。

【修饰类】:

final类不能被继承,没有子类,final类中所有方法都是final的。(如String类)

1.被final修饰而没有被static修饰的类的属性变量只能在两种情况下初始化:(必须初始化)

a.在它被声明的时候赋值

b.在构造函数里初始化

解释:当这个属性被修饰为final,而非static的时候,它属于类的实例对象的资源(实例常量),当类被加载进内存的时候这个属性并没有给其分配内存空间,而只是定义了一个变量a,只有当类被实例化的时候这个属性才被分配内存空间,而实例化的时候同时执行了构造函数,所以属性被初始化了,也就符合了当它被分配内存空间的时候就需要初始化,以后不再改变的条件.

2.被static修饰而没有被final修饰的类的属性变量只能在两种情况下初始化:(可以不初始化)

a.在它被声明的时候赋值

b.在静态或非静态快里初始化

解释:

当类的属性被同时被修饰为static时候,他属于类的资源(类变量),在类加载后,进行连接时候,分三步:先验证;然后准备,准备时,先分配内存,接着默认初始化;可以进行解析。最后,进行类初始化,类初始化前,必须保证它的父类已经初始化了,所以最先初始化的是超类,对于接口,不必初始其父接口。类初始化时,它把类变量初始化语句及静态初始化语句放到类初始化方法中,所以,如果无此两种语句,也就没<clinit>类初始化方法,而构造函数是在当类被实例化的时候才会执行,所以用构造函数,这时候这个属性没有被初始化.程序就会报错.而static块是类被加载的时候执行,且只执行这一次,所以在static块中可以被初始化.

3.同时被final和static修饰的类的属性变量只能在两种情况下初始化:(必须初始化)

a.在它被定义的时候

b.在类的静态块里初始化

c.特别对于初始化时候调用抛出异常的构造函数,初始时候注意,特别是在实现单例模式时(只能这么初始化)

如:

class A
{
	private final static A a;
	static
	{
		try
		{
			a=new A();
		}
		catch(Exception e)
		{
			throws new RuntimeException(e);
			//必须有,不然不能完成常量的正确初始化
		}
	}
	private A() throws Exception{
	}
}

解释:

当类的属性被同时被修饰为static和final的时候,他属于类的资源(类常量),那么就是类在被加载进内存的时候(也就是应用程序启动的时候)就要已经为此属性分配了内存,所以此时属性已经存在,它又被final修饰,所以必须在属性定义了以后就给其初始化值.而构造函数是在当类被实例化的时候才会执行,所以用构造函数,这时候这个属性没有被初始化.程序就会报错.而static块是类被加载的时候执行,且只执行这一次,所以在static块中可以被初始化.

java中的final变量==常量

【final变量的变与不变】:final表示变量的值或引用不变

有人说final变量在赋值后就不可变,此变量可以是基本数据类型+String或者是对象

那么这个不变到底指的是什么呢?

这个不变指的是引用,是地址,而所引用的对象的内容仍然是可变的。注:如果为对象,注意此时类初始化条件

就是说,这个final变量永远指向某个对象,是一个常量指针,而不是指向常量的指针。

【final关键字的具体应用】:

【final+变量】:

在实际应用中,这种形式是非常少见的。

比如logger是可以的,但是貌似并不是非常实用,或许用户仍然希望通过setter来改变logger变量。

【static+final+变量】:

常量。经常使用。

【final+方法】:

JDK中常用,但是自己并未常用。

【final+类】:

helper类经常使用。

【final用于匿名内部类的参数传递】:

多线程测试时,经常使用。

【final用于方法的参数】:

并不常用。

延伸:

在interface里面的变量都是publicstaticfinal的。所以你可以这样写:

publicstaticfinalinti=10;

或则

inti=10;(可以省略掉一部分)

注意在声明的时候要给变量赋予初值

解释:

首先你要弄清接口的含义.接口就是提供一种统一的'协议',而接口中的属性也属于'协议'中的成员.它们是公共的,静态的,最终的常量.相当于全局常量.

抽象类是不'完全'的类,相当于是接口和具体类的一个中间层.即满足接口的抽象,也满足具体的实现.

如果接口可以定义变量,但是接口中的方法又都是抽象的,在接口中无法通过行为来修改属性。有的人会说了,没有关系,可以通过实现接口的对象的行为来修改接口中的属性。这当然没有问题,但是考虑这样的情况。如果接口A中有一个public访问权限的静态变量a。按照java的语义,我们可以不通过实现接口的对象来访问变量a,通过A.a=xxx;就可以改变接口中的变量a的值了。正如抽象类中是可以这样做的,那么实现接口A的所有对象也都会自动拥有这一改变后的a的值了,也就是说一个地方改变了a,所有这些对象中a的值也都跟着变了。如果可以修改值:这和抽象类有什么区别呢,怎么体现接口更高的抽象级别呢,怎么体现接口提供的统一的协议呢,那还要接口这种抽象来做什么呢?所以接口中不能出现变量,如果有变量,就和接口提供的统一的抽象这种思想是抵触的。所以接口中的属性必然是常量,只能读不能改,这样才能为实现接口的对象提供一个统一的属性。

通俗的讲,你认为是要变化的东西,就放在你自己的实现中,不能放在接口中去,接口只是对一类事物的属性和行为更高层次的抽象。对修改关闭,对扩展(不同的实现implements)开放,接口是对开闭原则的一种体现。

总结

以上就是本文关于Java中变量和常量详解的全部内容,希望对打击有所帮助。感兴趣的朋友可以继续参阅本站:Java并发编程Semaphore计数信号量详解、详解java中的互斥锁信号量和多线程等待机制、浅谈java中的局部变量和全局变量等,欢迎大家提出宝贵意见,小编一定及时回复。感谢朋友们对本站的支持!

 类似资料:
  • 本文向大家介绍php的常量和变量实例详解,包括了php的常量和变量实例详解的使用技巧和注意事项,需要的朋友参考一下 php的常量和变量实例详解 【PHP在命令行下接收参数】 如果在命令行调试php,传入的参数通过$argv获取,注意其中包含了文件名这一个元素,数组中元素的个数通过$argc获取。 【可变变量】 指的是变量的名称可变,变量的标识符可以由另一个变量的值来代替。 例如:第二个语句是为ar

  • 变量数据类型的作用 程序员写代码时识别用:知道变量中应该存放什么类型的数值 给编译器看的:说明数值在存储时需要的内存空间字节数;说明存储结构 普通变量数据类型转换的本质 将数据的空间大小和数据的存储结构转变后,存入另一个变量空间 数据类型转换会导致数据存储空间大小和存储结构的变化 变量的本质 变量三要素:名称、大小、作用域 既能读又能写的内存对象,称为变量;若一旦初始化后不能修改的对象则称为常量。

  • 问题内容: Java语言文档说: 如果将原始类型或字符串定义为常量,并且在编译时知道该值,则编译器会使用其值替换代码中各处的常量名称。这称为编译时常量。 我的理解是,如果我们有一段代码: 然后,编译器会将x代码中每次出现的内容替换为literal 10。 但假设常量在运行时初始化: 与编译时常量相比,性能是否会下降(无论可以忽略不计)? 另一个问题是下面的代码行: 被编译器以与编译时常量相同的方式

  • 问题内容: 我是tensorflow的新手,我无法理解变量和常量的区别,我知道我们将变量用于方程式,将常量用于直接值,但是为什么代码#1仅工作,为什么代码#2和# 3,请说明在哪种情况下我们必须先运行图形(a),然后运行变量(b),即 在这种情况下,我可以直接执行此命令,即 代码1: 代码2: 代码3: 问题答案: 在TensorFlow中,常量和变量之间的区别在于,当您声明某个常量时,其值以后将

  • 本文向大家介绍Swift中常量和变量的区别与声明详解,包括了Swift中常量和变量的区别与声明详解的使用技巧和注意事项,需要的朋友参考一下 Swift是弱类型语言吗? 答案是否定的,Swift 是强类型语言,下面上一个栗子 上面代码中报错了,报的是不能指定 Int 类型为 String 类型。 这里要注意一下在 Swift 中的整形是I,而字符类型首字母是S,都是大写字母 在 Swift 中我们可

  • 变量是计算机内存中已命名的存储位置,其中包含了数字或字符串等数据。变量包含的信息被称为变量的值。变量使用用户便于理解脚本操作的名称为用户提供了一种存储、检索和操作数据的途径。 声明和命名变量 命名和声明变量应遵循脚本语言的规则及指导。即使在使用变量前不需要去声明变量,也应养成在编程时声明变量的良好习惯,因为这样有助于防止错误发生。声明一个变量意味着告诉脚本引擎,有一个特定名称的变量,这样就可以在脚