Java基础语法

回顾:

  1. java特点 跨平台,自动垃圾回收,面向对象,安全性,开放性。
  2. jvm,jre,jdk  jvm:java虚拟机,jre java运行时环境,jdk:开发工具包,里面包含了jre
  3. 设置环境变量 path---可执行文件的路径,classpath---jar包lib:为了寻找class文件,为了使用jdk自带的lib下面常用的类
  4. 编写一段java程序,java程序都是从main方法开始运行。
  5. 如何编译和运行 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);