SUM公司1995年弄出来的,现在被甲骨文公司收购
最初想应用于家电中,后失败入互联网web
前端后台
TIOBE编程语言排行榜
编程语言的开发效率,运行效率
Java在web开发现在霸主
Java SE 桌面(现在一般不用)
java EE 企业
###Java在各领域的应用
企业级应用:
Android平台应用:
大数据平台的开发:
Java是大数据学习的基石
我是学习大数据
面向对象
类、对象;封装、继承、多态
健将性
吸收C/C++ 去难;相对安全的内存管理访问机制
跨平台性
可在不同系统运行;原理
JVM ((Java Virtal Machine)与垃圾回收机制(Gatbage Collection)
jvm<jre<jdk
JDK = JRE + Java的开发工具(javac.exe,java.exe,javadoc.exe)
JRE = JVM + Java核心类库
配置环境变量后才能使用javac java
希望在任何文件路径下都可以去执行Java的开发工具
建JAVA_HOME = bin
的上一层目录(Java开发工具)
path = %JAVA_HOME%\bin
盘符: d: 切换到d盘*(大小写都可 )*
以下都是跟绝对路径或者相对路径
cd 切换当前位置
dir 列出文件清单
md 创建文件
del 删除文件
rd 删目录,保证目录是空的
Hello Word!
用文本文档写,需要显示后缀,自行网上搜索设置
public class HelloWord{ //声明了一个公共的类**公共类要与源文件名一样** public static void main(String args[]){ System.out.println("Hello Word!"); //输出Hello Word! } }
public static void main(string args[])
通过JVM(Jvaa Virtual MAchine-Java虚拟机)编译Java后缀名的文件时,JVM首先寻找入口(main方法)
在入口时,未调用任何对象,该方法只能设置为static静态
JVM为Java的最底层,所以即使有返回结果,结果也无处可去,因此该方法必然是void无返回值
由于main方法是入口,被JVM自动调用,只有将该方法设置为public公有级别才能对JVM可见
单行和多行注释的作用:
1、对所写的程序进行解释说明,增强可读性,方便你我他
2、调试所写的代码
特点:单行注释和多行注释,注释了的内容不参与编译(编译后生成的.class文件中不包含注释掉的信息)
/**
内容
@author 指定Java程序的作者
@version 指定源文件的版本
……等等
*/
注释内容可以被JDK提供的工具javadoc所解析,生成一套一网页文件形式体现的该程序的说明文档
正确的注释和注释风格
正确使用文档注释来注释整个类或整个方法
如果注释方法中的某一个步骤,使用单行或多行注释
*正确的缩进和空白
使用一次tab操作,实现缩进
运算符两边习惯性各加一个空格
*块的风格
Java API源代码选择了行尾风格(还有次行风格)[大括号位置]
快速输入System.out.println
输入“syso"或者”sysout",然后使用快捷键"ALT+/",快速输出System.out.println。
二、如何调试
设置断点
注意:可以设置多个断点
debug as java application
常用操作
操作 作用
step into 跳入(f5) 进入当前行所调用的方法中
step over 跳过(f6) 执行完当前行的语句,进入下一行
step return 跳回(f7) 执行完当前行所在的方法,进入下一行
drop to frame 回到当前行所在方法的第一行
resume 恢复 执行完当前行所在断点的所有代码,进入
下一个断点,如果没有就结束
Terminate 终止 停止JVM, 后面的程序不会再执行
关键字(keyword)的定义和特点
定义:被Java语言赋予特殊含义,用做专门用途的字符串(单词)
*特点:关键字中所有字母都为小写
保留字(reserved word)
*Java保留字:现有Java版本尚未使用,但以后版本可能会作为关键字使用。自己命名时要避免使用这些保留字。[eg:goto、const]
标识符:
Java对各类变量、方法和类等要素命名时使用的字符序列称为标识符
*凡是自己可以起名字的地方都叫标识符
定义合法标识符规则:
由26个英文字母大小写、数字、_(下划线)、$(美元符)开头
数字不可以开头
不可以使用关键字和保留字,但能包含关键字和保留字
Java中严格区分大小写,长度无限制
标识符不能包含空格
标识符命名规范(规范有时候往往比规则更重要):
包名:多单词组成是所有字母都小写:xxxyyyzzz
类名、接口名:多单词组成时,所有单子的首字母大写:XxxYyyZzz
变量名、方法名:多单词组成时,第一个单词首字母小写,第二个单词开始每个单词首字母大写:xxxYyyZzz
常量名:所有字母都大写,多单词时每个单词用下划线连接
注意:
1、在起名时,为了提高阅读性、要尽量有意义,”见名知意“
2、Java采用Unicode字符集,因此标识符也可以使用汉字声明,但不建议使用
不规范会出现黄色报错提醒,但不影响编译
内存中的一个存储区域
该区域的数据可以在同一类型范围内不断变化
变量是程序中最基本的存储单元,包含 变量类型、变量名和存储的值
用于内存中保存数据
Java中每个变量必须先声明,后使用
使用变量名来访问这块区域的数据
变量的作用域,其定义所在的一对{}内
同一个作用域内,不能定义重名的变量
成员变量、局部变量
Java对大小写敏感,强类型,不敏感的称为弱类型
1、Java定义变量的格式:数据类型 变量名 = 变量值;
也可以后面赋值,先声明变量再赋值
2、说明:
One、必须先声明再赋值,否则编译会报错;声明后未赋值在系统中是一个随机数
Two、变量都定义在其作用域内,在作用域内它是有效,出了作用域就失效了 不能在同一作用域内定义同名的的变量名,否则电脑会傻傻的分不清
成员变量&局部变量
Java有八种基本数据类型,对每一种数据都定义了明确的具体数据类型(强类型语言),在内存分类中分配了不同大小的内存空间。
Java中各数据类型有固定的表示范围和字段长度,不受具体OS的影响,以保证Java程序的可移植性
Java的整型默认为int型,声明long型变量须后加小写的‘l`或大写的‘L’,大转小强制转(不加默认为int,数据超过了int会报错 )
Java的浮点型型默认为double型,声明float型变量后加小写的‘f’或‘F’,不加f或F会自动转换为double类型,小转大自动转
Java程序中变量通常声明为int,除非不足以表示的比较大的数才使用long
八种基本数据类型 | 所占二进制位bit | 所占字节 | 取值范围(有的接近) | 例子 |
---|---|---|---|---|
byte(位) | 8 | 1 | -128~127 (-27 ~27-1) | byte a = 111; |
short(短整型) | 16 | 2 | -215~215-1 | short a = 1111; |
int(整型) | 32 | 4 | -231~231-1 | int a = 1111111; |
long(长整型) | 64 | 8 | -263~263-1 | long a = 1111111L; |
float(单精度) | 32 | 4 | -3.4E38(3.4x1038)~3.4E38(3.4x1038) | folat a = 1.1111F; |
double(双精度) | 64 | 8 | -1.7E308(1.7x10308)~1.7E308(1.7x10308) | double a = 1.111111111; |
char(字节) | 16 | 2 | 0~216任意字符 | char a = ‘b’; |
boolean(布尔值) | 8 | 1 | true,false | boolean a = true; |
bit:计算机中的最小存储单位,byte计算机中基本存储单元 |
---|
有没有发现int和float,long和double都占同样的字节,为何float比long都还大,差距怎么这么大呢? |
生而为人,我很抱歉 |
因为同样的字节,同样的位数,但在内存中的表示的方式不一样,就形成了巨大的差距 |
第一位都是符号位,整型对机器而言都是整数的最自然大小,但浮点数后面表示指数,最后面表示小数 |
详细答案请咨询搜索哦 |
char型数据用来表示通常意义上“字符”(2字节)
Java中的所有字符都只用Unicode编码,故一个字符可以存储一个字母、一个汉字,或其它书面语的一个字符(因为使用的Unicode编码,Java的变量可以用汉字表示哦,但不建议这样,也可以直接使用Unicode的值来表示字符常量 eg:
char a = ‘/u0043’; 出了Unicode还有很多编码,可以了解,很多时候乱码就是因为编码的原因)
''转义字符 char a = ‘\n’;
\n | 换行 | \t | 水平制表符 | 想输出’\n" | \n(多加一个\斜杠)[想输出双引号也一样] |
---|
char可以计算
只能取两个值:true、flase(C语言中用0、1表示)
结论:当容量小的数据类型的变量与容量大的数据类型的变量做运算时,结果自动提升为容量大的数据类型 (表示数的容量大小,而不是占用内存空间的大小)
小给它没毛病,大给小怎么装的小呢,数据溢出
byte,char,short–>int–>long–>float–>double
byte,char,short三种类型做运算是不能相互转换,,同类型做运算,结果都是int型
那是为什么呢?铁铁 (那是因为java运算中,在涉及到数据类型范围小于int的(如byte,char,short)时,数据类型会自动提升为int类型,比如,两个byte类型的数据在进行运算时,运算结果就会变成int类型,如果要结果是byte类型的话,就要强转成byte类型,这是因为java编译器内部对其进行处理。)
就是想把容量大的强制赋给容量小的?
自动类型提升的逆运算
1、需要强制转换符:()
2、强制类型转换,可能导致精度损失
举个特例吧:
int a = 128 byte b = (byte)a; System.out.print(b); //为什么强制转换输出的是-127
要深入到到二进制来解释了:取模运算
符号位变了,数据溢出最高位发生了改变,最高位0和1表示正负
后面进制转换会说明
String类型变量的使用
1、String属于引用数据类型
2、声明String类型变量时,使用一对""
3、String可以和八种基本数据类型做计算,但只能使用连接符,运算结果仍然是String类型
"byte,char,short–>int–>long–>float–>double"自动转换后面不能补String
那怎么运算回去,后面会讲到包装类Integer.parseInt();转换回去
public class Practie { public static void main(String[] args) { String s1 = "abc"; //长度没理由限制 String s2 = ""; char s3 = 'a'; //只能放一个字符 int number = 10001; String numberStr = "学号:"; String info = numberStr + number; //连接运算 System.out.println(info); // String str1 = 123; 错误的 String str2 = "" +123; System.out.println(str2); } }
关于进制
所有数字在计算机底层都以二进制形式存在
对于整数有四种表示方式
二进制(binary):01,满二进一,以0b或0B开头
十进制(decimal):0~9,满十进一
八进制(工程他了):0~7,满八进一,以数字0开头表示
十六进制(hex):0~9 及 A ~F,满十六进一,以0x或0X开头表示,此处的A ~F不区分大小写
二进制、八进制和十六进制表示开头都是数字0,不是字母o
进制间的相互转换:
十进制二进制的相互转换
二进制与八进制和十六进制的转换
十进制到八进制或十六进制,通过二进制为中间的桥梁转换
二进制如何表示负数呢
最高位为符号位,最高位为0表示整数,最高位为1为负数
计算机底层以二进制补码的形式保存所有的整数
正数的原码、反码、补码都是一样的
**负数的原码、反码、补码不一样
负数的补码是其反码+1
eg:
-14的原码:10001110
-14的反码:11110001 除符号位外,各位取反
-14的补码:11110010 反码+1,逢二进一
(可以相互间推)
int型128转byte型是-127的原因
int型:128 二进制表示 000000000 00000000 000000000 10000000
转换为byte型后去掉前面的三个字节,24位后就剩:1000000本来1是一个数,现在变为了符号位,就为byte最小的-128了
运算符是一种特殊的符号,用以表示数据的运算、赋值和比较等。
算术运算符
赋值运算符
比较运算符(关系运算符)
逻辑运算符
位运算符(开发中较少用)
三元运算符
运算符 | 运算 | 范例 | 结果 |
---|---|---|---|
+ | 正号 | +1 | 1 |
- | 符号 | a=4;-a | -4 |
+ | 加 | 6+6+6 | 18 |
- | 减 | 6-6 | 0 |
* | 乘 | 6*6 | 36 |
/ | 除 | 6/6 | 1 |
% | 取模(取余) | 7%3 | 1 |
a++ | 先取值后运算,加加在后,后加先用 | a=0;a++ | 0 |
++b | 先运算后取值,加加在前,先加后用 | b=0;++b | 1 |
a– | 先取值后运算,减减在后,后减先用 | a=1;a- - | 1 |
–b | 先运算后取值,减减在前,先减后用 | b=1;- -b | 0 |
+ | 字符连接符 | “Hello”+“Wortd!” | HelloWord! |
符号:=
当“=”两侧数据类型不一致时,可以使用自动类型转换或使用强制类型转换原则进行处理
支持连续赋值:
扩展赋值运算符:+=、-=、*=、/=、%=
结论:扩展赋值运算符运算后不会改变变量本身的数据类型
public class haha{ public static void main(String []args){ int i2,i3; int i1 = i2 = i3 = 666; //连续赋值 int num1 = 10; num1 += 10; //相当于num1 = num1 + 10;(其它几种也类似) int num2 =10; num2 *= 10; //相当于num2 = num2 * 10; short num3 = 10; //num3 = num3 + 3; //会编译报错 //编译会报错,因为byte、char、short做运算,结果是int型,num3是short型 num3 = (short)(num3 + 3); //需要强制类型转换,也可以用下面这种写法 num3 += 3; //这种写法不会改变变量本身的数据类型,编译不会报错 //开发中,如果希望变量实现+2的操作有几种方法?(前提int num = 10;) //1、num = num + 2; //2、num += 2; //没有3: num++++是错的,(num++)++也是错的 //开发中,如果希望变量实现+1的操作有几种方法?(前提int num = 10;) //1、num = num + 1; //2、num +=1; //3、num++; //第二种和第三种都推荐,第三种注意++的前后,不过第三种代码量更少 } }
运算符 | 运算 | 范例 | 结果 |
---|---|---|---|
== | 想等于 | 4 == 3 | false |
!= | 不等于 | 4 != 3 | true |
< | 小于 | 4 < 3 | false |
> | 大于 | 4 > 3 | true |
<= | 小于等于 | 4 <= 3 | false |
>= | 大于等于 | 4 >= 3 | true |
instanceof | 检查是否是类的对象 | “Hello” instanceof String | ture |
比较运算符的结果都是boolean型,也就是false和true
比较运算符“==”不能写成“=”
public class Day1 { public static void main(String []args) { System.out.println(4 < 3); //输出结果为false System.out.println(4 > 3); //输出结果为ture } }
eg:
通常循环次数确定时使用
通常循环次数不确定时使用