java基础程序设计
操作系统
操作系统:(Operating System,简称OS):是管理和控制计算机硬件与软件资源的计算机程序,是直接运行在“裸机”上的最基本的系统软件,任何其他软件都必须在操作系统的支持下才能运行。
Windows: Windows95、98、2000、XP、vista、7、8、10
Unix 服务器端
Linux 开源的 CentOS6.9
进制的引入
计算机的硬件系统通常由五大部件构成,包括:运算器、控制器、存储器、输入设备和输出设备。
其中,运算器和控制器放在一起就是我们通常所说的中央处理器,它的功能是执行各种运算和控制指令以及处理计算机软件中的数据。
我们通常所说的程序实际上就是指令的集合,我们写程序就是将一系列的指令按照某种方式组织到一起,然后通过这些指令去控制计算机做我们想让它做的事情。
今天我们使用的计算机虽然器件做工越来越精密,处理能力越来越强大,但究其本质来说仍然属于“冯•诺依曼结构”的计算机。
“冯•诺依曼结构”有两个关键点,一是提出了将存储设备与中央处理器分开,二是提出了将数据以二进制方式编码。
二进制是一种“逢二进一”的计数法,跟我们人类使用的“逢十进一”的计数法没有实质性的区别,
人类因为有十根手指所以使用了十进制
(因为在数数时十根手指用完之后就只能进位了,当然凡事都有例外,玛雅人可能是因为长年光着脚的原因把脚趾头也算上了,
于是他们使用了二十进制的计数法,在这种计数法的指导下玛雅人的历法就与我们的不太一致,
而按照玛雅人的历法,2012年是上一个所谓的“太阳纪”的最后一年,而2013年则是新的“太阳纪”的开始,
后来这件事情被以讹传讹的方式误传为2012年就是玛雅人预言的世界末日这种荒诞的说法,
今天我们可以大胆的猜测,玛雅文明之所以发展缓慢估计也与使用了二十进制有关),
对于计算机来说,二进制在物理器件上来说是最容易实现的(高电压表示1,低电压表示0),
于是在“冯•诺依曼结构”的计算机都使用了二进制。虽然我们并不需要每个程序员都能够使用二进制的思维方式来工作,
但是了解二进制以及它与我们生活中的十进制之间的转换关系,以及二进制与八进制和十六进制的转换关系还是有必要的。
太极八卦
<<周易>>:易有太极,是生两仪,两仪生四象,四象生八卦.
老子的《道德经》第四十二章:道生一,一生二,二生三,三生万物。万物负阴而抱阳,冲气以为和
太极即为天地未开、混沌未分阴阳之前的状态。
"两仪"有七说:一说为阴阳,一说为天地,一说为奇偶,一说为刚柔,一说为玄黄,一说为乾坤,一说为春秋。但通常是指阴阳。
四象即为:太阳、太阴、少阴、少阳。
其大意是:莱布尼兹(数学家)通过在中国的传教士,得到了八卦图,他领悟到只要把八卦中的阴爻(yao)代表0,阳爻(yao)代表1
二进制
计算机底层存储的方式就是二进制形式
二进制的组成: 0 1
原则:逢二进一 00 --> 0
01 -->1
01+1-->02 ---> 10 ---> 2
11 --> 3
11+1 --> 12 --> 20 --> 100 --> 4
十进制:
组成:0,1,2,3,4,5,6,7,8,9
原则:逢十进一
9+1 --> 10
10+1 --> 11
19+1--> 20
二进制和十进制之间的互相转换
十进制转二进制:
对2求余,只要商不为0,继续计算,余数从下至上读取
--> % --> 求余数
java编程中整数除以整数只能得到整数
1 / 1 = 1
1 / 2 = 0
1%2 = 1
判断是否能被某个数整除 --> 使用 % 求余
5%2 = 2...1
2%2 = 1...0
1%2 = 0...1
5(10) ----> 101(2)
二进制转十进制
按权位展开求和
从右向左展开,右边的第一位是0位,对应这2的次方,依次类推,求和
1010(2)--> 1*2^3 + 0*2^2 +1*2^1 +0*2^0
--> 1*2^3 + 1*2^1
-->8+2 --> 10(10)
练习: 11011---> 1*2^4+1*2^3+ 0*2^2+1*2^1+1*2^0
---> 1*2^4+1*2^3+1*2^1+1*2^0
---> 16+8+2+1 --> 27(10)
110 --->1*2^2+1*2^1+0*2^0 ---> 4+2-->6(10)
101011 ---> 1*2^5+0*2^4+1*2^3+0*2^2+1*2^1+1*2^0
--->1*2^5+1*2^3+1*2^1+1*2^0
---> 32+8+2+1-->43(10)
8421理论 四位的值都是1
1111(2) ---> 1*2^3+1*2^2+1*2^1+1*2^0
---> 8 +4+2 +1
19%2=9...1
9%2 = 4...1
4%2 = 2...0
2%2 = 1...0
1%2 = 0...1
10011(2)
理论:判断某个数是否是奇数%2 是否等于 1
判断某个数是否是偶数%2 是否等于 0
7%2= 3...1
3%2 =1...1
1%2= 0...1
111(2)
23%2
八进制(为了人类可读)
10000000000 ---> 1024 --> 2000(8)
八进制没有十进制的概念,读取八进制的时候不能以十进制来读 组成:0,1,2,3,4,5,6,7
原则:逢八进一
IP地址 127.0.0.1
二进制和八进制之间的互相转换
二进制和八进制之间存储在着一种对等的关系
三位一取
从右向左,每一位单独断开,求每一位对应的二进制,不足三位的补0
ps:前面若是补出的0可以省略,但是中间值补出的0不能省略
127(8)---> 1 2 7 --> 001 010 111 --> 001010111(2)-->1010111(2)
从右向左,每三位一断,求对应的值,不足三位的补0
1010111(2)---> 001 010 111 -->127(8)
十六进制(表示内存地址)
ps:Java去指针的-->引用
组成:0~9,a(10),b(11),c(12),d(13),e(14),f(15)
原则;逢十六进一
二进制和十六进制之间的互相转换
二进制和十六进制之间存储在着一种对等的关系
四位一取
从右向左,每一位单独断开,求每一位对应的二进制,不足四位的补0
1a2c(16)----> 1 a 2 c --> 0001 1010 0010 1100
--->0001101000101100(2)
从右向左,每四位一断,求对应的值,不足四位的补0
0111111111111111 -->0111 1111 1111 1111 ---> 7fff
计算中最小的存储单位是字节
8bit(位) = 1byte(字节K)
1024byte = 1KB
1024KB = 1MB
1MB = 1048576 K(byte)
1024MB = 1GB
1024GB = 1TB
1024TB = 1PB
1024PB = 1EB
计算机中是如何存储数值的
原码:数值的存中是存在符号位的 第一位(左边)
0--->正数 1--->负数
以下都以1字节为例
原码的形式存储5和-5如何存储
原码表示一个数,第一位是符号位,剩余位数是其数值大小
0 000 0101 5
1 000 0101 -5
思考:以原码的形式存储1和-1的值,计算机中是否可以存储
0 000 0001 1
1 000 0001 -1
+
1 000 0010 -2
反码:
正数的原码和反码是一样的,正的原码即是反码
3的反码
0 000 0011 3 原码也是反码
负数的反码,符号位不动,其他位按位取反 1变0 0变1
负数的反码需要在原码的基础上计算
-3的反码
1 000 0011 -3 原码
1 111 1100 -3 反码
思考:以反码的形式存储1和-1的值,计算机中是否可以存储
0 000 0001 1 原,反
1 000 0001 -1 原
1 111 1110 -1 反
+
1 111 1111 -127
补码:
正的补码就是其原码,正数的原,反,补都是一样的(三位一体)
负数的补码需要在反码的基础上进行+1操作
思考:以补码的形式存储1和-1的值,计算机中是否可以存储
0 000 0001 1 原,反,补
1 000 0001 -1 原
1 111 1110 -1 反
1 111 1111 -1 补
+
1 0000 0000 0
1 溢出了
1是理论值,这个值是可以算出来的
实际中是无法存储的
计算机中是如何存储数值的是以补码
计算机语言与编程概述
什么是计算机语言?
生活中的两个人的交流主要是方式无非是采用一种都能够识别的语言,那么也就是说该语言是他们之间传递信息的媒介
计算机语言是指用于人与计算机之间通讯的一种特殊语言,是人与计算机之间传递信息的媒介。
那计算机怎么能读懂我们给它发出的的信息呢?
此时就需要编写一套由字符、数字所组成并按照某种语法格式的一串串计算机指令,而这些计算机指令就是计算机语言。软件就是由若干条计算机指令所组成的。
计算机语言分类:
机器语言:直接用二进制指令表达,指令是用0和1组成的一串代码,它们有一定的位数,并分成若干段,各段的编码表示不同的含义(如0000 代表 加载(LOAD),0001 代表 存储(STORE))。
汇编语言:使用一些特殊的符号来代替机器语言的二进制码(又称符号语言),计算机不能直接识别,需要用一种软件将汇编语言翻译成机器语言,汇编语言依赖于硬件体系,开发难度大(如加法指令ADD/ADC、减法指令SUB/SBB)。
高级语言:使用一定格式的自然语言进行编写源代码,通过编译器将源代码翻译成计算机直接识别的机器语言,之后再由计算机执行,不直接操作硬件,把繁琐的翻译操作交给编译器完成。
我们将学习的Java就属于高级语言范畴。
什么是编程:
前面说了计算机语言就是用来实现人和计算机通讯的,那为什么人要和计算机通讯呢,其原因就是为了让计算机帮我们完成一些人为起来比较复杂的工作。那计算机怎么知道我们要它解决的问题是什么,怎么知道解决问题的具体的步骤是什么呢?此时我们就得通过编程语言去告诉计算机去,做什么,怎么做。这种人和计算机之间交流的过程,我们称之为编程。
Java发展过程
Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针(地址(引用类型))等概念,因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程 。
Java具有简单性、面向对象、分布式、健壮性、安全性、平台独立与可移植性、多线程、动态性等特点。
Java可以编写桌面应用程序、Web应用程序、分布式系统和嵌入式系统应用程序等Java的发展过程詹姆斯·高斯林 (James Gosling)Java之父1996年1月,Sun公司发布了Java的第一个开发工具包(JDK 1.0)
1997年2月,JDK 1.1面世
1998年12月8日,第二代Java平台的企业版J2EE发布。
1999年6月,Sun公司发布了第二代Java平台(简称为Java2)的3个版本:J2ME(Java2 Micro Edition,Java2平台的微型版),应用于移动、无线及有限资源的环境;J2SE(Java 2 Standard Edition,Java 2平台的标准版),应用于桌面环境;J2EE(Java 2Enterprise Edition,Java 2平台的企业版),应用于基于Java的应用服务器。Java 2平台的发布,是Java发展过程中最重要的一个里程碑,标志着Java的应用开始普及
1999年4月27日,HotSpot虚拟机发布。
HotSpot虚拟机发布时是作为JDK 1.2的附加程序提供的,后来它成为了JDK 1.3及之后所有版本的Sun JDK的默认虚拟机
2000年5月,JDK1.3、JDK1.4和J2SE1.3相继发布,几周后其获得了Apple公司Mac OS X的工业标准的支持。
2001年9月24日,J2EE1.3发布。
2002年2月26日,J2SE1.4发布。自此Java的计算能力有了大幅提升
2004年9月30日,J2SE1.5发布,成为Java语言发展史上的又一里程碑。为了表示该版本的重要性,J2SE 1.5更名为Java SE 5.0
2005年6月,在Java One大会上,Sun公司发布了Java SE 6。此时,Java的各种版本已经更名,已取消其中的数字2,如J2EE更名为JavaEE,J2SE更名为JavaSE,J2ME更名为JavaME
2006年11月13日,Java技术的发明者Sun公司宣布从
2007年3月起,全世界所有的开发人员均可对Java源代码进行修改
2009年,甲骨文公司宣布收购Sun 。
2010年,Java编程语言的共同创始人之一詹姆斯·高斯林从Oracle公司辞职。
2011年,甲骨文公司举行了全球性的活动,以庆祝Java7的推出,随后Java7正式发布。
2014年,甲骨文公司发布了Java8正式版
什么是JDK、JRE
JRE:java运行环境如果要运行java 程序,就需要JRE的支持包含JVM
JDK:java开发工具,包行开发java程序所有的工具.如java和javac
JDK是包含JRE
JVM:它是所有Java程序运行得到虚拟计算机,好比是一个模拟器
JVM的作用,用于读取并处理编译过得字节码文件(.class)
Java体系
JavaSE JavaEE JavaME
Java跨平台型
一处编译,处处运行(是.class文件)
第一个Java程序
HelloWorld
编译源文件,以.java作为结尾的文件
javac 文件名.java 会产生一个同名的.class文件
运行编译过后的文件(.class)
java 文件名
ps:public访问权限控制符,可以让谁来访问 公有的 所有人都可以
是一个关键字
class 类 java最小的程序单元 是一个关键字
Hello 类名 类名和文件名要一致(规定)
类名后面{ }--> 类体 书写逻辑
System.out.println()控制台打印
语句结束时要使用 [;] 号作为结束
类体中 或 方法体中
Java的注释和基本句法规则
单行注释 // 注释的东西
多行注释/*注释的东西*/
文档注释/** */
ps:多写注释,但是不能是废话,要精简
在语法中需要使用到:
分好号 --> 语句的结束
只要是括号必须成对出现
准守大小写
不能使用关键字,保留字作为名字
Java关键字
具有特殊意义的单词,就是关键字
保留字,java中并没有使用这些名字但是不定时会被启用
goto const sizeof
Java标识符和语句分隔
标识符:由字母,数字,$符号,下划线组成,但是不能以数字开头
ps:不能出现汉子,日语,泰语....
在书写代码的时候,需要定义一些名字,这些名字不能随意的组成
,需要满足规则,标识符的规则
类名,变量名,常量名,方法名等等..
不要使用关键字和保留字
分号-->一个语句的结束
{}--> 表示一断代码块(类体,方法体)
[]-->表示是数组或数组取值是使用
() -->应用的非常广泛了
ps:()优先等级最高,运算符
点(.)-->类和对象之间的使用
ps . 就相当the
EditPlus配置方法
看视频
常量
固定不变的量就是常量
常量的分类:
字面常量
整型常量1,2,3
小数常量 1.2
布尔常量true false
ps:字符串,可变字符串,不可变字符串
“”引起来的内容即使字符串
“HelloWorld”
定义常量使用关键字final
变量
可以改变的量就是变量
变量:表示存储空间,可以用来存放同一类型的常量值,没有固定的值,可以重复使用
如何定义变量
数据类型 变量名;
变量必须准守标识符规则
变量赋值
- 数据类型 变量名 = 对应的值;
- 数据类型 变量名;
变量名 = 对应的值;
数据类型
java中分两种数据类型
一种叫做基本数据类型
一种叫做引用数据类型
两者的区别在方法时说明
整数类型
byte short int long只能存储整数
在内存中所占有的空间是不同,也就代表这存储的范围是不用
小数类型(浮点类型)
float double即可以存储整数也可以存储小数
小数的存范围是大于正整数的存储范围的
小数类型底层存储是科学计数法
1234.56 --> 1.23456*10^3是不精确的
float可以精确存储小数点后6~7位
double可以精确存储小数点后15~16位
在编程的时候整数默认类型是int,小数默认类型是double
字符类型:存储的是 “一个” 字符,并且会使用’ ’单引号
多用于存储ASCII码
布尔类型boolean的值只有两种true或false 没有其他值
数据类型转换
boolean不参数类型转换
自动类型转换
把小范围值存储到大范围值,会发生自动类型转
ps:byte,short,char在计算的时候,会自动提升为int
float在计算的时候不会自动提升为double
强制类型转换
把大范围的值存储到小范围中,需要进行强制类型转换
语法:
小范围的数据类型 变量名 = (小范围的数据类型)大范围数据类型的值
ps:强制类型转换需要承担精度丢失的风险
表达式
Java运算符
算数运算符
+ - * / %
赋值运算符
= += -= *= /= %=
关系运算符
> >= < <= == !=
逻辑运算符
& && | || !
++ -- 运算符
1 class A { 2 public static void main(String[] args) { 3 int number = 10; 4 System.out.println(number); 5 } 6 } 7 8 结果:10 9 10 class A { 11 public static void main(String[] args) { 12 int number = 10; 13 number = 20; 14 System.out.println(number); 15 } 16 } 17 18 结果:20 19 20 21 class A { 22 //全局变量 --> 面向对象的时候 23 // static 静态的 --> 类可以进行访问,在静态方法中使用 24 //添加了static 关键的变量是静态全局变量, 没有添加就是普通全局变量 25 //直接在静态方法中使用 26 static int number = 10; 27 //只要将static去掉 28 public static void main(String[] args) { 29 //局部变量:方法体里面的 30 int a = 10; 31 System.out.println(number); 32 } 33 } 34 35 结果:10 36 37 38 class A { 39 40 static int number = 10; 41 42 public static void main(String[] args) { 43 44 number = 20; 45 46 System.out.println(number); 47 } 48 } 49 50 结果:20 51 52 public class Demo { 53 static int number = 10; 54 public static void main(String[] args) { 55 //就近原则,变量离谁最近,就是谁 56 //局部变量可以和全局变量重名,开发中是绝对不会这样用的 57 //变量名 要唯一 58 int number = 20; 59 System.out.println(number); 60 } 61 } 62 63 20 64 65 66 67 改错: 68 //没有错误,这种形式是可以,但是不要这样 69 int i = 1 , j ; 70 71 //java小数类型是double,若要使用float,给值添加f 72 float f1 = 0.1f; ---> float f1 = (float)0.1; 73 //float,double 即可以存储小数,也可以存储整数,存储范围大于整型 74 float f2 = 123; 75 76 //小数类型,底层存储是科学计数法,e或E 相当于10 2e20 2*10^20 77 double d1 = 2e20 , d2 = 124; 78 79 //b3 byte -128~127 超出范围,强制类型转换,精度丢失的风险 80 byte b1 = 1 , b2 = 2 ,b3 = 129; 81 //若使用变量j,必须进行初始化(必须赋值) 82 j = j + 10; 83 //没有问题的,整数除以整数只能得到整数i=0 84 i = i / 10; 85 86 //小数默认是double,double的范围大于整数,i 的类型是int ,得到得到的结果是double 87 //i = (int)(i*0.1) 88 i = i * 0.1; 89 90 //没有错,没有进行任何变量的赋值只是单纯的计算 91 System.out.println(i*0.1); 92 93 //char是存储字符 并且是单个字符,并且使用' ' 94 //存储整数 ,存储范围 0~65535 对应的整数会得到一个字符-->ASCII码 95 //byte,short,char在计算是会自动提升为int类型 96 //java中使用的 "万国码" /u0000 ~ /uFFFF 97 char c1='a',c2=125; 98 99 System.out.println(c2); 100 // } 101 byte b = b1-b2;// 强制类型转换 102 byte b = (byte)(b1-b2); 103 char c = c1+c2-1; // 强制类型转换 104 105 //char c = (char)(c1+c2-1) --> 'a' --> 其ASCII码的值 ,然后在进行计算 97+125-1 106 //char是可以进行计算的,通过数值的计算的到变化字符的目的 107 108 float f3 = f1+f2;//没有问题 float在计算时不会提升为double 109 110 float f4 = f1 + f2 * 0.1f; //0.1是double,只要0.1添加f 111 112 double d= d1 * i + j; //有错j没有初始化