《java基础笔记》word版 本文关键词:基础,笔记,java,word
《java基础笔记》word版 本文简介:Javaday01=============================================================================================Java------------sun公司1995几个特点:简单,安全,跨平台,面向对象,分布,
《java基础笔记》word版 本文内容:
Java
day01
=============================================================================================
Java
------------
sun公司
1995
几个特点:简单,安全,跨平台,面向对象,分布,健壮,解析,高性能,多线程,动态性,体系结构中立
安全:允许用户使用指针,不允许操作指针
跨平台:
C++
:
源码
----(编译)---->目标码
-----(连接)---->可执行文件
目标码:二进制机器码
c++中的源码是跨平台的。c++中的指针其实是内存中的编号(地址)
一个字节
=
连续的8位二进制位。
1G
=
1024*1024*1024
JAVA:源码
----(编译)---->字节码
JAVA是字节码跨平台。
搭建Java开发环境:
JDK/JRE/JVM
什么是JDK:JAVA开发工具包(做JAVA开发是必须下载JDK)
什么是JRE:JAVA的运行环境(若只运行JAVA文件只要下JRE就可以了)
什么是JVM;JAVA虚拟机
JVM(java虚拟机)功能:用来屏蔽不同系统的差异,为上层的字节码提供统一的运行环境。
JDK下的bin目录:可执行文件(这些都是开发过程中所要用的命令。如javac,java)
JDK下的JRE目录:BIN目录,LIB目录。这里的BIN目录中放的是运行中用到的命令,
LIB目录中放的都是JAR文件,JAR文件中放的都是一写编译好的字节码。
打成JAR文件的目的:方便传输。
LIB目录下的rt.jar,改文件下放的是JAVA开发的类库
JDK下的SRC.ZIP包:放的是rt.jar包中的源码,而rt.jar中放的是对应的字节码。
----------------------------------------------------------------------
设置环境变量:
JAVA_HOME:代表JDK安装路径
=/opt/jdk1.6.0
d:/a/b/jdk1.6
CLASSPATH:系统搜索类的路径
=.
(指的是当前目录)
PATH:命令的搜索路径
=/opt/jdk1.6.0/bin
或
=$PATH:/opt/jdk1.6.0/bin
或
=$PATH:$JAVA_HOME/bi
$PATH:
在原先的PATH基础上加上其它路径/
--------------------------------------------------------------------------
第一个JAVA代码
第一步:
vi
MyFirstJava.java
第二步:
public
class
MyFirstJava{
-----------------
定义一个类
public
static
void
main(String[]
args){
------
主方法格式固定
String
name=“tangliang“;
----
定义一个变量为字符串,字符串值用双引号来引起
int
age=30;
------定义一个整数类型值为30
System.out.println(“my
name
is:“+name);
---
输出语句()里是要输出的内容
System.out.println(“my
age
is:“+age);
----
JAVA中加号也可以做字符串的链接
}
}
第三步:
javac
MyFirstJava.java
-----
编译源代码文件(跟源文件名)
第四步:
java
MyFirstJava
-----
执行字节码文件(跟的是类名)
通配符号编译:javac
my*.java
----------
编译以my字母开头的所有java文件
带包编译:javac
-d
.
PackageTest.java
带包执行:java
sd0807.day01.PackageTest
Public被称作为访问修饰符
----
作用是:控制程序的其他部分对该部分的访问级别
Class表面JAVA程序中的全部内容是包含在类中的。
注意点:
1.
一个JAVA源文件只能定义一个public类
2.
而且PUBLIC修饰的类名必须同文件名一致(大小写也要一直)
3.
可以定义其他非public类.
4.
字节码文件与类一一对应,而不是同你的源文件一一对应.
5.
可以运行的JAVA方法的文件,一定要包含一个主方法,而且主方法签名是固定的
6.
包含主方法的类叫主类,java命令后跟的是主类的名字
7.
main方法是程序的入口
包的定义(目的是确保类名的唯一性)
包用来放所写文件的目录.
怎么来声明一个包:
package
SD0807.day01;
---
包的定义(可以是0或1行,若声明则必须在java文件第一行)
++++++++++++++++++++++++++++++++++++++++++++++++
package
SD0807.day01;
public
class
PackgeTest{
public
static
void
main(String[]
args){
System.out.println(“Package
Test!“);
}
}
++++++++++++++++++++++++++++++++++++++++++++++++
带包编译:javac
-d
.
PackageTest.java
带包执行:java
sd0807.day01.PackageTest
若java
PackageTest
其实它将类找到了,只是它找到是带包的类,而命令里面是不带包的,所以会报错。
为什么执行带包的类要加路径名???(由于JAVA命令的执行步骤)
java命令的三个步骤:
1,找到类的字节码文件
2,加载类--从磁盘中去读取对应的类,到哪里去找就是从(classpath中配置的路径)
3,找主方法执行
若从网上下一写工具包必须在classpath中配置工具包所在的位置,这样我们就可以使用该工具包
想使用中间件,这样classpath必须指向对应的xxx.jar。
而在JDK中的rt.jar我们没有配置上,
却能用到里面对应的类,因为她自动会去找JRE/lib/rt.jar找。
rt.jar
//
放在
jdk1.6.0/jre/lib/rt.jar使用api
提供的类,java虚拟机是怎么找到的?
就在rt.jar
;里,即使不设到
CLASSPATH
下虚拟机也能运行;
++++++++++++++++++++++++++++++++++++++++++++++++++++++++
例子:
第一步:(写类)
ToolA类:
package
com.tarena;
public
class
ToolA{
public
static
void
main(String[]
args){
System.out.println(“ToolA“);
}
}
Test类:
package
com.tarena.day01;
public
class
Test{
public
static
void
main(String[]
args){
ToolA
t
=
new
ToolA();
System.out.println(“test“);
}
}
第二步:(编译)
javac
-d
.
ToolA.java
-----
可以编译(生成一个文件夹为com)
javac
-d
.
Test.java
-----直接编译Test.java会出错,因为用到了ToolA类
第三步:(把类ToolA打包)
jar
-cvf
abc.jar
./com
----------
ToolA类在包com.tarena
下
将产生的abc.jar包放到任意的目录下,这里放到aa目录。
第四步:配置ToolA类的
classpath=d:/aa/abc.jar
第五步:(编译Test类)
javac
-d
.
Test.java
-----
可以编译
第六步:(执行)
java
com.tarena.day01.Test
也可以执行ToolA类
java
com.tarena.ToolA
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
找对应类的顺序:
1,在当前包下找(所以注意不要在自己的包下创建和JDK中同名的类,这样在调用JDK
中同名的类回出错)
2,在rt.jar中找
3,在
classpath中指定的路径下找
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
如果自己在本包中定义了一个String类这样下面代码会出错:
public
class
Ab{
public
static
void
main(String[]
args){
System.out.println(“aaaaa“);
}
}
---------出现的错误是说主方法没找到。
因为main参数中的String类不是JDK中的String类所以上面的main方法不是主方法了,只能是
自己所定义的一个普通的类。所以该类在编译的时候不报错,在执行的时候就会出错。
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
java.lang包下的类,可以不需给出包明,其它的都要给出包名,由于java.long包下的类很常用。
---------------------------------------------------------------------------------------
类的导入
import:
可以多行。作用导入所要用到的类。
java.lang包下的类,可以不需要导入,其它的包中的类都必须导入。
怎么导入:
import
java.util.scanner;
------
导入scanner类
import
java.util.*;
----------
导入该包下所有的类
package
xxxxx;(0或1行)
import
xxxxxxx;
(0或多行);
class
xxxxx{}
(1个或多个但只有一个public
class)
静态导入:
不仅能导入类,还可以导入静态域。
两个实际用:
1,
对算术函数的导入
2,
笨拙的常量
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
常用命令:
Javac
------
编译命令
Java
------
运行命令
Javadoc
-----
生成程序文档,在java
源文件中提取文档注释,生成程序文档.
--------------------------------
文档注释
注释:
//
单行注释
(按住
ctrl+/
)就可以注释选中的程序)
/*/
多行注释
/**/
特殊的多行注释,定义在类之前,类的属性或方法之前,叫文档注释;
javadoc
MyFirstJava.java
–d
./docs
//将生成的html文件放到当前目录下的docs子目录下;
作用:生成JAVA文档.从你的程序代码中提取注释
/**/
后跟的是自由格式文本
在自由格式文本中可以使用HTML修饰符:
一定不要使用,,因为他们与文档格式发生冲突。
类的注释:
多行注释的时候很多程序员习惯每行以星号开头,不建议这样做。
方法的注释:
@param
----
参数,可以占据多行,可以用HTML标记
@return
----
返回
@throws
----
可能抛出的异常
域注释:
只需要对公有域(通常指的是静态常量)建立文档
/**
The
“hearts”card
sut/
Public
static
final
int
HEARTS=1;
通用注释
@author
name
----
作者
@version
text
----
版本
@since
text
-----
始于条目
@deprecatecd
text
-----------
对类,方法,变量添加一个不再使用的注释
如:@deprecated
UsesetVisible(true)instead
@see
reference
@see
The
Core
ava
home
page
Java
day02
--------------------------------------打包
jar
生成/修改
java
归档文件
(.jar),跟.zip
一样;
jar
–cvf
abc.jar(目标文件)
./abc
(把哪一个目录打包成jar文件)
-c
creat
创建新的jar文件
-v
visable
显示出来
-f
filename
指定文件名
-x
展开存档中的命名的(或所有的〕文件
jar
cvf
abc.jar
./abc
//
多了一个清单文件;manifest.info
jar
–xvf
abc.jar
//
展开jar文件的内容;
删除com/
目录结构
留下一个abc.jar
;
将环境变量的CLASSPATH
追加一个
/sd0705/corejava/abc.jar
就是将压缩文件展开后在根目录下找
.class
文件;
rt.jar
//
runtime
放在
jdk/jre/lib/rt.jar
CLASSPATH
使用api
提供的类,java虚拟机是怎么找到的?就在rt.jar
;里,即使不设到
CLASSPATH
下虚拟机也能运行;只要在这个目录下就能找到;
-------------------------------------------------
常用的包;
java.lang
java的语言包
java.awt/java.swing/java.awt.ent
图形开发是要用到的包
java.applet
开发小程序用的包
什么叫application(应用程序):就是包含主方法的程序。
另外的的程序是没包含主方法,必须放到容器里(如嵌入到浏览器里)去执行。
java.io
输入输出时要用到。
java.net
java中网络开发。
java.util
java工具包。
------------------------------
标识符
命名规则:
(1)
由字母、数字、下划线、$组成,不能以数字开头;
可以用中文;如:
string
中文=“abc“;
只能以字符、“_”或“$”开头;
字符可以是汉字;
(2)
大小写敏感;
(3)
不得使用java中的关键字和保留字;
(4)
Java语句以分号分隔,Java代码块包含在大括号内,忽略空格。标识符
(5)
无长度限制。
------------------------------------
命名习惯
(1)
标识符要符合语义信息
(2)
包名
所有字母小写
(3)
类名
每个单词首字母大写,其它小写
//TarenaStudent
(4)
变量和方法:
第一个单词小写,从第二个单词开始首字母大写
//tarenaStudent
(5)
常量:
所有字母大写,每个单词之间用“_
“连接
//int
MONEY_VALUE
=
50;
(6)
用以命名类、方法和变量、以及包遵守JAVA的命名规范,类以每个单词都以大写字母开头。
----------------------------------关键字
Abstract
continue
for
new
switch
assert
default
goto
package
synchronized
boolean
do
if
private
this
break
double
implements
protected
throw
by
e
else
import
public
throws
case
enmum
instanceof
return
transient
catch
extends
int
short
try
char
final
interface
static
等等
-----------------------------------
八种数据类型
1,布尔型:boolean
只有false/true两个值(不存在如C++的与整数相互转换)
2,字符类型:
char
2字节
16位
(0~65535)
默认就是无符号的16位整型;只能表示整数;
char类型也可以用通用转义字符,但是不能用ASCII码。可以用“/u0000”这种格式,
因为char型中使用的是unicode编码方式。/u0060
四位都是十六进制的;
赋值方式:
char
zhChar=
中
;
char
enChar=
a
;
char
ucChar=
/u0060
;
---
Unicode也是一种字符编码方法(其为16进制)
int
a
=0
char
b=
0
int
a
=0
char
b=
/u0000
相等
char
a
=
0
char
b=
/u0000
char
a
=
8
char
b
=
5
+
3
char
a
=
8
char
b
=
5
+3
相等
int
a
=8
char
b
=
5
+
3
int
a=8
char
b=
5
+3
字符0与整数0是不相等的,第五组相等。
/u0061
--------------表示为a
/u0041
--------------表示A
字符0的编码为:/u0048
3,字符串类型:
定义:String
name=“tangliang“;
--------
注意:赋值要有双引号
4,整数类型:
byte1字节8位
-128到127-2^7到2^7-1java中都是有符号的;没有有符号和无符号的差别;
内存中的存储:正整数:
原码
负整数:
补码=
原码取反+1;
25
原码:
00011001
补码:00011001
-25
先些25的原码:00011001
-->取反:11100110
--->补码:11100111
内存中8位二进制第八位:0表示正,1表示负
10000000表示的值为-128,过程:
10000000--(减1)-->01111111--取反-->10000000(2的7次方=128开始第一位为1
则表示负数即-128)
short
2字节
16位
-2^15到2^15-1
16位的短整型
-32768~+32767
(与char比较,char没有负则其范围0~65535,没有符号位,存储还是同样的)
int
4字节32位
-2^31到2^31-1
32位的整型(大概-2G到2G)
long
8字节64位
-2^63到2^63-1
64位的长整型;long
a=12343545L(l);
//一定要跟上L,大小写都可以,最好用大写;
以0x开头就是十六进制;
-------------
二进制与十六进制的转换4对1
以0开头的是八进制;
-------------
二进制与八进制的转换
byte
bb=(byte)0x771;
//
由于范围超出了直接赋值是不可以的但可以强制转换,
强转的规则:自动截断高位保留最低的8位;
5,浮点类型
(默认是double,而且是近似存储)
float
4字节32位
单精度实数;
2^24
X
10^127
;
前三个字节存数据,后一个字节存位权;
double
8字节64位
双精度实数;
java中小数默认是double型:
float
f
=
111.32;
-----
会出错,因为默认是double型
可以写的方式;
float
f
=(float)111.32;
float
f
=
111.32f;
-----
注意十六进制中f是个值,不是float类型。
float
fa
=123.4f;
----
后面要加上大写或小写的f
float
fa
=123.4E300F;
float
fa
=(float)123.4E300;
------
强转后赋值给float变量
double
d
=
333.5
double
dd
=
886.45d
double
dddd=
768.987D
注:整型值存放,正数存放原码(二进制码),负数则存放补码(原码按位取反末位加一)
注:浮点型是近似存储的,实型值在存储时会损失精度,所以不要直接比较两个实型值。
系统默认的实型都是double型,
要使用时要在数据后加个f,或者强行转换。强转(占字节数大的类型转到占字节数
小的类型)时会放弃高位值只取低位值。
类型转换
整数是精确存储
浮点类型是近似存储
6.枚举类型
JDK5以后可以自定义枚举类型:
enum
Size{SMALL,MEDIUM,LARGE,EXTRA_LARGE};
声明这样一种类型的变量:
Size
s
=Size,MEDIUM;
7.大数据类型
java.math.BigInteger
java.math.BigDecimal
这两个类可以处理任意长度的数值:
1,
BigInteger
实现任意精度的整数运算
2,
BigDecimal
实现任意精度的浮点数运算
可以用静态方法valueof()将普通的数值转换成大数值,但不可以用算术运算符来做处理
+++++++++++++++++++++++++++++++++++++++++++++
public
class
test
{
public
static
void
main(String[]
args){
double
a=2.0,b=1.1,c=0.9;
if(a-b==c){
System.out.println(“ok!“);
}else{
System.out.println(“不
ok!
“);
}
}
}
答案是:不“ok“;2.0-1.1=0.8999999….
//
是近似存储不是精确存储
取绝对值小于一个很小的数:
Math.abs((a-b)-c)
short
->
int
->
long
->
float
->
double
char
-----à
int
int
-----à
double(数据不会丢失)
int
-----à
float
(数据会丢失)
long
-----à
double(数据会丢失)
long
-----à
float
(数据会丢失)
其中:
char型和int型之间可以相互转换。char和short或byte不能相互转换。
char不能表示负数;
boolean类型是独立的,不能和其它类型相互转换;
反之则需要强行转换;
但是自动类型转换也会造成数据丢失:
如
int
->
float
long->
float
long
->
double
只是让位数上相等,但是会丢掉低位的数据;
比如:把浮点值赋给整型,就会发生截断(truncation)
注意:
隐式类型转换;(a或b有一个为int)
a
运算符
b
,如果a,b中有任意一个是double型,前面运算的结果就是double型,
如果a,b中有任意一个是float型,前面运算的结果就是float型,
如果a,b中有任意一个是long型,前面运算的结果就是long型,
如果a,b中没有double、float、long型,那么其结果就为int型。
java
数据类型:基本类型:
8种
引用类型:
类,接口,枚举,标注
空类型:
void
int
a=5;
系统会分配连续4个字节的空间:
0000
0000
|
0000
0000
|
0000
0000
|
0000
0101
String
a=”hello”;//
a
是一个引用
(地址),不允许对其进行修改;
a
--
四个字节;存的是地址值[
];指向首地址--“hello”四个连续的存储空间;
-------------------------------------------------------------------------------------
写一个person类
在其它类中写了
person
p
=
new
person();
p
---
在内存中分到4个字节的空间,存放的是地址值。该地址就是后面new
person()
产生
的空间。
这样保证了所有的地址都指向合法的位置;
通过p.xxx();
-----去访问对象的方法
p.xxxx;
------
去访问对象的属性
对象:
充满氢气的氢气球,引用是绳子,通过这个绳子找到这个氢气球;
一个绳子只能连着一个气球;一个气球可以由多根绳子连着;
如果没有引用,那么我们就访问不了,虽然它也存在,叫做垃圾。
Java
虚拟机的垃圾回收的机制;String
s=“hello”;
s=null;
System.gc();
//
可以建议虚拟机来回收这些垃圾;来提高效率。
若有引用p,但没有指向具体的对象。若去访问p就会出现nullpointerException(空指针异常)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
编译时:错误
:error(s)
警告:
Warning(s)
运行时:异常:
错误:
Person
p
=
null;
-------
定义了引用但没有对象
p.name;
--------
访问Person类的name属性;
p.age;
--------
访问Person类的age属性;
这个异常,没有对象,不可能访问对象的属性,这在编译的时候不会出错,只有在运行的时候
才会出现的异常。
注:
一个对象有多个引用指向它时,一个引用来改变它的值时,其它也改。
一个引用只能指向一个对象;
------------------------------------运算符:
表达式:
==
/=
%=
+=
-=
>=
>>>=
a*=4
a=a*4;
比较符:
〉
>=
>
----右移
(用符号位填充左侧)
>>
----无符号右移(用0填充前面的位置)
位运算:
>
>>>
;
左移相当于乘2的n次方;
右移相当于除于2的n次方;空位补符号位;
移位若大于32,则相当于移动了对32求余的位数,如:45%32
若被操作的数是long类型的则移位值要对64求余
例如,-14
(即二进制的
11110010)右移两位等于
-4
(即二进制的
11111100)----
注意:11110010,11111100
都是补码
>>>=
无符号右移动,移出的不管,移进的都补0。
辅助数:
1111
10001;
|(或):
把原来指定位置1,其它位不变;
辅助数:
0000
01110;
^(异或):异或运算,经常用来把原数的指定位求反其它位不变;辅助数:
000001110;
~
(取反):按位取反。
对于a=a+1;
而b=++a
相当于a=a+1;b=a;
三目运算符:
?
System.out.println(4>3?9:9.99);
-----------------------------补充-----------------------------------------
运算符优先级别
运算符
结合性
(
)
[
]从左向右
!
~
++
--
new
强制转换从右向左
/
%从左向右
>
>>>从左向右
>=
instanceof
从左向右
=
=
!=
从左向右
{
int
b=0;
}
}
--------------
以上代码编译时通不过的
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-------------------------------------
控制语句
------------------if
–
else
格式:
If(条件){
………….
}else{
………….
}
If()条件后腰执行多条语句就必须用花括号括起,若只有一条可以不用花括号。
----------------------------------------------
if
-
else
;
else
匹配的是向上最近的if
;
求一个数是不是素数:
循环,从2到n/2
或
sqrt(a)
;
int
a=13;
//boolean
flag=false;
for(int
i=2;iMath.sqrt(a))
//if(flag==true)
System.out.println(“a
是素数“);
//if(flag==true)
----------------------------
switch
格式:
Switch(条件){
case
条件值
:
……………….
break;
case
条件值
:
……………….
break;
default
:
…………………
break;
}
---------------------------------------------
switch中的变量类型只能是byte、
short、int、char,枚举五种类型;
只有遇到break才会退出,除非到程序末尾;
default放在最后和前面有区别,如果不写break的话,放在最后会自动退出;
但是放到开头的话,会继续执行直到遇到break为止;
循环的设计:
---------------------For循环
for();
outer:
in
er:
标签只能和break/continue
结合使用;
+++++++++++++++++++++++++++++++++++++++++++++++
public
static
void
main(String[]
args)
{
int
i=0;
aa:
while(true){
i++;
System.out.println(i);
if(i>10){
break
aa;}}}
++++++++++++++++++++++++++++++++++++++++
for(int
i=0;i=
0
System.out.println(“your
user
name
is:“+str);/
//第二种从键盘读数据的方法
Scanner
sca=new
Scanner(System.in);
System.out.println(“Please
input
your
name
and
age:“);
String
name=sca.next();
int
age=sca.nextInt();
System.out.println(“your
name
is:“+name);
System.out.println(“your
age
is
:“+age);
}
================================================
java.util.Scanner
Scanner
sca
=
new
Scanner(System.in);------System.in(是输入流)
String
s1
=sca.next();
----------
若输入hello
haha
hehe这样只能读到hello
String
s2
=
sca.nextline();
-----------
这个就能读到所有的值
int
a
=
sca.nextInt();
float
f
=
sca.nextFloat();
double
d
=s
sca.nextDouble();
System.out
---------------------------------------是输出流
从一个字符串中取出首字符:
String
name=“abcd“;
Char
firstChar=name.charAt(0);
---------------------------------------------------------------------
Math.pow(a,b)-------
Math类中有一个pow()方法表示,求a的b次方。
break
loop;
-----
跳出标号所标的循环,若没有跟标号,直接跳出循环
continue
-----
同样可以跟标号。
Java
day04
求一个数是不是素数:
循环,从2到n/2
或
sqrt(a)
;
int
a=13;
boolean
flag=true;
for(int
i=2;i<=Math.sqrt(a);i++){
if(a%i==0){
flag=false;
break;
}
}
if(flag){
System.out.println(“a
是素数“);
}else{
System.out.println(“a
不是素数“);
}
----------------------------------数组:
1)声明数组:
数组能以下列形式声明:(两种方式)
类型[]
array;
类型
array[];
注:JAVA中推荐用:
类型[]
array;
一个数组是一个对象
声明一个数组没有创建一个对象
声明时不用指定长度
数组是引用类型;
(类,接口,数组)
2)创建数组:
创建基本数据类型数组:int[]
i
=
new
int[2];
创建引用数据类型数组:Student[]
s
=
new
Student[100];
创建数组的三种形式:
int[]
arr1;
arr1
=new
int[5];