基础不牢,地动山摇。就好比是盖房子,地基打不好,这个房子很难盖很高。所以说Java基础很重要滴,自从学习Think in Java使我对好多知识有了新滴认识与了解,大力推荐这本书,无论是初学者还是几年开发经验滴大牛,这本书你总能找到你想要滴知识。Think in Java下载地址
(1)优先级:在Java中,一个表达式可能存在好多个操作符,那么操作符的优先级就决定了各个部分的计算,原则是:先算乘除在算加减,其中有括号先算括号里面的,该部分比较简单,不在写代码详解。
(2)赋值:赋值操作符使用的是“=”,意思就是:把右边滴值赋值给左边。但是左边必须是一个明确滴、已命名的变量,而右边可以是一个常量、变量或者表达式(只要它能生成一个值)。举个例子:int a=521;这是把521赋值给a,但是如果反过来521=a,这样是不对的。
来看一段代码,熟悉一下这部分内容:
class Snow {
int num;
}
public class SnowWitch {
public static void main(String[] args) {
Snow s1 = new Snow();
Snow s2 = new Snow();
s1.num = 521;
s2.num = 1314;
System.out.println("s1.num:" + s1.num + ",s2.num:" + s2.num);
s1 = s2;
System.out.println("s1.num:" + s1.num + ",s2.num:" + s2.num);
s2.num = 520;
System.out.println("s1.num:" + s1.num + ",s2.num:" + s2.num);
}
}
由于我是用记事本写的代码,然后用命令行进行运行滴,在此我简单介绍一下命令行运行Java代码,首先建一个记事本然后在里面编写上面代码,然后保存格式为:SnowWitch.java。然后把它放到一个目录下,(我的放在D盘根目录下),打开cmd,输入:d:(此处是进入我的D盘目录),然后输入:
javac SnowWitch.javaz这是对上面的Java进行编译,生成class文件,然后在输入:java SnowWitch回车就可以看到结果了。下面看一下结果:
是不是对第三个输出有疑问呢?下面我来解释一下:
上面这张图是对第一个输出的图像化,可以看出S1和S2分别指向不同的地址。
这张图是第二个输出的图像化,其中s1=s2,表示两个指向同一个地址,这里用黄线表示的。
这张图就是对有疑问的图像化,我们可以看出s2.num=520表示的是地址发生了改变。这样是不是就理解了吧!
(3)算术操作符:举个例子:如果将x加3,并把其结果赋值给x,写法如下:x+=3;其他写法:x-=3;x*=3;x/=3;x%=3;
Random random = new Random();
int i = random.nextInt(100);
上面这段代码是指随机产生随机数(一般模拟数据时可以用到哦~),首先我们要初始化一个Random,在创建过程如果没有传入参数,Java默认把当前时间作为随机数种子。如果我们想要生成不同类型的随机数,只需调用其方法:nextInt()、nextFloat()、nextLong()或者nextDouble()等。其中nextInt里面传入的参数为生成随机数的上限,默认下限为0。
(4)自动递增和自动递减:其实指的是:++
和--
运算。好多人都搞不清i++与++i的关系,下面我们用代码来说一下。
public class Test {
public static void main(String[] args) {
int i = 1;
System.out.println("i:i=" + i);
System.out.println("i:i=" + ++i);
System.out.println("i:i=" + i++);
System.out.println("i:i=" + i);
System.out.println("i:i=" + --i);
System.out.println("i:i=" + i--);
System.out.println("i:i=" + i);
}
}
看一下输出结果:
估计有些童鞋晕了,为什么呢?下面我来说一下i++与++i的区别,其实就是取值与计算先后而已,++i,是先计算然后在取值,所以第二个输出的是:2,而i++是先取值在计算,所以第三个输出的是:2,但是在第四个输出的就是计算后的结果:3。
(5)关系操作符:关系操作符包括:大于(>)、小于(<)、小于或等于(<=)、大于或等于(>=)、等于(==)和不等于(!=)。其中等于与不等于适合所有基本类型,而其他不适合Boolean类型。下面来说一下“==”与equals之间滴区别:
①:对于字符串String类型,那么”==”与equals还是有区别的,其中“==”比较两个变量本身滴值,即两个对象在内存滴首地址;equals比较字符串所包含滴内容是否相同。
public class TestString {
public static void main(String[] args) {
String s1 = "snow";
String s2 = "snow";
String s3 = "witch";
String s4 = new String("snow");
String s5 = new String("snow");
String s6 = new String("witch");
System.out.println(s1 == s2);//1
System.out.println(s1 == s3);//2
System.out.println(s1 == s4);//3
System.out.println(s1 == s6);//4
System.out.println(s1.equals(s2));//5
System.out.println(s1.equals(s3));//6
System.out.println(s1.equals(s4));//7
System.out.println(s1.equals(s6));//8
System.out.println(s3 == s4);//9
System.out.println(s3 == s6);//10
System.out.println(s3.equals(s4));//11
System.out.println(s3.equals(s6));//12
System.out.println(s4 == s5);//13
System.out.println(s4.equals(s5));//14
System.out.println(s4 == s6);//15
System.out.println(s4.equals(s6));//16
}
}
看一下运行结果:
首先看1~4输出:由于在常量池里只有一个对象,内容为snow,故只是有不同引用s1和s2指向这个对象,故指向滴地址是相同的,故1为true,而s1和s4是指向不同变量的对象,故地址不是相同的,故为false。在看5~8输出:6和8里面的内容均为witch与snow不相同,故为false,5与7内容相同,故为true。在看9~12输出:S3与S4分别指向不同对象,而且内容也不一致,故9与11为false。而s3与s6是分别指向不同对象,但是其内容相同,故10为false而12为true。13~16输出与9~12原理一致。
②:如果类型是基本类型,则只能用“==”而不能用equals。
基本类型如图:
看一下代码:
public class TestInt {
public static void main(String args[]) {
int a = 1;
int b = 2;
int c = 1;
System.out.println(a == b);//1
System.out.println(a == c);//2
System.out.println(a.equals(c));//3,这句是错误的。。
}
}
如果带着第三句编译,就会报错(因为我是记事本写,如果你用eclipse写,你根本就调不出equals方法滴)。
去掉该句,看一下结果:
这个代码比较简单,故不做讲解。
③:如果类型是基本类型滴包装类型:“==”是比较地址滴,而equals是比较内容滴。
基本类型滴包装类型:
看一下代码:
public class TestInteger {
public static void main(String[] args) {
Integer n1 = new Integer(20);
Integer n2 = new Integer(20);
Integer n3 = new Integer(21);
System.out.println(n1 == n2);//1
System.out.println(n1 == n3);//2
System.out.println(n1.equals(n2));//3
System.out.println(n1.equals(n3));//4
}
}
看一下结果:
通过1和2,我们可以看出是比较的地址,通过3与4可以看出,是比较里面的内容。
④:先看一个例子(该例子是Java编程思想第三章的例子)
class Value {
int i;
}
public class EqualsMethod {
public static void main(String[] args) {
Value v1 = new Value();
Value v2 = new Value();
v1.i = v2.i = 100;
System.out.println(v1.equals(v2));//(1)false
System.out.println(v1 == v2);//(2)false
}
}
你是不是很惊讶,怎么是false,why???
如果在新类中被覆盖了equals方法,就可以用来比较内容的。但是在上面的例子中类Value并没有覆盖Object中的equals方法,而是继承了该方法,因此它就是被用来比较地址的,又v1和v2的所指向的对象不相同,故标记(1)处的v1.equals(v2)运行结果为false,标记为(2)处的v1 == v2运行结果也为false。
(6)逻辑操作符:包括与(&&)、或(||)和非(!),生成一个Boolean值(true或false)。
(7)直接常量:直接常量后面的后缀字符标志了它的类型。若为大写(或小写)的L,代表long(注意喽~~使用小写容易混淆)。大写(或小写)字母F,代表float;大写(或小写)字母D,则代表double。十六进制数适用于所有整数数据类型,以前缀0x(0X),后面跟随0-9或者小写(或大写)滴a-f来表示。在使用十六进制和八进制记数法时,以二进制形式显示结果,通过使用Integer和Long类的静态方法toBinaryString(),其中比较小的类型传给Integer.toBinaryString()方法,则该类型将自动被转换为int。
(8)指数记数:在Java中看到像1.39e^-13f这样的表达式时,请转换思维,它真正的含义是1.39*10^-13。
(9)三元操作符:表达式:boolean-exp ? value0 : value1。如果boolean-exp(布尔表达式)滴结果为true,就计算value0,为false,则计算value1。
操作符就先介绍到这里,其中一些不常用滴操作符就没有介绍,不过可以自己看看这本书了解一下,这个基础总结会一直写下去,感觉不错滴小伙伴,点个赞。最后如果有不对滴地方,希望大牛们指出来。谢谢~~