变量?用于“装”数据的。形象来说,变量就相当于一个容器. 变量是学习任何一门编程语言的开始。 Java是“强类型”的语言。

  • 所有的变量必须先声明、后使用。
  • 指定类型的变量,只能装对应类型的数据。

声明变量(定义变量)

类型 变量名 [ =初始值];

标识符:

标识符:就是名字。 标识符,可为变量、类、方法......各种各样的东西命名。

  • 标识符的规则: -由字母(英文、中文、日文、韩文),数字,下划线_,美元$组成,但数字不能开头. -标识符不能是java的关键字和保留字,但中间可以包含标识符,不能包含空格。

  • 关键字:Java语言中一些有特殊意义的单词。关键字所有字母都是小写。
  • 保留字:暂时还没有使用、以后可能使用;goto 、const.
  • 直接量:true、false、null. 一共有53个单词不能作为标识符。

类型:

  • 基本类型 %整型(byte、short、int、long) %浮点型(float、double) %字符型(char) %布尔类型(boolean类型)(boolean)
  • 引用类型
  • 强引用

Java中的引用,类似C语言中最难的指针。(我是C语言入门编程,指针的概念还是很深入我心。)通过引用,可以对堆中的对象进行操作。如:

StringBuffer stringBuffer = new StringBuffer("Helloword");

变量str指向StringBuffer实例所在的堆空间,通过str可以操作该对象。

强引用的特点:

强引用可以直接访问目标对象。

强引用所指向的对象在任何时候都不会被系统回收。JVM宁愿抛出OOM异常,也不会回收强引用所指向的对象。

强引用可能导致内存泄漏。

  • 软引用

软引用是除了强引用外,最强的引用类型。可以通过java.lang.ref.SoftReference使用软引用。一个持有软引用的对象,不会被JVM很快回收,JVM会根据当前堆的使用情况来判断何时回收。当堆使用率临近阈值时,才会去回收软引用的对象。因此,软引用可以用于实现对内存敏感的高速缓存。

SoftReference的特点是它的一个实例保存对一个Java对象的软引用, 该软引用的存在不妨碍垃圾收集线程对该Java对象的回收。也就是说,一旦SoftReference保存了对一个Java对象的软引用后,在垃圾线程对 这个Java对象回收前,SoftReference类所提供的get()方法返回Java对象的强引用。一旦垃圾线程回收该Java对象之后,get()方法将返回null。

下面举一个例子说明软引用的使用方法。

在你的IDE设置参数 -Xmx2m -Xms2m规定堆内存大小为2m。

@Test

public void test3(){

MyObject obj = new myObject();

SoftReference sf = new SoftReference<>(obj);

obj = null;

System.gc();

// byte[] bytes = new byte[1024*100];

// System.gc();

System.out.println("是否被回收"+sf.get());

}

运行结果:

是否被回收cn.zyzpp.MyObject@42110406

打开被注释掉的new byte[1024*100]语句,这条语句请求一块大的堆空间,使堆内存使用紧张。并显式的再调用一次GC,结果如下:

是否被回收null

说明在系统内存紧张的情况下,软引用被回收。

  • 弱引用

弱引用是一种比软引用较弱的引用类型。在系统GC时,只要发现弱引用,不管系统堆空间是否足够,都会将对象进行回收。在java中,可以用java.lang.ref.WeakReference实例来保存对一个Java对象的弱引用。

public void test3(){

MyObject obj = new MyObject();

WeakReference sf = new WeakReference(obj);

obj = null;

System.out.println("是否被回收"+sf.get());

System.gc();

System.out.println("是否被回收"+sf.get());

}

运行结果:

是否被回收cn.zyzpp.MyObject@42110406

是否被回收null

软引用,弱引用都非常适合来保存那些可有可无的缓存数据,如果这么做,当系统内存不足时,这些缓存数据会被回收,不会导致内存溢出。而当内存资源充足时,这些缓存数据又可以存在相当长的时间,从而起到加速系统的作用。

  • 虚引用

虚引用是所有类型中最弱的一个。一个持有虚引用的对象,和没有引用几乎是一样的,随时可能被垃圾回收器回收。当试图通过虚引用的get()方法取得强引用时,总是会失败。并且,虚引用必须和引用队列一起使用,它的作用在于跟踪垃圾回收过程。

当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在垃圾回收后,销毁这个对象,将这个虚引用加入引用队列。程序可以通过判断引用队列中是否已经加入了虚引用,来了解被引用的对象是否将要被垃圾回收。如果程序发现某个虚引用已经被加入到引用队列,那么就可以在所引用的对象的内存被回收之前采取必要的行动。

public void test3(){

MyObject obj = new MyObject();

ReferenceQueue referenceQueue = new ReferenceQueue<>();

PhantomReference sf = new PhantomReference<>(obj,referenceQueue);

obj = null;

System.out.println("是否被回收"+sf.get());

System.gc();

System.out.println("是否被回收"+sf.get());

}

运行结果:

是否被回收null

是否被回收null

对虚引用的get()操作,总是返回null,因为sf.get()方法的实现如下:

public T get() {

return null;

}

整型

所谓整型,只能装整数(包括正整数和负整数、0) 位(bit):要么0,要么1 字节(Byte): 1Byte=8bit

2^0=1
2^4=16 2^5=32 2^6=64 2^7=128 2^8=256 2^9=512 2^10=1024(K) 2^11=2048 2^12=4096 2^16=65536 2^20=M 2^30=G 2^40=T byte : 1字节(8位)能表示236个数、取值范围:-128~127 short :2字节(16位)能表示6536个数、取值范围:-32768~32767 int : 4字节(32位)能表示4G个数、取值范围:-2G~2G-1 long :8字节(64位)取值范围太大,无需记忆。

  • 注意点: A - 直接给出一个整数,整数默认值是int型,如果该整数数值较小、且直接赋值给byte或short、Java也可以将它当成byte、short处理。

  • public class TestInt { public static void main(String[] args){ // 类型 变量名[= 初始值]; int abc; int b=23; System.out.println("b:"+b); int it=1024; System.out.println(it); //升级 it=1025; System.out.println(it); //2的值较小(位于byte取值范围之内),因此Java可以把2当成byte处理 byte bb=2; System.out.println(bb); //127位于byte的取值范围内,Java可以把127当成byte处理 byte by=127;

      System.out.println(by);
    

    } } B - 如果直接给出一个巨大的整数,java不会自动把它当成long型处理。如果希望Java把该整数当成long处理,需要在整数后添加L或l后缀。(一般用L,因为l与1在编辑器中很难识辩)

整数的表示形式(4种)

十进制 八进制: 以0开头;逢八进一,只能出现0~7 十六进制:以0X开头或0x开头;逢16进1,只能出现0~9,a~f 二进制:以0B或0b开头。逢二进一,只能出现0~1

Fighting!!!