1、工欲善其事,必先利其器(环境变量)
安装JDK后,java和javac的命令是在jdk的bin目录下才能执行,为了在系统任意文件夹里随心所欲使用java的命令,和加载java类所在的目录,故要配置JAVA环境变量PATH、CLASSPATH和JAVAHOME
PATH %JAVA_HOME%/bin/;%JAVA_HOME%/jre/bin |
CLASSPATH .;%JAVA_HOME%\lib\tools.jar;%JAVA_HOME%\lib\dt.jar |
JAVAHOME D:\Program Files\Java\jdk1.8.0_251 //根据你实现的jdk安装目录 |
path环境变量: 记录的是可执行性文件,如.exe文件,对可执行文件先在当前路径去找,如果没找到就去path环境变量中配置的路径去找。保证java和javac命令可以在任意目录下执行。 | classpath环境变量: 记录的是java类的运行文件所在的目录,先在当前目录加载主类,没找到就到classpath环境变量中配置的路径去找。保证class文件可以在任意目录下运行。 |
配置好java的环境变量后,在任意目录创建一个HelloWorld.java,输入以下内容,打开cmd,cd进入进入HelloWorld.java文件的目录。在cmd命令行打javac HelloWorld.java会生成一个HelloWorld.class文件,再java HelloWorld后,命令行会输入Helloworld。这样就完成第一个java程序了。java文件一般文件名和类名是相同的。
public class HelloWorld{
public static void main(String[] args) {
System.out.println("HelloWorld!!!");
}
} //熟记这个程序写法
2、关键字的概述和使用
关键字:
又称为保留字,由java语言事先定义好的,有特殊意义的。如在java中表示特定语法的for、switch、if,还有表示int、float等数据类型的声明字,这些都是java的关键字。
关键字的特点: |
1、完全小写的字母。 2、在特殊的编辑工具中有特殊颜色显示。 3、不能用作变量名、方法名、类名、包名和参数 |
3、标识符的概述和使用
标识符:在java中主要是给类、对象、方法、变量和常量命名的。
标识符命名规则: |
1、由26字母(区分大小写)、数字、_(下划线)和$(美元符号)组成。 2、不能以数字开头,也不能以关键字命名。 |
常用的标识符例子: |
A:包 全部小写 单级包:小写 举例:test,com 多级包:小写,并用.隔开 举例:cn.itcast,com.baidu B:类或者接口 一个单词:首字母大写 举例:Student,Demo 多个单词:每个单词首字母大写 举例:HelloWorld,StudentName C:方法或者变量 一个单词:首字母小写 举例:name,main 多个单词:从第二个单词开始,每个单词首字母大写 举例:studentAge,showAllNames() D:常量 全部大写 一个单词:大写 举例:PI 多个单词:大写,并用_隔开 举例:STUDENT_MAX_AGE |
4、java数据类型
Java语言是强类型语言,对于每一种数据都定义了明确的具体数据类型,在内存总分配了不同大小的内存空间。比如定义一个变量int a="abc"会报错,不像python语言定义变量时不需声明类型,即a = "123"或a=int("123")。(这里先讲下java的基本类型)
数字类型的表数范围:
数字类型 | 占用存储空间 | 表数范围 |
byte | 1byte | -128 ~ 127 |
short | 2byte | -2^15 ~ 2^15 -1 |
int | 4byte | -2^31 ~ 2^31 -1 |
long | 8byte | -2^63 ~ 2^63 -1 |
float | 4byte | -3.403E38 ~ 3.403E38 |
double | 8byte | -1.798E308 ~ 1.798E308 |
注意: long: 8个字节
因为整数默认是int类型,浮点数默认是double。在定义Long或者Float类型变量的时候,要加L或者f。 |
基本类型的默认值:
public class Test { static boolean bool; static byte by; static char ch; static double d; static float f; static int i; static long l; static short sh; static String str; public static void main(String[] args) { System.out.println("Bool :" + bool); //false System.out.println("Byte :" + by); //0 System.out.println("Character:" + ch); //空 System.out.println("Double :" + d); //0.0 System.out.println("Float :" + f); //0.0 System.out.println("Integer :" + i); //0 System.out.println("Long :" + l); //0 System.out.println("Short :" + sh); //0 System.out.println("String :" + str); //null } } |
( 注意 : 整形默认是int类型,浮点数默认是double类型,长整形最好用L标记,如long a = 1000000000000L )
关于float a =12.345会报错? 因为浮点数默认是double类型,12.345范围小于double的表数范围,正确的写法是float a = 12.345F 或float a = (float)12.345,又或者直接赋值double类型double ab = 12.345 。 但是float a = 12.345F 和float a = (float)12.345是有区别的。前者是直接赋值float类型,而后者是强制double类型转换为float类型(有时会存在损失精度问题)。 |
基本数据类型的转换:
1、boolean类型不能转换为其他的数据类型 2、默认转换 (1) byte,short,char—int—long—float—double (2) byte,short,char相互之间补转换,他们参与运算首先转换为int类型。 (两个byte相加,或一个byte和一个int相加也是自动转换为int类型) 3、强制转换 目标类型 变量名=(目标类型)(被转换的数据); 如int a = 3,b=4; byte c = (byte)(a+b),但注意有时强制转换会损失精度的问题(这里的转换损失精度了)。
4、思考题:下面的结果是? char b = 'b';
//答案如下 b 99 98 |
变量相加和常量相加的区别? byte b1=3,b2=4,b; 请问b=b1+b2;b=3+4; 哪句会编译失败?还有byte a=130;byte b=300;会 不会报错? 答:(1)由于两变量相加,b1和b2会先转换为int类型,byte类型的b=b1+b2相加转换后的int类型会编译报错,故b=b1+b2会编译报错。 (2)常量值相加时,会先运算看和的值在不在赋值的值的表数范围内,在就不报错,不在就报错。故b=3+4不报错,byte a=130和byte b=300报错。
强制转换数据溢出后的结果怎么算? byte b = 130;有没有问题?如果我想让赋值正确,可以怎么做?结果是多少呢? |
5、补码
计算机中的运算都是通过补码进行的,但是补码是通过原码和反码转换而来的。下面进行有符号的数据表示法来表示+7和-7:
原码:正数的原码最高位为0,负数的原码最高位为1,其他的是数值位。 符号位 数值位 +7 0 0000111 -7 1 0000111 | 反码:正数的反码与原码相同,负数的反码与原码符号位相同,数值位取反(即1变0,0变1)。 符号位 数值位 +7 0 0000111 -7 1 1111000 | 补码:正数的原码的补码与原码相同,负数的补码是反码加1的数。 符号位 数值位 +7 0 0000111 -7 1 1111001 |
由于byte类型的表数范围是-128 ~ 127,由刚才byte b = (byte)130的例子,得出
(1):获取130这个数据的二进制。
00000000 00000000 00000000 10000010
这是130的原码,也是反码,还是补码。
(2):做截取操作,截成byte类型的了。 //1byte等于8bit
10000010
这个结果是补码。
(3):已知补码求原码。
符号位 数值位
补码: 1 0000010
反码: 1 0000001
原码: 1 1111110
所以常见的0到255数的强制转换为byte的数值如下: |
数字 补码 byte型 255 11111111 -1 254 11111110 -2 129 10000001 -127 128 10000000 -128 //-128只有补码,无原码,无反码。 127 01111111 127 100 01100100 100 1 00000000 1 0 00000000 0 //注意:正数的原、反、补码都相同 |
6、常量、成员变量和局部变量
常量:可以理解为数值不能改变的量,常量通常以大写字母命名。在java中通过final关键字修改的赋值声明为常量,而且final修饰的常量必须赋值且赋值后不能再修改。如下表
public class Test { //静态常量 public static final double PI = 3.14; //声明成员常量 final int Y = 10; public static void main(String[] args) { //声明局部常量 final double X = 3.3; } } |
变量:分成员变量和局部变量。他们区别如下
成员变量 | 局部变量 |
1、成员变量可不赋值,会有默认值。 2、在类中方法外无static修饰的为实例成员变量。 3、在类中方法外用static修饰的为类成员变量。 4、实例成员变量在堆中是随着对象的创建,同时对应分配多块堆空间存储数据,每个对象使用自身的实例成员变量空间;而类成员变量是随着类的加载而加载到方法区,只分配一块空间存储数据共享给所有对象使用。 //堆和方法区都能被所有线程共享,方法区包含所有的class和static变量 | 1、局部变量必须显示赋值才能使用。 2、存在于方法体的形参。 3、定义在方法内的变量。 4、定义在代码块内的变量。 5、局部变量随方法的调用而存储在栈中,随方法调用完毕后自动销毁。 6、调用方法形参时,基本类型的局部变量是直接把数值存储在栈中,修改值对实际参数无影响,引用类型的局部变量是将堆中引用的地址存储在方法的栈内存中,修改值会改变实际参数。 |
(注意:在方法调用时,同名的变量采用就近原则,局部变量优先级>成员变量)
7、运算符
运算符就是对常量和变量进行操作的符号,分为算术运算符,三目运算符,赋值运算符,比较运算符,逻辑运算符,位运算符。
7.1、算术运算符:包括单、双、三目算术运算符。
双目算术运算符: +加, -减,*乘,/除,%取余 |
public class Test { public static void main(String[] args) { } |
单目算术运算符:++自增1, --自减1 |
public class test { public static void main(String[] args) { int x = 4; } //a++或++a时,最后的a值都自增1, //但注意区别int c =a++是先把a的赋给c后,a再自增量1;而int c=++a是a先自增量1再赋值给c。(记忆口诀:单目运算时,等号右边是变量时直接赋值,后才自增自减。) 设x=1,y=2,z=3,则表达式y+=z--/++x的值是多少? 答案是3。 |
三元算术运算符:比较表达式?表达式1:表达式2; |
/* 练习: 获取两个整数中的最大值 获取三个整数中的最大值 比较两个整数是否相同 */ class OperatorTest { public static void main(String[] args) { //获取两个整数中的最大值 int x = 100; int y = 200; int max = (x > y? x: y); System.out.println("max:"+max); System.out.println("--------"); //获取三个整数中的最大值 int a = 10; int b = 30; int c = 20; //分两步: //A:先比较a,b的最大值 //B:拿a,b的最大值在和c进行比较 int temp = ((a > b)? a: b); //System.out.println(temp); int max1 = (temp > c? temp: c); System.out.println("max1:"+max1); //一步搞定 //int max2 = (a > b)?((a > c)? a: c):((b > c)? b: c); //这种做法不推荐。但要注意三目运算符号顺序是从右向左运算的 //int max2 = a > b?a > c? a: c:b > c? b: c; //System.out.println("max2:"+max2); System.out.println("--------"); //比较两个整数是否相同 int m = 100; int n = 200; //boolean flag = (m == n)? true: false; boolean flag = (m == n); System.out.println(flag); } } |
7.2、赋值运算符
/* //定义一个变量 |
7.3、比较运算符
/* 比较运算符: ==,!=,>,>=,<,<= 特点: 无论你的操作是简单还是复杂,结果是boolean类型。 注意事项: "=="不能写成"="。 */ class OperatorDemo { public static void main(String[] args) { int x = 3; int y = 4; int z = 3; System.out.println(x == y); System.out.println(x == z); System.out.println((x+y) == (x+z)); System.out.println("------------"); System.out.println(x != y); System.out.println(x > y); System.out.println(x >= y); System.out.println(x < y); System.out.println(x <= y); System.out.println("------------"); int a = 10; int b = 20; //boolean flag = (a == b); //boolean flag = (a = b); //这个是有问题的,不兼容的类型 //System.out.println(flag); int c = (a = b); //把b赋值给a,然后把a留下来 System.out.println(c); } } |
7.4、逻辑运算符
/* |
/* D:不过&&优先级比||还高
|
7.5、位运算符
/* 位运算符: &,|,^,~ <<,>>,>>> 注意: 要做位运算,首先要把数据转换为二进制。 */ class OperatorDemo { public static void main(String[] args) { //&,|,^,~ int a = 3; int b = 4; System.out.println(3 & 4); System.out.println(3 | 4); System.out.println(3 ^ 4); System.out.println(~3); } } /* 分析:因为是位运算,所以我们必须先把数据换算成二进制。 3的二进制:11 00000000 00000000 00000000 00000011 4的二进制:100 00000000 00000000 00000000 00000100 &位与运算:有0则0。 00000000 00000000 00000000 00000011 &00000000 00000000 00000000 00000100 ----------------------------------- 00000000 00000000 00000000 00000000 结果是:0 |位或运算:有1则1。 00000000 00000000 00000000 00000011 |00000000 00000000 00000000 00000100 ----------------------------------- 00000000 00000000 00000000 00000111 结果是:7 ^位异或运算:相同则0,不同则1。 00000000 00000000 00000000 00000011 &00000000 00000000 00000000 00000100 ----------------------------------- 00000000 00000000 00000000 00000111 结果是:7 ~按位取反运算符:0变1,1变0 00000000 00000000 00000000 00000011 ~11111111 11111111 11111111 11111100 (补码) 补码:11111111 11111111 11111111 11111100 反码:11111111 11111111 11111111 11111011 原码:10000000 00000000 00000000 00000100 结果是:-4 */ |
/* ^的特点:一个数据对另一个数据位异或两次,该数本身不变。 */ class OperatorDemo2 { public static void main(String[] args) { int a = 10; int b = 20; System.out.println(a ^ b ^ b); //10 System.out.println(a ^ b ^ a); //20 } } |
/* */ |
一道面试题目:用多种方式实现两个整数变量的交换,如下:
/*
面试题:
请自己实现两个整数变量的交换
注意:以后讲课的过程中,我没有明确指定数据的类型,默认int类型。
*/
class OperatorTest {
public static void main(String[] args) {
int a = 10;
int b = 20;
System.out.println("a:"+a+",b:"+b);
//方式1:使用第三方变量(开发中用的)
/*
int c = a;
a = b;
b = c;
System.out.println("a:"+a+",b:"+b);
System.out.println("------------");
*/
//方式2:用位异或实现(面试用)
//左边:a,b,a
//右边:a ^ b
/*
a = a ^ b;
b = a ^ b; //a ^ b ^ b = a
a = a ^ b; //a ^ b ^ a = b
System.out.println("a:"+a+",b:"+b);
*/
//方式3:用变量相加的做法
/*
a = a + b; //a=30
b = a - b; //b=10
a = a - b; //a=20
System.out.println("a:"+a+",b:"+b);
*/
//方式4:一句话搞定
b = (a+b) - (a=b); //b=30-20=10,a=20
System.out.println("a:"+a+",b:"+b);
}
}