[参考着前人的路,探索着自己的路。]在一门语言的学习过程中,我们需要更好地思考其本身,这样对语言的学习、今后的发展和规划亦或学习上的长足进步都会大有裨益。我们不妨套用哲学的一些知识去延伸思考。哲学中的很经典的三个问题是:“你是谁?你从哪里来?你要去哪里?”Java作为一个对象,我们不妨也对其进行“哲学三问”,“什么是Java?Java是如何出现的?Java的未来走向会是怎样?”,理清这些问题,我们就会对Java有了一些基本的了解。作为初入Java江湖的小白来说,更加迫切的是这几个问题,为什么要学习Java?(初心,动机)要如何去学习Java?(方法)要学习到什么程度?(目标、要求)你能付出多少?(行动)。每个人都应该有每个人的答案。Java作为实用科学中的一员,就应该得在不断的实践中去学习。共勉!以下是我整理的一些学习笔记,是最基本的知识,本篇侧重点是掌握数据类型、运算符,在5.数据类型之前的是要了解的。
环境搭建和程序基础知识
环境搭建
Java环境的搭建:为了在我们的机器上使用Java语言进行开发,我们需要先搭建好Java所需的环境。下面主要介绍JDK的安装和环境变量配置
(Java Development Kit)JDK的说明与安装:
说明:
JDK是Java开发工具包,包含了JRE和Java开发工具(java.exe、javac.exe、javadoc.exe等),javac.exe用来将java源代码编译成字节码文件;
JRE(Java Runtime Enviroment,Java运行环境)由JVM(Java Virtual Machine,Java虚拟机)和JavaSE标准类库组成,其作用是加载、验证并执行字节码文件;
JVM,将字节码文件翻译为平台能执行的机器码。
安装:
http://www.oracle.com =>Products=>Java=> Download Java => 选择合适版本的JDK下载;
下载完成后安装在你熟悉的文件目录里(如我安装在"D:\Java\jdk1.8.0_131"下,建议目录下文件夹命名由jdk和版本号组成,如"jdk1.8.0_131")。
Windows10下的环境变量配置:
实际操作:(建2添1)【注意】Windows系统的坏境变量不区分大小写
在控制面板--->系统和安全--->系统--->高级程序设置--->环境变量(直接在系统环境变量里设置就好)
新建两个环境变量并设置值
CLASSPATH = .;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar
JAVA_HOME = 变量值为jdk文件夹的路径 (如我的就是 JAVA_HOME = D:\Java\jdk1.8.0_131)
为变量Path添加一个变量值
Path = %JAVA_HOME%\bin;(或者你也可以直接用绝对路径)
设置好好在命令行里运行java -version或javac来确认是否设置成功
目的:为了能正常的在我们的机器上使用Java编程,使javac.exe在任何目录下都可以执行(当执行javac.exe时,系统会先搜寻当前目录,如果不存在则会去path路径下搜寻,把javac.exe所在目录加入path,则可实现在任意目录下该命令的执行(一般不这样配值置));
说明:
CLASSPATH:javac编译器的一个环境变量,与import、package关键字有关
path: Windows系统执行命令时要搜寻的路径
JAVA_HOME:为了方便后面搭建..服务器,要用到JAVA_HOME来寻找jdk
如下CLASSPATH、JAVA_HOME
关于Java解释器:
java解释器会首先找到环境变量CLASSPATH,CLASSPATH 包含了一个或多个目录,它们作为一种特殊的“根”使用,从这里展开对.class 文件的搜索。从那个根开始,解释器会寻找包名,并将每个点号(句点)替换成一个斜杠,从而生成从CLASSPATH 根开始的一个路径名(所以package foo.bar.baz 会变成foo\bar\baz 或者foo/bar/baz;具体是正斜杠还是反斜杠由操作系统决定)。随后将它们连接到一起,成为CLASSPATH 内的各个条目(入口)。以后搜索.class 文件时,就可从这些地方开始查找与准备创建的类名对应的名字。此外,它也会搜索一些标准目录——这些目录与Java 解释器驻留的地方有关。
(...... ...... ...... ...... ...... ......)
/** *随便写的 *Hello World */ import java.util.java.Scanner; public class HelloWord { public static void main(String[] args) { //main方法 //Scanner scanner = new Scanner(System.in); //int allAgeStage = scanner.nextInt(); int yourBest = 1; double yourDiligent = 1.01; double hisDiligent = 1.02; int ageStageOne = 20; int ageStageTwo = 35; double resultOne = 0; double resultTwo = 0; System.out.println(Math.pow(yourDiligent, 365)); System.out.println(Math.pow(hisDiligent, 365)); System.out.println(Math.pow(hisDiligent, 365) / Math.pow(yourDiligent, 365)); if(ageStageOne == 20 && ageStageTwo == 35) { for(int i = 0; i <= ageStageTwo - ageStageOne; i++) { resultOne = Math.pow(yourDiligent, 365 * i); resultTwo = Math.pow(hisDiligent, 365 * i); } } System.out.println(resultOne); System.out.println(resultTwo); System.out.println(); System.out.println("Hello,welcome to the java world!"); System.out.println("All I want is for you to do your best in everything you do."); System.out.println("Remeber that.It is very important!"); } } /* dream & reality */
有时候需要在代码旁进行一些解释说明,便于他人阅读了解这些代码功能。Java中用来注释的注释符的有下面这几个:
单行注释符: // (只作用于一行中,对于其后面的字符不会被解释运行)
多行注释:/* */ (这两个符号直接的内容不会被解释执行,不可以嵌套使用)
文档注释:/** */
注释的内容可以被JDK提供的工具javadoc所解析而生成一套以网页文件形式体现的该程序的说明文档
命令行操作生成项目说明文档:javadoc -d mydoc -author -version HelloWord.java (javadoc -d 要新建的文件夹名 作者 版本号 程序名)
2.API文档
什么是API、API文档?
API(Application Programming Interface),应用程序接口,是Java提供的基本编程接口,我们进行程序设计用的编程和接口;API文档就是关于这些编程接口的说明
下载:https://docs.oracle.com/en/java/javase/index.html
如何使用?
参考:https://blog.csdn.net/wenzhi20102321/article/details/52431519
关键字:被Java语言赋予了特殊含义、用于专门用途的字符串 小写
保留字:现有Java版本未使用,但以后版本会用作关键字的字符串或单词
现有关键字和保留字:(转自参考:https://blog.csdn.net/qq_37933685/article/details/81282182)
标识符:
对各种变量、方法、类、包、接口等命名时使用的字符序列;也可以认为是你命名时的所有字符串
应以字母、下划线、美元符号$开头,后接字母、美元符、下划线、数字,长度无限制
(编译器或者解释器都会有一个词法分析器。词法分析器在判断一个单词是否以数字开头,如果是以数字开头则把他当作数字常量处理,否则当作普通单词处理。这样子可以提高词法分析器的效率。)
标识符命名规范:
1.包名:多单词组成时都小写xxxyyyzzz
2.类名、接口名:多单词组成时都首字母大写XxxYxxZzz
3.变量名、方法名:多单词组成时第一个单词小写,其他都首字母大写xxxYyyZzz
4.常量名:所有字母都大写,多单词时每个单词用_连接XXX_YYY_ZZZ
【】命名时尽量“见名知意”
变量含义:
内存中的一个存储区域,该区域数据可以在同一类型范围内不断变化
程序中最基本的存储单元,包括变量类型、变量名和存储的值
存储单位:
1 Byte(字节) = 8 bit(比特,位)
1 KB = 1024 B (2^10 = 1024)
1 MB = 1024KB
1GM = 1024 MB
5.数据类型
Java中数据类型分为基本数据类型和引用数据类型。
基本数据类型:
布尔型boolean(1byte)、字符型char(2byte)、字节型byte(1byte)、短整型short(2byte)、整型int(4byte)、长
整型long(byte)、浮点型float(4byte)、双精度浮点型double(8byte)
浮点型变量:float4(变量值要以F或f结尾) double8(d)
【注意】运算时,整型常量默认为int型,浮点型常量默认为float型(https://blog.csdn.net/youngyouth/article/details/79854483)
关于布尔型之外的七种数据类型变量的运算:
引用数据类型:
引用数据类型包括类、接口、数组、String,这里先了解一下String。
String 变量名 = "字符串";//可以和8种数据类型做运算,运算结果仍然是String型,并且运算时只能使用连接运算:+
【补充】进制在程序中的表示:
二进制 以0b或0B开头
八进制 以数字0开头
十六进制 以0x或0X开头(十六进制里的A\B\C\D\E\F不区分大小写 0xFf = 0XFF)
【补充】ASCII码:转自(http://ascii.911cha.com/)
6.运算符
算术运算符:
【注意】%取模运算结果的符号和被模数符号相同,也就是说被模数的正负不影响最后结果正负(被模数%模数)
自增、自减不会改变自身数据类型(先后运算取值是指变量自身在整个运算中结束后再自加,或在整个运行进行前先自加,自减同理)
例:byte num = 127; num++; 输出结果为-128;byte占一个字节内存,八位,字节第一位为符号位,自加一后进位,符号位也成了1
三元运算符:(以下说的基本数据类型都是除boolean之外的七种基本数据类型)
(条件表达式)?表达式1:表达式2
条件表达式结果为boolean型
条件表达式为true,则执行表达式1,条件表达式为false,则执行表达式2
用什么数据类型接收,表达式1和表达式2的值的数据类型就得是能自动提升或其和接收变量的数据的数据类型一致(根本来说就是遵循基本数据类型之间的运算)
【注意】在运行时表达式1和表达式2会统一为相同一个类型(表达式1、2最后结果都为基本数据类型),如下:
System.out.println((1 < 3) ? 2L:4D);//long型的2和double型的4,运行时统一为了double型,输出2.0
System.out.println((1 < 3) ? 2L:4);//输出结果是2
boolean a = true; System.out.println((1 < 3) ? a:"s");//表达式1、2有一个不是基本数据,都不会发生基本数据类型之间的统一
【】如果程序既可以用三元运算符又可以用if-else结构,那么优先选择三元运算符,因为简洁、执行效率高。
赋值运算符:
+= A += B → A = A + B(可以这样看:A = (A+) B),-=、*=、/=、%=同理
逻辑运算符:
! 非
&& 短路与:全真为真,返回true或false(运算符左边是true就运行右边,是false就不会执行运算符右边的运算)
|| 短路或:有真为真,返回true或false(从左到右做运算,一真则真,全假为假,先遇真才会提前结束逻辑运算)
int a = 9 & 10;//9的二进制位1001,10的二进制位1010,结果a = 8 int b = 9 | 10;//1011,结果为b = 11 System.out.println( 8 ^ 4);//10001000,结果为12
比较运算符:
等于== 不等于!= 小于等于<= 大于等于>= 大于> 小于<
instanceof : 检查是否是类的对象,格式如【"" instanceof String】
if(student instanceof Dog){//如果对象student是Dog类的实例,就输出Metamorphose! System.out.println("Metamorphose!"); }
位运算符:(操作的都是整型数据,顾名思义是在位上的运算,1 byte(字节) = 8 bit(比特,位))
【补充】计算机内数的表示:
无符号数
有符号数
八位二进制数,最高位是符号位:0表示正,1表示负(例如1000 0001表示-1,0000 0001表示1,int在计算机中是4个字节,也就是32位,最高位也表示符号位)
三种表示方式(正数的原码、反码、补码都一致,这里都是八位二进制表示各个码)
原码:(表示范围:-127~127)
反码:负数的反码:符号位不变,其余位取反 (表示范围:-127~127)
补码:负数的补码:符号位不变,其余位取反后在末位加1 (表示范围:-128~127)
求补运算:
定义:一个二进制数的符号位和数值位一起取反再末位加1
用法:对一个数的补码进行求补运算就得到这个数的相反数(也就是说补码的减法运算可以通过求补运算来实现)
拓展:用补码进行加减运算非常方便,所以现在的计算机中,有符号数都用补码表示
<< 左移:补0
>> 右移:最高位是啥拿啥补,最高位(也就是符号位)影响右移
>>> 无符号右移:都用0补,最高位(也就是符号位)不影响右移
~ 取反(补码)运算:先求出要取反的数的原码,原码取反后就得到我们取反运算后的那个结果的补码
int a = 9 & 10;//9的二进制位1001,10的二进制位1010,结果a = 8 int b = 9 | 10;//1011,结果为b = 11 System.out.println( 8 ^ 4);//10001000,结果为12 int a = 4 << 2;//100左移两位为10000,则a = 16 int a = 4 >> 2;//100右移两位为1,则a = 1 byte a = 128 >>> 1;//
【】运算符优先级:用()来决定哪个先运算就好(http://c.biancheng.net/view/794.html)
7.流程控制和循环
顺序结构:
程序从上往下逐行地执行,中间没有任何判断和跳跃
分支结构:
根据条件选择性执行,有if...else和switch-case两种
if(表达式) { //表达式的最后值是布尔类型,true或false,可嵌套,Java中并没有真正的if-else if语法 执行语句1; }else{ 执行语句2; }
switch(表达式) { //表达式只能是byte、short、char、int、枚举类型(JDK5.0新增)、String类型(JDK7.0新增)这六种 case 常量1: 执行语句1; break; ...... default: //默认值,都不满足时执行,相当于if-else中的else 执行语句n; }
8.循环
循环结构:(初始化条件、循环条件(布尔类型)、循环体、迭代条件)
根据循环条件,重复性执行
有while、do...while、for三种
JDK1.5提供了foreach循环,方便遍历集合和数组元素
//for循环 for(1; 2; 4) { //1初始化条件、2循环条件(布尔类型)、3循环体、4迭代条件 3; } //运行顺序1→2→3→4,直到循环结束 int num = 1; for(System.out.print('a'); num <= 3; System.out.print('c'),num++){ System.out.print('b'); }
//while循环:(当条件满足时执行循环内容)(for和while可以相互转换) 1 //初始化条件 while(2){ //循环条件 3; //循环体 4; //迭代条件,少了可能导致死循环 }
//do...while循环:(先执行一次,直到条件不满足时退出循环) 1 //初始化条件 do{ 3; //循环体 4; //迭代条件 }while(2); //循环条件 //1→3→4→2→3→4→2→...→直到2为false时推出循环,循环至少执行一次
//关于死循环 while(true){ } for(;;){ } /* 结束循环方式: 方式一:循环条件部分返回false 方式二:循环体中执行break */
关于循环嵌套:
//例题:100以内质数(素数:只能被1和自身整除) class PrimeNum{ public static void main(String[] args){ boolean isFlag = true; //int count = 0; for(int i = 2; i <= 100; i++){ isFlag = true; for(int j = 2; j < i; j++){ //优化二:把这里的i换为Math.sqrt(i),大于改为大于等于号;对是质数的自然数有效 if(i % j == 0){ isFlag = false; //break; 优化一:当进入判断时就结束当前循环,减少后续循环判断);对非质数的自然数有效 } } if(isFlag == true){ System.out.println(i); //count++; } } } } long start = System.currentTimeMillis();//获取当前时间距离1970年0时0分0秒的ms数 long end = System.currentTimeMillis(); System.out.println("程序运行花费的时间为:" + (end - start) + "ms"); //质数实现方式2 class PrimeNum2{ public static void main(String[] args){ int count = 0; label:for(int i = 2; i <= 100; i++){ //要遍历的自然数 //质数判断 for(int j = 2; j <= Math.aqrt(i); j++){ if(i % j == 0){ continue label; } } //质数数量统计 count++; } } } long start = System.currentTimeMillis();//获取当前时间距离1970年0时0分0秒的ms数 long end = System.currentTimeMillis(); System.out.println("程序运行花费的时间为:" + (end - start) + "ms");
跳出循环的方式:
switch-case、循环结构中使用
多嵌套中就近跳出,执行几次就跳出几次
循环结构中使用
多嵌套中就近跳出
label:for(inti = 1; i <= 4; i++){ for(int j = 1; j <= 10; j++){ if(j % 4 == 0){ //break; 跳出最近的一层循环 //continue; 跳出最近的一次循环 //break label; 结束指定标识的一层循环结构 //continue label; 结束指定标识的一次循环结构的当次循环 } } }
关于Scanner类:(从键盘获取数据)
1.导包:[import java.util.Scanner;]
2.Scanner的实例化:Scanner scan = new Scanner(System.in);
3.调用Scanner类的相关方法,获取指定类型的变量
//Scanner使用举例 import java.util.Scanner; class ScannerTest{ public static void main(String[] args){ Scanner scan = new Scanner(System.in); int num = scan.nextInt(); System.out.println(num); } }