-
Java中变量的存储分为五个地方
1)寄存器,这是最快的存储区,因为它位于不同于其他存储区的地方——存储器内部。但是寄存器的数量及其有限,所以寄存器根据需求进行分配。
2)堆栈。位于通用RAM(随机访问存储器)中,通过堆栈指针可以从处理器哪里获得直接支持。堆栈指针若向下移动则分配新的内存;向上移动释放那些内存。这是一种快速有效的分配存储方法,仅次于寄存器。创建程序时Java系统必须知道存储在堆栈内所有项的确切声明周期。这限制了程序的灵活性;对象的引用存放在堆栈中
3)堆。一种通用的内存池(位于RAM区),用于存放所有Java对象。堆不同于堆栈的好处是不用知道存储的数据在堆里存活多长时间,因此在堆里分配有很大的灵活性。new一个对象时,就是在堆里开辟一块内存
4)静态存储。这里的“静态”是指“在固定的位置”(尽管也在 RAM 里)。静态存储里存放程序运行时一直存在的数据。你可用关键字 Static 来标识一个对象的特定元素是静态的,但 Java 对象本身从来不会存放在静态存储空间里。
5)常量存储。常量值直接存储在程序代码内部。
6)非RAM存储。如果数据完全存活于程序之外,那么它可以不受程序的任何控制,在程序没有运行时也可以存在。其中两个例子就是流对象(字节流)和持久化对象(存放在磁盘上)
基本数据类型由于小的、简单的;直接放在堆栈中,直接存储值,更加高效。 -
构建一个Java程序
(1)若返回类型是void,return关键字的作用只是用来退出方法。
(2)static关键字,两种情形:(1)只想为某特定程序分配单一存储空间而不必考虑究竟需要创建多少对象,甚至根本就不创建对象;(2)希望某个方法不与包含它的类的任何对象关联在一起(即是类的属性);
(3)static方法的一个重要用法就是在不创建任何对象的前提下就可以调用它。
(4)java.lang包是默认导入每个Java文件的
(5)大项目注释可以学习javadoc
(6)对象的作用域:基本类型的作用域和对象的作用域要分开
Java对象不具有和基本类型一样的声明周期,当用new创建一个对象的时候,它可以存活于作用域之外,Java有垃圾回收器,用来监视用new创建的所有对象,并辨别那些不会再被引用的对象,随后释放这些对象的内存空间,以便供其他程序使用。 -
操作符
对象及其引用,赋值号
class Tank{
int level;
}
public class Assignment{
public void static void main(String[] args){
Tank t1 = new Tank();
Tank t2 = new Tank();
t1.level = 8;
t2.level = 49;
t1 = t2;
// t1.level = t2.level;
t1.level = 27;
System.out.println(t2.level);
}
}
此时输出为27,因为t1 = t2指的是就是两个引用指向同一个对象就是"别名现象";改变t1.level的值就是把两个引用的对象的值改变了,而使用t1.level = t2.level而对于这个level是基本类型,所以这就是普通的赋值,不会使两个引用指向同一个对象。
Random类的使用,算术运算
import java.util.*;
public class MathOps {
public static void main(String[] args) {
Random rand = new Random(47);
int i ,j, k;
j = rand.nextInt() + 1;
k = rand.nextInt() + 1;
i = j + k;
System.out.println(j);
System.out.println(k);
System.out.println(i);
System.out.println(j + k);
System.out.println(""+j + k);
}
}
注意转化为字符串可以直接加上"",即空的字符串对象
对象的等价性
public class Equivalance{
public static void main(String[] args) {
Integer n1 = new Integer(47);
Integer n2 = new Integer(47);
System.out.println(n1==n2);
System.out.println(n1.equals(n2));
}
}
对于某一对象,==的意思是比较对象的引用,equals的意思才是比较对象的内容(对于自己定义的类要覆盖equals方法才能事项正确的equals)
关于equals
继承Object中的equals方法只能判断两个引用变量是否是同一个对象
若想比较两个对象的内容那么一定要重写
重写equals方法的要求:
1、自反性:对于任何非空引用x,x.equals(x)应该返回true。
2、对称性:对于任何引用x和y,如果x.equals(y)返回true,那么y.equals(x)也应该返回true。
3、传递性:对于任何引用x、y和z,如果x.equals(y)返回true,y.equals(z)返回true,那么x.equals(z)也应该返回true。
4、一致性:如果x和y引用的对象没有发生变化,那么反复调用x.equals(y)应该返回同样的结果。
5、非空性:对于任意非空引用x,x.equals(null)应该返回false。
package Primary;
class Dog {
String name;
String says;
// @Override
// public boolean equals(Object obj) {
// if (obj instanceof Dog) {
// Dog dog = (Dog) obj;
// return name.equals(dog.name) && says.equals(dog.says);
// }
// return false;
// }
}
public class Equivalance {
public static void main(String[] args) {
Dog spot = new Dog();
Dog newDog = new Dog();
spot.name = "spot";
spot.says = "Ruff!";
newDog.name = "spot";
newDog.says = "Ruff!";
System.out.println(spot == newDog);
System.out.println(spot.equals(newDog));
}
}
此时为
若把注释的那段代码加上
则是
按位操作符
按位操作符用来操作整数基本数据类型中的单个比特(bit),即二进制位。按位操作会对两个参数对应位执行布尔运算最终生成一个结果
按位"与":&
按位"或": |
按位"异或":^(两位不同时才为1)
按位"非":~
移位操作:<<(左移,将操作符左边的操作符向左移动,低位补0)
>>(有符号右移,将操作符右侧指定位数向右移动,使用符号扩展,若符号为正则高位插入0,若符号为负则高位插入1)
>>>(无符号右移,将操作符右侧指定位数向右移动,无论符号为正还是为负高位都插入0)
若想显示某个整数的二进制表示可以使用Integer.toBinaryString(i);
public class URshift {
public static void main(String[] args) {
// int i = -1;
// System.out.println(i+" "+Integer.toBinaryString(i));
// int j = i >>> 1;
// System.out.println(j+" "+Integer.toBinaryString(j));
// int k = i >> 1;
// System.out.println(k+" "+Integer.toBinaryString(k));
// int m = i << 1;
// System.out.println(m+" "+Integer.toBinaryString(m));
int i = 1;
System.out.println(i+" "+Integer.toBinaryString(i));
int j = i >>> 1;
System.out.println(j+" "+Integer.toBinaryString(j));
int k = i >> 1;
System.out.println(k+" "+Integer.toBinaryString(k));
int m = i << 1;
System.out.println(m+" "+Integer.toBinaryString(m));
}
}
i为-1时输出为
i为1时输出为
值得注意的是,对于char,short或byte类型的变量,在执行算术运算时会进行类型提升为int再计算
- 控制执行流程
foreach
更加简洁的for语法用于数组和容器
for(char c: "An African Swallow".toCharArray)
break和continue
break是退出整个循环,continue只是把本次循环直接退出,不执行continue之后的语句;
学会判断标签‘
switch
switch实现多路选择,选择因子必须是int或char那样的整数值,并且注意要break