八、Java从头开始-变量的声明

变量的声明

 

变量的声明其实并不陌生,在之前的章节里就大量使用,比如上篇通讯薄类中,定义了姓名、电话、地址三个变量,这些变量都属于primitive主数据类型,而还有一种实例变量也叫引用

《人兽杂交》这部电影相信大多数的人都看过,讲的是两名反叛科学家将人类和动物的DNA进行杂交,创造出一个生物“Dren”,它迅速长大,但这个技术还不完全成熟,杂交基因的Dren因故发生了突变,变得暴躁,有攻击性,最终被消灭,导致了悲剧性的结局。

Java的角度来看,两名科学家强行将人类型变量放入动物类型变量,结果只会和电影结局一样悲剧。Human ms = new Animal();谢天谢地,这样的代码过不了编译器这关,编译器会指出大部分的问题。

为了保证我所用变量能够正确按照我的意图发挥作用,我必须声明每个变量的类型,指定它是int,或者是double类型,又或者是引用创建好的对象。这里,变量可以分为两种:primitive主数据类型对象引用,primitive主数据类型用来保存基本类型的值,包括整数、浮点数、布尔等,而对象引用保存的是对象的引用。

记住声明变量的规则:变量必须拥有类型;另一条规则是必须要有名称。

一、         primitive主数据类型

在《我的九九乘法表》这篇里,已经介绍过该怎么去定义基本类型的变量,这里不再重复说明,但在定义这些不同类型的变量时应该注意一些细节,比如确保别出现“溢位”的现象,还有避开那些关键字。

primitive主数据类型就好比星巴克的咖啡杯,有不同的大小,而每种大小都有个名称,像是“小杯”、“中杯”、“大杯”、“超大杯”,每个杯子能容纳的咖啡是固定的。

 

1、小心溢出来

一个咖啡杯无法装下一整壶的咖啡。如果非要把一壶咖啡倒入一个咖啡杯,很明显会损失一部分咖啡,在Java里这种现象叫溢位。比如:

 

int a = 33;
byte b = a;  //不能通过编译

也许有人会问8byte类型明明可以装得下33,但是为什么不能通过编译呢?是的,明明可以容得下33,你知我知,谁都知道,但是偏偏编译器它不知道,它只知道你把一个大容器放进了一个小容器,会有溢位的风险,虽然我们肉眼观察是可行的,但别指望编译器也会肉眼观察。所以编译器不容许将大类型容器放到小类型容器,但是反之是可以的。

2、避开Java的保留字

现在我已经掌握声明变量的规则一:变量必须拥有类型,现在来看看第二个规则:变量必须要有名称。在给变量取名时,需要注意一下几点要求:

Ø  名称必须以字母、下划线(_)$符号开头,不能以数字开头;

Ø  除了第一个字符外,后面就可以用数字。反正不要用在第一个字符就行;

Ø  符合上述两条规则,你就可以随意命名,但还得要避开Java的保留字

 

二、         对象的引用

我们通常在Java讨论会上会听到:“我创建了一个叫u1User对象、我把一个String传入了某个方法中、这方法返回一个Pet对象、我把创建好的Father对象放进了myFather这个变量中”等等。其实这些都是对对象引用的误解,认为它和primitive主数据类型的变量声明一样,将对象装进变量中。

事实上并没有一个超巨型的杯子可以放大到能够装载所有对象,对象只会存在在可垃圾回收的堆上。所以,并没有对象变量这种东西,只有引用到对象的变量,它并不是存储对象的容器,而是类似指向对象的指针。还是很抽象?先看看下面这个例子:


理解了主数据类型变量和引用变量之间的区别,来看看怎样利用引用变量来存取对象里的变量和方法:

1、  首先声明一个引用变量myFather然后指向创建好的Father对象

Father myFather = new Father();

2、  使用圆点符号来操作对象的状态和行为

myFather.age = 33;                     //存取age变量为33

myFather.makeMoney();           //让他去赚钱吧

 

 

垃圾收集

前面提到了对象只会存在在可垃圾回收的堆上,那么这里垃圾回收又是怎么一回事,为什么需要回收,什么样的对象才会被看作是垃圾。先来看看下面两个引用对象:



 
  

把变量b赋值给变量a,两者这时都

具有相同的值。

对象1被抛弃,不再被任何变量所引

用,这时Java虚拟机就把它标记为可

垃圾回收的。

 

当某个对象不再需要时,在C++中,使用对象结束后必须明确删除该对象,否则,在关闭程序之前该对象将不会释放所占用的内存,但Java的设计者对这个问题很重视,他认为内存释放这一繁琐的操作不应由程序员来负责,因此设计了一种新的编程范例,这就是垃圾回收机制。Java会自动帮我们回收没有使用的对象来释放占用的内存。

 

本页内容版权归属为原作者,如有侵犯您的权益,请通知我们删除。

监听器总结 - 2016-04-21 17:04:53

    我们从刚开始学java不久就接触到了监听器,但是但是我只是觉得监听器很神奇,但并未深究,不久前我看了看支持监听器的JButton的源码,Jbutton的父类是一个叫抽象按钮的东西,抽象按钮里面存在一个叫做监听器列表的东西,每调用一次addListener都会向监听器列表中添加一个Listener,Listener使用接口加以约束,比如说mouseListener就会有mouseClicked、mousePressed之类的方法提前写在接口中,等待用户进行进一步的编辑。当这个事件发生时,比如说mous

JAVA IO 序列化与设计模式 - 2016-04-21 17:04:53

原文出自【听云技术博客】 : http://blog.tingyun.com/web/article/detail/460   序列化 什么是序列化 序列化:保存对象的状态 反序列化:读取保存对象的状态 序列化和序列化是Java提供的一种保存恢复对象状态的机制   序列化有什么用 将数据保存到文件或数据库中时 将数据通过套接字在网络上传输时 通过 RPC RMI等传输对象时   如何序列化 实现Serializable接口 实现Externalizable接口 serialVersionUID的作用ser

maven核心,pom.xml详解 - 2016-04-21 17:04:15

转自:  http://blog.csdn.net/zhuxinhua/article/details/5788546   什么是pom?     pom作为项目对象模型。通过xml表示maven项目,使用pom.xml来实现。主要描述了项目:包括配置文件;开发者需要遵循的规则,缺陷管理系统,组织和licenses,项目的url,项目的依赖性,以及其他所有的项目相关因素。     快速察看: project   modelVersion4.0.0/modelVersion !--maven2.0必须是这样

java生成二维码 - 2016-04-21 17:04:10

  最常见的就是QRcode二维码 一、Zxing 1.推荐使用Zxing Google出的,大厂商,文档齐全。也可生成条形码,Android上一般也采用Zxing。 2.可生产、读取二维码,可嵌入图片(logo), 支持中文 3.编写代码量很少,就可生产二维码 4.生成的二维码的位点少,好识别 5.生成的二维码,占用存储空间小,2K 所需jar包:core-2.2.jar,jdk 1.6。自2.2以后需要jdk1.7,否则会报错  Exception in thread "main" java.lang
我的九九乘法表(二) 知识点 3 :条件选择语句的使用 如方法一中使用条件选择语句块来判断变量 i 和 j 是否相等,如果相等就进入下面的赋值换行语句: if( i == j ){ i = 0; j++; System.out.println();} 这是一个简单的 if 判断语句,如果其判断条件是假又执行什么程序等许多嵌套条件判断语句,如下面这个例子: public static void main(String[] args) {//定义一个int类型性别变量sex,0为女士,1为男士int sex

Java如何调用Linux命令 - 2016-04-20 17:04:57

(方式一)适合Java调用本地的Liunx无须任何依赖包 /*** * 第一种方法,仅仅执行命令无须关注返回结果 * @throws Exception */ public static void exeCmd() throws Exception{ Runtime r = Runtime.getRuntime(); //执行linux命令,不关心返回结果,此处,可以执行一个shell脚本,或者python脚本 Process p = r.exec("tesseract 12.jpg ko "); p.w
1、实现功能界面    2、相关数据库表单      3、ibatis_team_players.xml   ?xml version="1.0" encoding="UTF-8"?!DOCTYPE sqlMap PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-2.dtd"sqlMapselect id="selectTeamPlayers" resultClass="java.util.H

Zxing方式生产二维码方法 - 2016-04-20 17:04:44

ackage com.wmsDemo.QRCode;   import com.google.zxing.common.BitMatrix;         import javax.imageio.ImageIO;    import java.io.File;    import java.io.OutputStream;    import java.io.IOException;    import java.awt.image.BufferedImage;              public

java实现List对象排序 - 2016-04-20 17:04:17

请问各位大神怎么给一个ListBean中指定属性排序? 比如: class BeanA中有属性A,属性B,属性C,属性D.排序要求,先按属性A升序,再按属性C升序;请问怎么实现?

常用编程动词 - 2016-04-20 17:04:22

add/remove increment/decrement open/closebegin/end insert/delete show/hidecreate/destory lock/unlock source/targetfirst/last min/max star/stopget/put next/previous up/down get/set old/new