Java基础语法
回顾:
- java特点 跨平台,自动垃圾回收,面向对象,安全性,开放性。
- jvm,jre,jdk jvm:java虚拟机,jre java运行时环境,jdk:开发工具包,里面包含了jre
- 设置环境变量 path---可执行文件的路径,classpath---jar包lib:为了寻找class文件,为了使用jdk自带的lib下面常用的类
- 编写一段java程序,java程序都是从main方法开始运行。
- 如何编译和运行 Hello.java javac.exe Hello.java java.exe Hello
1. 关键字
被编程语言赋予特定含义的单词叫做关键字。
关键字都是小写。
关键字:
用于定义数据类型的关键字 | |||||||
class | interface | byte | short | int | |||
long | float | double | char | boolean | |||
void |
|
|
|
| |||
用于定义数据类型值的关键字 | |||||||
true | false | null |
|
| |||
用于定义流程控制的关键字 | |||||||
if | else | switch | case | default | |||
while | do | for | break | continue | |||
return |
|
|
|
| |||
|
|
|
|
| |||
用于定义访问权限修饰符的关键字 | |||||||
private | protected | public |
|
| |||
用于定义类,函数,变量修饰符的关键字 | |||||||
abstract | final | static | synchronized |
| |||
用于定义类与类之间关系的关键字 | |||||||
extends | implements |
|
|
| |||
用于定义建立实例及引用实例,判断实例的关键字 | |||||||
new | this | super | instanceof |
| |||
用于异常处理的关键字 | |||||||
try | catch | finally | throw | throws | |||
用于包的关键字 | |||||||
package | import |
|
|
| |||
其他修饰符关键字 | |||||||
native | strictfp | transient | volatile | assert |
2. 注释
注释就是对代码的解释。给开发人员阅读的。
单行注释// ctrl+/
多行/*
*/
快捷键ctrl+shift+/
反注释ctrl+shift+\
javadoc注释/** */里面的注释将在生成文当时候出现
javadoc注释只能在类和方法上
javadoc命令可以抽取注释生成html文件
javadoc命令格式:
javadoc –d (生成到什么文件夹) ( 把谁生成doc文档)
例如:javadoc -d d:/doc HelloWorld.java 将doc文档生成到doc目录下。
Index.html
3.包(package import)
定义:按照某种逻辑将很多的类进行隔离。
更好的定位类,把相同功能的类分到一个包下面。是为了防止类同名而引入的一种机制。类似于文件夹。
注意包名不能用java,一般情况下会采用公司的简称,包名一定要小写。因为jdk里面已经有java包。可以观察下jdk文档下面包的基本结构。
使用包的规则:
(1)package语句必须作为Java文件的第一句非注释语句,放在Java文件的第一行。
(2)一个Java文件只能指定到一个包下,该文件中可以有多个类,但是只能有一个public类。
(3)同一个包中的类可以直接访问。
不同包下的类的访问时,要引入包,引入规则是:import 父包名.子包名.类名;
包名一定要小写,一般情况下包名会采用你工作单位或者所读学校组织的名字简写。
4.jar命令
jar一般情况下用来压缩class文件。目的:1.保护代码 2。方便调用
jar打包 jar cvf jiami.jar HelloWorld.class将helloworld程序打包
如果一个目录下打包:jar cvf classes.jar com
Com是指某个包含class文件的目录。
如果将jar包做成可以运行的jar包,要求生成清单文件并修改manifest.mf:
Manifest-Version: 1.0
Main-Class: ui.JFrameMain
Class-Path: jtds-1.2.jar c3p0-0.9.1.2.jar
esri_mo20.jar esri_mo20res.jar jsde83_sdk.jar解释一下:
Manifest-Version mf文件版本号,这行照抄
Main-Class 包含main函数的类,程序的入口
Class-Path 用到的一些包
注意:每行的“:”(冒号)用来分隔键值对。冒号后边一定要跟一个空格!!!
依赖的jar包之间也用空格分隔。
5.标示符(标识符)
标识符:就是给类,接口,方法,变量等起名字时使用的字符序列
组成规则:字母、数字、下划线、货币符号$,数字不能写在开头。
注意:标示符规范应做到望文生义,变量和类的起名准则是变量第一个字母小写,类名第一个字母大写。
当然也要注意缩写,名字太长不适合做变量,影响开发效率。如大学生英语成绩。
关键字不能用于标示符class public static void package import
不能以数字开头。
类名首字母大写,如果类名有多个单词构成,每个单词首字母大写。
如果是变量,首字母小写,如果变量有多个单词构成,首字母小写,后面的单词首字母大写。
如果是常量,全部字母都大写。如果有多个单词构成,单词之间用_(下划线)隔开。
6.变量与字面值
变量定义:
类型(8种基本类型或者对象类型) 变量名称(标示符)=赋值
int a=0;
变量分为局部变量和属性(成员变量),其中局部变量一定要先初始化才能使用。
局部变量就是写在方法里面的变量。
成员变量就是写在类里面但是在方法之外。
变量基本类型:
基本数据类型8种和对象类型
整数类型:(byte,short,int,long)
byte字节类型--1,short短整型—2byte,int整型--4,long--8长整型
1byte=8bit 0,1 -128-127
扩展知识点:字节是衡量IO流量的基本单位,常用衡量单位有:1KB=1024B,1MB=1024KB,1GB=1024MB
1TB=1024GB
1PB=1024TB1EB=1024PB
1ZB=1024EB1YB=1024ZB
1DB=1024YB
1NB=1024DB
小常识:1.平时买的U盘使用的容量总比实际说的小。因为u盘是1000进的。
2.10M网速为何真实带宽差的太多。10mbit ps=10*1024*1024/8=1.31Mbyte/s
浮点数类型:float--4,单精度double—8 双精度
float f=1.3f; double d=1.3;
计算过程中可能会出现精度丢失,因为某些小数无法用二进制准确表示导致的。
1.1--------------------à
1-------à1
0.1--------à00001100110011……
注意浮点数计算精度丢失问题,分析原因是因为计算机使用二进制进行计算的,有些小数无法用有限的二进制为表示,出现无限循环,导致最终运算精度丢失,
可以用Java api里面的BigDecimal做处理
处理方式:double a=2.0;
double b=1.1;
System.out.println(BigDecimal.valueOf(a).subtract(BigDecimal.valueOf(b)).doubleValue());
字符类型:
定义:一个文字就是一个字符。
C语言一个字符几个字节? 1个byte Ascii
Java语言的一个字符由2个byte
char 一个文字 char c=’A’ char c=’烟’ char c=’’ 一个字符有几个字节组成?
韩语(你好):여보세요 왜 쓰다
日语:こんにちは
Unicode编码 万国码
Char c=65;
char c='\u4f60';
Unicode写法是:’\u’+十六进制组成的几位数字
如果用命令方式可以把本地的文字转成unicode形式:
C:\Users\chidianwei>native2ascii
你好
\u4f60\u597d
A
A
布尔类型:true,false
boolean b=true;
对象类型:除了8种基本类型之外的
类就是类型,是抽象的。
以类作为模板,形成具体的对象。
Class Student{
Main
Sum(int a,int b)
} //定义类
如何使用一个类创建一个对象?
HelloOracle h=new HelloOracle();
int c=h.sum(1, 1);
System.out.println(c);
类型转换(类型提升和强制转换)
1.类型变量赋值:
原则是等号左右两边类型要相同或者兼容。不然编译器报错。
比如float a=0.9;报错,原因java认为小数都是double型,但是却赋给了float。
允许一个范围小的类型赋值给一个范围大的类型。
2.自动类型提升:
-两个变量进行运算或者一个变量赋值给另一个变量,都可能产生类型提升。就强原则。
byte b=2;
int c=b+2;//两个变量进行运算最后的结果类型遵循就强原则
byte b1=6;
int d=b1+b;//两个byte类型进行运算得到的是int型
double d1=2.8;
double d2=d1/8+35;
System.out.println(d2);//运算的时候遵循就强原则
System.out.println(5/2);//两种相同类型运算得到的还是这个类型
3.强制类型转换:
但有可能导致运行时候报错。
int a=(int)1.5; a=1;导致数据精度丢失
Char a=(char)3.5 编译不会报错,但是根本不兼容,所以运行报错。
byte b=1;
b=(byte)(b+2);//强制类型转化就是在值得前面加上一对括号,括号里面写要转成什么类型,右边的不一定
//是一个具体值,也可以能是一个式子,需要打一对括号
int a=90;
char c=(char)(a+12);
//注意,并不是所有的强制类型转化都是合理的,有些地方大家不要落入陷阱
byte b2=(byte)9.8;
思考一个问题?
byte问b的值是多少? -126
局部变量定义和使用
局部变量就是定义在方法里面的变量。作用范围就是方法体。
注意:同一个作用域范围内的局部变量不能重名。
局部变量作用范围有两个:类方法中,方法里面的{}体中。出了大括号就失效。
局部变量如何使用?
1先定义后使用。
2先赋值,后使用。
3局部变量不能重命名。
局部变量的作用域其实就是最靠近它的那对大括号,出了大括号这个区域,变量失效。
7.表达式与运算符
赋值表达式 :
比如a=0就是代表一个赋值表达式,整个式子的值是0
Int a=0 这个式子以后,a的值是0,整个表达式的值等于最终a的值。
Int a=9;
a=(a=19);
四则运算符
+ - * / %
//四则运算
int a=9;
int b=8;
System.out.println("a乘以b的值是:"+a*b);
System.out.println("a除以b的值是:"+a/b);
System.out.println("a除以b的的余数值是:"+a%b);
a=-9;
System.out.println("a除以b的的余数值是:"+a%b);
赋值表达式可以结合四则运算付:
int a=9;
int b=8;
a+=b;//a=a+b a-=b *=,/=,%=
System.out.println(a);
相等运算符:
== !=
计算结果只可能有两个值:true,false
int a=9;
int b=8;
System.out.println(a!=b);//true
System.out.println(a==b);//false
移位运算符:
前提知识点1:计算机进制
• Java针对整数常量提供了4种表现形式
• 二进制
• 八进制
• 十进制
• 十六进制
• 进制概述
进制:就是进位制,是人们规定的一种进位方法。 对于任何一种进制--X进制,就表示某一位置上的数运算时是逢X进一位。二进制就是逢二进一,八进制是逢八进一,十进制是逢十进一,十六进制是逢十六进一。 • 不同进制的数据组成
• 二进制
• 由0,1组成。以0b开头
• 八进制
• 由0,1,…7组成。以0开头
• 十进制
• 由0,1,…9组成。整数默认是十进制的
• 十六进制
由0,1,…9,a,b,c,d,e,f(大小写均可)。以0x开头
进制转换
二进制 0010---à十进制:0*2的0次方+1*2的1次方+0*2的2次方+。。。
十进制 9-----à二进制:
十进制和各种进制转换:
前提知识点2:原码,反码,补码• 有符号数据表示法
• 在计算机内,有符号数有3种表示法:原码、反码和补码。所有数据的运算都是采用补码进行的。
• 原码
• 就是二进制定点表示法,即最高位为符号位,“0”表示正,“1”表示负,其余位表示数值的大小。
• 反码
• 正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外。
• 补码
• 正数的补码与其原码相同;负数的补码是在其反码的末位加1。
左移运算:整数左移应该是先转为二进制,左边移动相应位数,右边补0,符号位不变。
-9>>2
-9的原码:10000000 00000000 00000000 00001001
-9的反码:11111111 11111111 11111111 11110110
-9的补码:11111111 11111111 11111111 11110111
右移两位:1111111111 11111111 11111111 111101
求回原码: 1.。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。11------ -3
左移运算:数值a向左移动n位,a<<n,得到的值是a*2的n次方。
右移运算:数值a向右移动n位,得到的值是a*2的-n次方。----直接取到小于商的最大整数
移位规则规定:
/*
右移:
如果是有符号右移,首先看正数还是负数,对正数右移,高位补0,符号位也就是最高位不变;对负数右移,
需要先把负数的补码表示出来,然后进行右移,高位补1,最高位不变,好了之后再进行求原码。
如果是无符号右移,正数跟有符号右移一样,负数需要先把补码表示出来,然后进行右移,高位补0,然后直接
计算十进制即可。
左移:对负数和整数进行左移都要保持最高位不变,右边都补0.因为右边不牵扯正负号问题。另外负数左移也需要先转补码。
*
*/
9<<2:1. 先求出9的二进制:
2. 对二进制求补码。
3. 移位运算,法则参考上面注释的描述。
难点:对负数求右移操作
//求一个负数的移位运算结果
int a=-9;
// a转为二进制,由于a为负数,所以最高位应该为1,1代表负号
// 原码 10000000 00000000 000000000 00001001
// 负数在计算机里面是以补码的方式保存的,原码需要变成补码,原码求补码,符号位不变
// 1,按照这个方式,补码为:11111111 11111111 11111111 11110111
// 右移2位 最后两位没有了,前面补两位1也就是负号。 11111111 1111111 11111111 11111101
// 10....................。11 结果就是-3
System.out.println(a>>2);
逻辑运算:
&&(逻辑与),||(逻辑或),!逻辑非(这三个运算符算出来的结果也只有两个值:false,true)
逻辑与:只要有一个为false,最后表达式结果false 乘法运算,false代表0,true代表1
逻辑或:有一个为true,最后结果true 加法运算:false代表0,true代表1
逻辑运算短路现象:当整个表达式的值已经确定时候,后面的表达式部分不参与运算。
int a=9;
int b=8;
System.out.println(9>0||((a=a+1)==13));//右边的式子不参与运算原因是左边为true,在
//逻辑或里面有一端为true,整个表达式就是true
System.out.println(a);//9
按位运算符
和逻辑运算相似,&代表与运算(乘法运算),|代表或运算(加法运算),^代表异或(相同为0,不同为1) ,~代表取相反。
按位与:&对0,1进行运算 有一个为0,最后按位与的结果就是0,相当于乘法
按位或:|,有一个为1,最后结果为1,相当于加法
按位非:~ 非0就是1,非1就是0
按位异或:^ 相同为0,不同为1
要进行位运算,首先要会转二进制:
整数转二进制,除以2取余数,最后一直算到被除数小于2为止。最后将余数倒着写出来即可。
int a=9;
int b=8;
System.out.println(a&b);//8
System.out.println(a|b);//9
System.out.println(~b);//7
System.out.println(a^b);//1
条件运算符:
a<b?值1:值2
表示a<b如果为真,整个表达式取值为值1,否则为假取到值2.
自增自减运算符:
i++ (自加运算符) 整个表达式的值不变,但是i的值加了个1,先求值,再运算
整个表达式的值不变,但是i的值减了个1,先赋值,再运算
整个表达式的值加1,i的值加了个1-----先运算,再赋值
整个表达式的值减1,i的值减了个1 -----先运算,再赋值
8.String字符串初探
属性+方法
+
构建字符串变量有两种方式:
1. String str=new String(“sssssssssssssss”);
2. String str=”ssssssssssssssssssss”
字符串如果要进行拼接:str=str+”anoter string”;
String类里面有哪些常用的功能?
1. 字符串长度str.length()
2. Str.charAt(i) I0开始的。
9.键盘输入
/*
让用户输入姓名,年龄,家庭住址,然后打印出个人具体信息
*/
Scanner scan=new Scanner(System.in);
System.out.println("input your name:");
String name=scan.next();
System.out.println("input your age:");
int age=scan.nextInt();
System.out.println("input your address:");
String address=scan.next();
//拼接字符串
String info="";
info=info+"学生姓名:"+name+",年龄:"+age+",地址:"+address;
System.out.println(info);