Java变量是程序中最基本的存储单元,其要素包括变量名、变量类型、作用域。Java中每个变量实质都是内存中的一块区域,它们都属于特定的数据类型,使用前必须对其声明。

新手程序员总是把大量的时间用在学习编程语言上,学习语法,技术和开发工具,他们认为如果掌握了这些就是一个优秀的程序员。但是,实际的编程不仅是要精通技术和工具,关键是要对某个特定领域的问题给出解决方案,而且通常要和其他程序员一起合作完成。因此,很重要的一点就是,程序员要用代码准确的表达出自己的思想,从而让其他人明白程序的含义。

变量数据类型的分类
在Java语言中,变量根据其数据类型可分为基本类型变量和引用类型变量两种。基本类型是指值直接存于变量中,基本类型包括:char、byte、short、int、long、float、double和boolean型;引用类型变量是指该变量仅存储其引用对象实体的地址,除了变量本身占用一定内存外,其引用的对象实体也要占用一定的空间,在引用型变量中,其引用的对象实体可能有多个变量名,引用类型包括对象、接口和数组。

 

基本类型的转换
Boolean类型不可以转换为其他类型,其值只能为true或false,而不能用0或非0的整数代替false和true,其他的基本数据类型在数据运算中可以相互转换,一般遵循如下原则:

编程大师Robert C. Martin在《Clean
Code》中说道:“使用注释是为了弥补我们代码表意上的不足。”这句话就意味着如果你的代码需要添加注释,就说明你的代码还不够好。同时,这也说明如果不能在单纯的代码中展示你对问题或算法的理解是非常失败的,你只能依靠一些注释说明你的想法,而不能仅用代码显示。优秀的代码可以让人在没有注释的情况下看懂并理解,好的编程习惯也是让所有必要的信息都在代码中展示出来。

1.容量小的数据类型可自动转换为容量大的数据类型,数据类型按容量大小排序为:byte,short,char小于int小于long小于float小于double。其中byte,short,char之间不会互相转换,运算时首先转换成int类型。

 

2.容量大的向容量小的转换时要加上强制转换符,但可能会造成精度降低或溢出。

在编程理论中,有一个概念叫做“可以自我描述的源代码”,尤其是在那些有着较松的命名规则的环境下。引入这个概念,就是要增加代码的可读性,使代码更容易被维护和扩展。

3.多种数据类型混合运算时,系统首先自动将所有数据类型转换为容量最大的那一种数据类型,然后再进行计算。

 

变量的作用域
根据变量的作用域,变量可以分为局部变量和域变量。方法提内部声明的变量称为局部变量,其出了方法体便不再起作用;方法体外,类体内或接口内声明的变量称为域变量。域变量域局部变量的主要区别有以下几点:

下面我会对比一些“好的代码”和“不清晰的代码”。

1.域变量可被访问控制符public,private,static等词修饰,而局部变量则不能被static修饰;局部变量和域变量都可以被final修饰。

 

2.在内存中,域变量是对象的一部分,它随对象存在于堆中,并随着对象的创建而存在,而局部变量存在于栈中,它随着方法的调用而产生,随着方法调用结束而自动消失。

命名时要展现你意图

3.域变量如果没有赋初值,则会自动赋给以该类型的默认值;而局部变量不会自动赋值,必须显式的赋值后才能使用。

 

如何在java里使用变量

如何在代码中命名一直是一个问题,一些程序员总是用简化,短小或编码后的名字,使得只有他们自己才能看懂。看一些例子:

变量由数据类型,变量名称,变量的值组成

不好的代码:
int d; //elapsed time in days
int ds;
int dsm;
int faid;

我们要使用变量必须要先声明变量然后给它赋值。

名字中“d”可以表示任何东西,程序员只能用注释来表明他的意图,不能仅用代码显示。而“faid”很容易导致误解为ID。

例如我们声明一个整数型的变量

清晰的代码:

int elapsedTimeInDays;
int daysSinceCreation;
int daysSinceModification;
int fileAgeInDays;

int a=32;

避免会被误解的命名

那么我们给a在程序里就表示32这个数字可以直接调用。

 

public class Test{

导致误解的信息比没有信息更糟糕,有些程序员喜欢“隐藏”一些重要信息,但更糟的是,他们有时会写出一些让人误解的代码。

public static void main(String[] args){

不好的代码:
Customer[] customerList;
Table theTable;

System.out.println;

变量“customerList”其实不是个list。它只是一个普通的数组(集合)。第二行中,“theTable”是一个Table类的对象,“the”这个词是个不必要的干扰。

}

 

}

清晰的代码:
Customer[] customers;
Table customers;

上面的程序是向控制台输出32这个数字我们还可以这么写

适合的名字长度

public class Test{

 

public static void main(String[] args){

在现代的编程语言中,很长的变量名字是被允许的,你可以基本不受限制的去命名,但是这样会导致命名的混乱。

int a=32;//这里就是声明变量

不好的代码:
var  theCustomersListWithAllCustomersIncludedWithoutFiler;
var  list;

System.out.println;//这里就是直接调用

好的名字应该包含足够的单词来表达意思,但是任何不必要的词都会使名字变长,变得难以理解。名称越短越好,前提是能在上下文中表达完整的意思。

}

清晰的代码:
var allCustomers;
var customersInOrder;

}

符合“代码规范”,可以更好的帮助理解

这两个程序实现功能是一样的,那么有人会问这样不是比上面还复杂了吗?那这里我说一下,以后我们写程序可能有写东西是要重复使用的,或者需要修改的。那么变量的好处就体现出来了。

 

云顶4008 1

所有的编程语言都有自己的“风格”,叫做表示法。程序员应该写出符合这种表示法的代码,因为其他的程序员也知道这点,并按这种风格写程序。我们来看一个不符合表示法的不好的代码例子。下面的这段代码没有遵循任何代码标准(比如PascalCase,
camelCase,
Hungarian规范)。更糟糕的是,这里有一个无意义的bool型变量change,这是个描述动作的动词,但这里的bool值应该表示一种状态,所以这个变量应该用一个形容词来命名。

云顶4008,不好的代码:
const int maxcount = 1;
bool change = true;

public interface Repository;
private string Name;
public class personaddress;

void getallorders();

因为代码规范,当你只看一部分代码时,你就可以理解这里面的变量类型和含义,比如,你看到一个变量“_name”,你就可以知道这是当前类中的一个私有变量。所以,你写出的任何代码都要遵从规范。

 

清晰的代码:
const int MAXCOUNT = 1;
bool isChanged = true;

public interface IRepository;
private string _name;
public class PersonAddress;

void GetAllOrders();

一个概念不要用多种词表示,一个词也不要表示多种概念

 

定义场景中的概念很难,在软件开发过程中,程序员需要花费很多时间去分析某一场景,并命名场景中的各种元素,这样的工作永远都是让程序员头疼的事情。