1、java简介
1、java发展历史
java最早的发展可以追溯到1991年,Sun公司成立了一个称为Green的项目组,致力于解决数字家电之间的通讯与协作(智能家电)。James Gosling 作为项目负责人。相对于PC机而言,数字家电设配平台差异非常的大,他们必须屏蔽掉各个平台的差异,于是Gosling开发了一种全新的语言,叫Oak。但是行业不景气啊,语言是开发出来啦,但是硬件厂商对Oak语言还不是很信任啊。都不敢冒险生产该类硬件设备。因此Oak语言就被搁置下来啦。
但是啊,是金子他总是要发光的啊。时间来到了1995年,陈奕迅偷他朋友背包的年份。互联网发展迅速,当时是只能展示静态页面,比较死板,业界都纷纷投入人力来研究动态的页面效果。最好呢,还可以跨各种平台。这是候sun公司拍脑袋一想,哎呀我擦,这不就是我们的橡树吗。于是将橡树包装个响亮的名字,重新推出。这就是我们熟知的java啦。java推出之后迅速占领了市场,许多其他的公司都放弃了自己研发项目,开始使用java。其中就包括java现在的所有者,思诚的合作伙伴,oracle。
2009年oracle 收购sun。
2、java的发行版本
java 从1996年发布jdk1.0版本开始到现在发展了22年,现在最新的版本时jdk11,Java
语言无可质疑的成为拥有程序员最多、使用最广泛的语言。在程序排行榜上一直是数一数二的。
java的三个平台技术标准:
javase:java平台标准版,是java平台的基础,javase包含了java应用所需要的基础环境和核心库类。
javaee: java平台企业版,javaee在javase的基础之上,用来开发企业级的应用。这个是java应用最广泛的领域。
javame:java平台微型版,机顶盒,移动电话等,这种现在应用很少,逐渐被安卓替代。
jdk: java 开发工具包
jre:java 运行时环境
jvm :java虚拟机
java api :java 系统核心类库
学习路线:javese --> javaee.
为什么java会这么火?这个因为java的很多特性
3、java 语言特点
- 面向对象:面向对象,更符合人类的思维方式,适合开发大型项目。
- 跨平台:java程序只需要编写一次,编译之后便可以在各个平台上运行。
- 安全:垃圾自动回收,放弃了指针操作,避免了很多因指针操作错误导致的安全问题。
- 多线程:同时处理多个任务的能力。
- 高并发处理能力强
4、java 行业,通过java我们能做什么?
从95年发展至今,java已经成为了全球最受欢迎的开发语言。应用几乎涉及到了你所能想到的各行各业。金融,电商,电信。
通过java我们能做什么?
网站:淘宝,京东
管理软件:用友,金蝶
安卓
游戏:我的世界
4、jdk安装及环境变量配置
下载地址:http://www.oracle.com/technetwork/cn/java/javase/downloads/index.html
JAVA_HOME:D:\Program Files\Java\jdk1.8.0_121
path:%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;
CLASSPATH:.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar
5、ideal开发工具安装
6、第一个java程序
/**
* 描述:
* 第一个java程序
* 认识java程序的组成,及java程序的运行方式。
* 掌握项目,类,main方法,输出控制台,控制台查看
* 了解java程序的编译过程。
* 了解java注释
* @author xupeng
* @create 2018-12-18 22:03
*/
public class FirstClass {
public static void main(String[] args) throws IOException {
System.out.println("大家好,我是欧阳锋,人送外号西毒,我在娱乐圈有很多徒弟。");
}
}
概念:
项目:整个java代码的集合。
包:java代码文件存放的目录结构。
类:java代码文件
方法:java中一组为了实现特定功能的代码块的集合。
8、常用的java命令
- javac [选项] 源文件 这个命令用来编译我们写的java源代码
# -encoding 为指定文件的编码格式
javac -encoding utf-8 FirstClass.java
- java class文件 执行class文件中的main方法
java day01.FirstClass
- jar 用来打jar包,将class文件打成一个jar包。jar包可以直接运行,或者供别人调用。
# jar包名 打入的类
jar -cvf FirstClass.jar FirstClass.class
- javadoc :用来生成帮助文档
javadoc -encoding utf-8 -d E:\upload -docencoding utf-8 Fir
stClass.java
- javap 这个命令是反编译器,显示编译类中可以访问的方法和数据。
javap FirstClass.class
# -c 为反汇编
javap -c FirstClass.class
7、java中的注释
- 单行注释: //
- 多行注释: /**/
- 文档注释:
8、java中的数据类型
java中数据类型分为基本数据类型和引用数据类型两种。
9、基本数据类型
java中有八种基本数据类型分别为:
四种整形数据类型:
- byte 占8位,1个字节 取值范围 -2^7 -- 2^7-1
-128 ~ 127 - short 占16位 2字节 取值范围 -2^15 -- 2^15-1
-32768 ~ 32767 - int 32位 4 字节 取值范围 -2^31 -- 2^31-1
-2147483648 ~ 2147483647 21亿 - long 64位 8字节 取值范围 -2^63 - 2^63-1
-9223372036854774808 ~ 9223372036854774807
浮点类型
- float 单精度 32 位 4个字节
1.4E-45~3.4028235E38 - double 双精度 64位 8个字节
4.9E-324~1.7976931348623157E308
字符
char 使用unicode-16编码 占用2个字节
英文单词 askii
中文 unicode码
布尔类型
- boolean 占一个字节 取值 true false
13、基本数据类型的转换
- 自动转换,小的数据类型转换成大的数据类型(由低到高)
byte->char->short->int->long - 强制转换,大的数据类型转换成小的数据类型 (由高到低),会丢失精度
- java整数 默认是 int 类型,小数 默认是 double 类型
/**
* 描述:
* java中基本数据类型
* 目标:
* 1、了解java八大基本数据类型
* 2、了解变量的定义,作用域
* 3、了解java标识符命名规范
*
* @author xupeng
* @create 2018-12-18 23:37
*/
public class BasicDataType {
public static void main(String[] args) {
//定义变量
byte b=2;
//错误示例
// byte 2s=10;
// short s=500;
//超出范围编译会报错,
// short s=50000;
int i=357;
long l=3888989;
//超出int范围会报错
// long l2=999999999999999999;
//添加L之后不报错
long l3=999999999999999999L;
float f=12.5f;
double d=12.5;
//类型转换 -->小的转大的会自动转换,大的转小的需要强制类型转换
//小转大 ok
l=i;
//大转小,编译不通过,要强制类型转换,并且会丢失精度
i= (int) l;
}
}
10、java 变量
1)变量即给对象取一个名字,方便我们对对象进行操作。
2)变量必须有明确的类型。并且给变量赋值的时候类型要匹配,不能指鹿为马。
3)变量必须声明,并初始化以后才能使用。
4)同一个作用域内变量不能重复定义。
5)变量命名可以由字母,数字,下划线(_),美元符($)组成。但是不能以数字开头。
10、标识符
在java中用于给类、变量、方法命名的名称,称为标识符
类名:首字母大写,驼峰命名,尽量使用名词
变量名:首字母小写,驼峰命名,尽量使用名词
方法名:首字母小写,驼峰命名,尽量使用动词
标识符的规则
1、标识符由字母、数字、下划线、美元符号组成,长度不受限制
2、首字母不能是数字
3、不能是java的关键字
4、不能是null false true,尽管不是关键字
50关键字:
java50个关键字.png
11、变量的作用域
每个变量都有自己的一个作用域,只有在作用域内才有用,就跟我们很多东西有有效期一样,身份证,驾照的作用域也不一样。同样变量也有他的一个作用域。
变量的作用域是从声明的地方开始,到块结束为止。
11、二进制,十进制,八进制,十六进制
十进制是我们最常用的进制方式,从幼儿园就接触了哈,他是逢十进一。十是他们的基数。
而我们计算机里面呢,最终使用的都是二进制的内容。二进制缝2进1,基数是2。
例如 135 是十进制的
1 * 10^2 + 3 * 10^1 + 5 * 10^0=135
二进制数
10000111 为二进制
十进制转二进制采用"除2倒取余"的方式。
十进制转八进制采用“除八倒取余”的方式。
二进制转八进制采用“取三合一法”
二级制转十六进制采用“取四合一法”
12、二进制的原码,反码,补码
原码:第一位放符号位,0表述正数,1表示负数。
存在问题:计算机运算特别麻烦,比如+1和-1相加,应该等于0,但是计算机计算为0001+1001=1010(-2) 。同时还存在+0,-0这样的情况。
反码:为了解决正负相加为0的问题,人们在原码的问题上提出了反码的概念。
反码即符号位不变,负数的其他位置取反。
正数的反码与原码相同。
这样就解决了正负相加为0的问题。
依然存在的问题:存在正负两个0的情况。
在原来反码的基础上+1,便生成了补码。这样便解决了正负0的问题。
正数的原码,反码,补码是一致的。
14、运算符
运算符优先级java.png口诀:
单目乘除为关系,逻辑三目后赋值。
单目:单目运算符!(逻辑非运算符)~(按位取反运算符) ++ -- +(正) –(负数) 等
乘除:算数单目运算符* / % + -
为:位移单目运算符<< >>
关系:关系单目运算符> < >= <= == !=
逻辑:逻辑单目运算符&& || & | ^
三目:三目运算符A > B ? X : Y
后:无意义,仅仅为了凑字数
赋值:赋值 = += -= *= /= %=
15、算数运算
/**
* 描述:
* 1、java中整数默认是int类型,小数默认是double类型。
* 2、自动类型转换,小的可以转换成大的,大的不能转换成小的。
* 3、大的转小的必须强制类型转换,精度会丢失
* 4、是否存在1+1<2这种情况?
* @author xupeng
* @create 2018-12-19 0:17
*/
public class DefaultTypeAndTypeCast {
public static void main(String[] args) {
// java整数 默认是 int 类型,小数 默认是 double 类型
byte x = 2 ; // ok
byte y = 3 ; // ok
/**
* 因为 a 和 b 都是 变量。编译器虽然可以确定 a 和 b 两个变量的值,都是byte的取值范围,
* 但是由于他们是变量,变量相加的值,编译器在编译器期间是无从得知的,
* 也就是说,到底会不会超过byte的取值范围,编译器是不确定的 ;因此,报错 ;
*/
// byte z = x + y ; // error
/**
* 3 + 5 OK 的原因是:编译器是认识常量值的,知道 3 + 5 = 8 ;还没有超过byte的取值范围 ;
* 同样的道理,编译器发现了 125 + 5 = 130 ;超过了byte的取值范围了,因此,报错 ;
*/
byte x1 = 3 + 5 ; // ok
// byte y1 = 125 + 5 ; // error
byte x2 = (byte) (127 + 5); // ok
System.out.println(x2); // output : -124
// 此处可以放到运算符处讲解
byte x3 = 8 ;
// x3 = x3 + 10 ; //error
// += 操作符,会默认帮我们进行强转 ;
x3 += 10 ; // ok
//同理
float f=1.0f;
// float f2=f+1.0;
}
/**
* 描述:
* 算数运算符
* 1、浮点类型数学运算的精度问题,不准确,得用BigDecimal
* 2、整形相除会得到整形,默认向下取整
* * / % ++,--
* @author xupeng
* @create 2018-12-19 21:18
*/
public class Math {
public static void main(String[] args) {
System.out.println(0.05+0.01);
System.out.println(1.0-0.42);
System.out.println(4.015*100);
System.out.println(123.3/100);
//解决方式
BigDecimal b1=new BigDecimal("0.05");
BigDecimal b2=new BigDecimal("0.01");
double v = b1.add(b2).doubleValue();
System.out.println("BigDecimal计算结果:0.05+0.01="+v);
//默认为向下取整
System.out.println(5/2);
//向上取整咋整?
System.out.println(java.lang.Math.ceil(5.0/2));
//计算个位十位百位
int num=520;
//个位
int unit=num%10;
//十位
int tens=num/10%10;
//百位
int hundred=num/100;
System.out.println("百位:"+hundred+",十位"+tens+",个位:"+unit);
//
int i=0;
//后++,先运算,语句完后再++
int i2=i++;
System.out.println("i++后i="+i);
//先++ 先自增在运算
int i3=++i;
System.out.println("i2="+i2+",i3="+i3);
//一个奇怪的问题
int j=0;
j=j++;
System.out.println("j="+j);
}
16、位运算
位运算都是对补码进行操作
左移( << )、右移( >> ) 、无符号右移( >>> ) 、位与( & ) 、位或( | )、位非( ~ )、位异或( ^ )
1)<<左移位是二进制补码向左移动,移动多少位在低位补多少个0;
2)>>右移位是二进制的补码向右移位,向右移动多少位,则在左边添加多少个符号位(如果负数则1正数则0)。
3)>>> 为无符号右移 。补码右移,高位补0;
4)& 位与:两个都是1则为1,否则为0;
5)| 位或:两个有一个为1则为1,否则为0;
6)~ 位非:补码取反,包括符号位。
7)^ 异或:两个数相同位如果相同则为0,不同则为1;
/**
* 描述:
* 位运算
* 1)<<左移位是二进制补码向左移动,移动多少位在低位补多少个0; 左移一位相当于乘以2
2)>>右移位是二进制的补码向右移位,向右移动多少位,则在左边添加多少个符号位(如果负数则1正数则0)。
右移一位相当于除以2。
3)>>> 为无符号右移 。补码右移,高位补0;
4)& 位与:两个都是1则为1,否则为0;
5)| 位或:两个有一个为1则为1,否则为0;
6)~ 位非:补码取反,包括符号位。
7)^ 异或:两个数相同位如果相同则为0,不同则为1;
按位异或可以不使用临时变量完成两个值的交换,也可以使某个整型数的特定位的值翻转。
*
* @author xupeng
* @create 2018-12-19 22:29
*/
public class ShiftOperator {
public static void main(String[] args) {
// 1、左移( << )
// 0000 0000 0000 0000 0000 0000 0000 0101 然后左移2位后,低位补0://
// 0000 0000 0000 0000 0000 0000 0001 0100 换算成10进制为20
System.out.println(5 << 2);// 运行结果是20
// 2、右移( >> ) 高位补符号位
// 0000 0000 0000 0000 0000 0000 0000 0101 然后右移2位,高位补0:
// 0000 0000 0000 0000 0000 0000 0000 0001
System.out.println(5 >> 2);// 运行结果是1
// 3、无符号右移( >>> ) 高位补0
// 例如 -5换算成二进制后为:0101 取反加1为1011
// 1111 1111 1111 1111 1111 1111 1111 1011
// 我们分别对5进行右移3位、 -5进行右移3位和无符号右移3位:
System.out.println(5 >> 3);// 结果是0
System.out.println(-5 >> 3);// 结果是-1
System.out.println(-5 >>> 3);// 结果是536870911
// 4、位与( & )
// 位与:第一个操作数的的第n位于第二个操作数的第n位如果都是1,那么结果的第n为也为1,否则为0
System.out.println(5 & 3);// 结果为1
System.out.println(4 & 1);// 结果为0
// 5、位或( | )
// 第一个操作数的的第n位于第二个操作数的第n位 只要有一个是1,那么结果的第n为也为1,否则为0
System.out.println(5 | 3);// 结果为7
// 6、位异或( ^ )
// 第一个操作数的的第n位于第二个操作数的第n位 相反,那么结果的第n为也为1,否则为0
System.out.println(5 ^ 3);//结果为6
// 7、位非( ~ )
// 操作数的第n位为1,那么结果的第n位为0,反之。
System.out.println(~5);// 结果为-6
//实际应用
//1、两个变量值的交换
int x=11;
int y=20;
x=x^y;
y=y^x;
x=x^y;
System.out.println("x="+x+",y="+y);
//2.判断为奇数还是偶数 &1 结果为1则为奇数,为0则为偶数
System.out.println((11&1)); //偶数
//3. 计算8/2 高效的方式
System.out.println("8/2="+(8>>1));
}
17、逻辑运算
/**
* 描述:
* 逻辑运算和比较运算符
* & | && ||
区别 && || 会造成短路。而& |不会。且& | 可以做位运算。
* @author xupeng
* @create 2018-12-19 23:10
*/
public class LogicOperation {
/**
* 程序员的逻辑:老婆说你下班回家买两个西瓜回来,如果看到有柚子就买一个。
* 结果:买了一个柚子。
*/
public static void main(String[] args) {
int sex='女';
int height=170;
if(sex=='女' & height>=170){
System.out.println("喂,秋香姐吗");
}else{
System.out.println("我如花啊");
}
//短路效果
System.out.println(sex=='女'&&height>170);
System.out.println(sex=='男'&&height++>170);
System.out.println(height);
//三目运算
System.out.println(sex=='女'&&height>170?"喂,秋香姐吗?":"我如花啊");
}
}