java编程基础

来源:互联网 发布:知豆属于哪个品牌 编辑:程序博客网 时间:2024/06/05 20:43

第一天
软件的定义:计算机数据和指令的集合,使人与计算机这间更好的交互。
交互方式:图形,命令行方式
计算机语言:人与计算机的交流方式
java:跨平台性。 原理:java虚拟机
jdk:开发 jre:运行


环境搭建:(XP)系统属性-高级-环境变量(path=bin路径;)可以定义多个
临时环境搭建:set path=bin路径;(当前窗口有效)可以定义多个(原变量:%path%)
定义执行程序路径:set classpath =路径;
注意:如果有两个相同文件名的 先找classpath里的程序。
  set classpath =c:\;先找c盘,再找当前目录。注意分号。不要用。
  set classpath =c:\ 只找c盘。 别用上面的。
  set classpath =.;c:\;d:\  点表示当前路径。
  set classpath =c:\;d:\ 两个文件
path和classpath查找先后顺序:
path环境变量:先找当前目录,再找path环境变量。
classpath:相反。


注释:
//单行注释。
/*
*/多行注释
/**
*/多行注释
javadoc.exe提取注释。


第二天
关键字:
关键字的定义和特点
定义:被Java语言赋予了特殊含义的单词
特点:关键字中所有字母都为小写
用于定义数据类型的关键字
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


标示符(自己定义的名称):
在程序中自定义的一些名称。
由26个英文字母大小写,数字:0-9 符号:_ $ 组成
定义合法标识符规则:
1,数字不可以开头。
2,不可以使用关键字。
Java中严格区分大小写。
注意:在起名字的时,为了提高阅读性,要尽量有意义。
Java中的名称规范:
包名:多单词组成时所有字母都小写。
xxxyyyzzz
类名接口名:多单词组成时,所有单词的首字母大写。
XxxYyyZzz
变量名和函数名:多单词组成时,第一个单词首字母小写,第二个单词开始每个单词首字母大写。
xxxYyyZzz
常量名:所有字母都大写。多单词时每个单词用下划线连接。
XXX_YYY_ZZZ


常量与变量:
常量:
表示不能改变的数值。
变量:
内存中的一个存储区域
该区域有自己的名称(变量名)和类型(数据类型)
该区域的数据可以在同一类型范围内不断变化
为什么要定义变量:
用来不断的存放同一类型的常量,并可以重复使用
使用变量注意:
变量的作用范围(一对{}之间有效) 
初始化值
定义变量的格式:
数据类型    变量名  =  初始化值;
注:格式是固定的,记住格式,以不变应万变。
理解:变量就如同数学中的未知数。


数据类型:
-基础数据类型:
 --数据型:整数类型(byte.short,int,long),浮点类型(float,double)
 每个字节由八个开关组成 如0000-0000
八个二进制表示一个字节   0000-0000=一个字节 8bit=1Byte, 数据传输是以10进制传输,数据存储时以2进制表示所以1KB不等于1Kb,1Kb=1000bit,1KB=1024Byte=1024*8bit
byte=一个八位来表示的就是八个二进制位来表示一个字节=一两的碗
short=十六个二进制位(二两的碗)二个字节
int=4个八位=三十二个二进制(四两的碗)四个字节
long=8个八位(八两的碗)八个字节oo
float=4个八位
double=8个八位
 --字符型:(char)
 --布尔型:(boolean)
-引用数据类型
 --类:(class)
 --接口:(interface)
 --数组:([])


算术运算符:
运算符  运算
+  正号
—  负号
+  加
-  减
*  乘
/       除
%       取模(求余)
++      自增(前)
++  自增(后)
--  自减(前)
--  自减(后)
+  字符串想加
小知识:(自减同样)
int a = 3, b;
b=a++
打印后 a=4 b=3 a先赋值给b,再自己加1运算
b=++a   
打印后 a=4 b=4 a先自己加1运算,再赋值给b


赋值运算:
符号:= , +=, -=, *=, /=, %=
符号解释:
 int a,b,c;  a=b=c =3;
 int a = 3;   a+=5;等同运算a=a+5;
short s = 3;
s=s+2;//编译失败,两次运算,先提升int再运算,在赋值给s,而s是short类型的。
s+=2; //一次运算,自动强转。  
有什么区别?


比较运算符:
运算符  运算
==   相等于
!=   不等于
<   小于
>   大于
<=   小于等于
>=   大于等于
instanceof 检查是否是类的对象


逻辑运算符:
运算符        运算              范例               结果
&              AND(与)      false&true         false
|               OR(或)         false|true          true
^              XOR(异或)   false^true         true
!              Not(非)             !true              false
&&          AND(短路)    false&&true      false
||              OR(短路)      false||true        true
逻辑运算符用于连接布尔型表达式,在Java中不可以写成3<x<6,应该写成x>3 & x<6 。
“&”和“&&”的区别(注意):
单&时,左边无论真假,右边都进行运算;
双&时,如果左边为真,右边参与运算,如果左边为假,那么右边不参与运算。
 “|”和“||”的区别同理,双或时,左边为真,右边不参与运算。
异或( ^ )与或( | )的不同之处是:当左右都为true时,结果为false。


位运算符:
位运算符(二进制位移)
运算符             运算                       范例
<<                    左移         3 << 2 = 12 --> 3*2*2=12
>>                    右移          3 >> 1 = 1  --> 3/2=1
>>>            无符号右移     3 >>> 1 = 1 --> 3/2=1
&                     与运算       6 & 3 = 2(二进制下:110&011=010)(1是真,0是假)
|                       或运算      6 | 3 = 7
^                    异或运算      6 ^ 3 = 5(一个数异或同一个数两次,结果还是那个数。)
~                       反码                   ~6 = -7
位运算符的细节
<< 空位补0,被移除的高位丢弃,空缺位补0。(其实就是乘以2的移动的位数次幂。)
>> 被移位的二进制最高位是0,右移后,空缺位补0;
 最高位是1,空缺位补1。(就是除以2的移动的位数次幂)
>>> 被移位二进制最高位无论是0或者是1,空缺位都用0补。
& 二进制位进行&运算,只有1&1时结果是1,否则是0;
| 二进制位进行 | 运算,只有0 | 0时结果是0,否则是1;
^ 任何相同二进制位进行 ^ 运算,结果是0;1^1=0 , 0^0=0
 不相同二进制位 ^ 运算结果是1。1^0=1 , 0^1=1
(练习) 最有效率的方式算出2乘以8等于几?2<<3;
 2*8=16底层就是二进制在运算,即
  00000000-00000000-00000000-00000010(2)
 *00000000-00000000-00000000-00001000(8)
 =00000000-00000000-00000000-00010000(16)
 即2往左移3位就可以了,即提高了运算效率。


进制转换:
二进制(0-1),十进制(0-9),八进制(0-7),十六进制(0-F)
二进制与十进制的关系:
二进制的1101转化成十进制
1101(2)=1*2^0+0*2^1+1*2^2+1*2^3=1+0+4+8=13
转化成十进制要从右到左用二进制的每个数去乘以2的相应次方
不过次方要从0开始
十进制转二进制
相反 用十进制的数13除以2 每除一下将余数就记在旁边
最后按余数从下向上排列就可得到1101
二进制与八进制的关系
转换公式(8): 二进制 000       001     010    011    100    101    110    111 
                       八进制  0         1         2        3         4        5        6        7
二进制与十六进制的关系
2进制 0000 0001 0010 0011 0100 0101 0110 0111
16进制 0       1        2      3       4        5        6      7
2进制 1000 1001 1010   1011   1100   1101   1110   1111
16进制 8        9     a(10)  b(11)  c(12)  d(13)   e(14)   f(15)
可以用四位数的二进制数来代表一个16进制,如3A16 转为二进制为:
3为0011,A 为1010,合并起来为00111010。可以将最左边的0去掉得1110102
又要将二进制转为16进制,只需将二进制的位数由右向左每四位一个单位分隔,将各单位对照出16进制值即可。
十进制转二进制代码(递归):

void toBin(int num)//只能算正数。{if(num>0){toBin(num/2);System.out.println(num%2);}}public static void toBin1(int num)//查表法,可以算所有的十进制数{//定义二进制的表。char[] chs = {'0','1'};//定义一个临时存储容器。char[] arr = new char[32];//定义一个操作数组的指针int pos = arr.length;while(num!=0){int temp = num & 1;arr[--pos] = chs[temp];num = num >>> 1;}for(int x=pos; x<arr.length; x++){System.out.print(arr[x]);}}十进制转十六进制代码:class Jinzhizhuanhun {public static void main(String[] args) {toHex(60);}public static void toHex(int num){StringBuffer sb = new StringBuffer();for(int x=0; x<8; x++){int temp = num & 15;if(temp>9)//System.out.println((char)(temp-10+'A'));sb.append((char)(temp-10+'A'));else//System.out.println(temp);sb.append(temp);num  = num >>> 4;}System.out.println(sb.reverse());}public static void toHex1(int num)//查表法{char[] chs = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};//定义一个临时容器。char[] arr = new char[8];int pos = arr.length;while(num!=0){int temp = num & 15;//System.out.println(chs[temp]);arr[--pos] = chs[temp];num = num >>> 4;}System.out.println("pos="+pos);//存储数据的arr数组遍历。for(int x=pos;x<arr.length; x++){System.out.print(arr[x]+",");}}十进制转为其他进制代码:class ArrayTest7 {public static void main(String[] args) {//toBin(-6);//toHex(-60);//toBa(60);//System.out.println(Integer.toBinaryString(6));//System.out.println(Integer.toHexString(6));}/*十进制-->二进制*/public static void toBin(int num){trans(num,1,1);}/*十进制-->八进制*/public static void toBa(int num){trans(num,7,3);}/*十进制-->十六进制*/public static void toHex(int num){trans(num,15,4);}public static void trans(int num,int base,int offset){if(num==0){System.out.println(0);return ;}char[] chs = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};char[] arr = new char[32];int pos = arr.length;while(num!=0){int temp = num & base;arr[--pos] = chs[temp];num = num >>> offset;}for(int x=pos; x<arr.length; x++){System.out.print(arr[x]);}return ;}}


三元运算符
格式
(条件表达式)?表达式1:表达式2;
如果条件为true,运算后的结果是表达式1;
如果条件为false,运算后的结果是表达式2;
示例:
获取两个数中大数。
int x=3,y=4,z;
z = (x>y)?x:y;//z变量存储的就是两个数的大数。

获取二进制的十六进制表现形式:

class OperateDemo3 {public static void main(String[] args) {int num = 60;//获取60的最低4位,通过&15;int n1 = num & 15;System.out.println(n1>9?(char)(n1-10+'A'):n1);//要获取下一组四位,将60右移4位。int temp = num >>> 4;//为什么使用>>>而不使用>>,应为如果是负数的话,>>前面是补1,就永远移不完。//对temp的值进行最低四位的获取。int n2 = temp & 15;System.out.println(n2>9?(char)(n2-10+'A'):n2);//强转后自动提升。变67./*0-9 'A' 'B' 'C' 'D' 'E' 'F'65   66  6710   11  12  13  14  1512 - 10 = 2 + 'A' = (char)67;*/ }}


 

判断结构
if语句
三种格式:
1.if(条件表达式)
 {
  执行语句;
 }

2.if(条件表达式)
 {
  执行语句;
 }
 else
 {
  执行语句;
 }
3.if(条件表达式)
 {
  执行语句;
 }
 else if (条件表达式)
 {
  执行语句;
 }
 ……
 else
 {
  执行语句;
 }
if语句特点:
 a,每一种格式都是单条语句。
 b,第二种格式与三元运算符的区别:三元运算符运算完要有值出现。好处是:可以写在其他表达式中。
 c,条件表达式无论写成什么样子,只看最终的结构是否是true 或者 false;

选择结构:
switch语句
格式:
switch(表达式)
{
 case 取值1:
  执行语句;
  break;
 case 取值2:
  执行语句;
  break;
 …...
 default:
  执行语句;
  break;
}
switch语句特点:
    a,switch语句选择的类型只有四种:byte,short,int , char。
 b,case之间与default没有顺序。先执行第一个case,没有匹配的case执行default。
 c,结束switch语句的两种情况:遇到break,执行到switch语句结束。
 d,如果匹配的case或者default没有对应的break,那么程序会继续向下执行,
 运行可以执行的语句,直到遇到break或者switch结尾结束。

循环结构:
代表语句:while , do while , for
while语句格式:
while(条件表达式)
{
 执行语句;
}

do while语句格式:
do
{
 执行语句;
}while(条件表达式);
while:先判断条件,只有条件满足才执行循环体。
do while: 先执行循环体,在判断条件,条件满足,再继续执行循环体。
  简单一句话:do while:无论条件是否满足,循环体至少执行一次。
do while特点是条件无论是否满足,
循环体至少被执行一次。

格式:
for(初始化表达式;循环条件表达式;循环后的操作表达式)
{
 执行语句;
}
 注:
    a,for里面的连个表达式运行的顺序,初始化表达式只读一次,
    判断循环条件,为真就执行循环体,然后再执行循环后的操作表达式,
    接着继续判断循环条件,重复找个过程,直到条件不满足为止。
    b,while与for可以互换,区别在于for为了循环而定义的变量在for循环结束就是 
    在内存中释放。而while循环使用的变量在循环结束后还可以继续使用。
    c,最简单无限循环格式:while(true) , for(;;),无限循环存在的原因是并不知道循
    环多少次,而是根据某些条件,来控制循环。
for嵌套(九九乘法表):

class jiujiu{public static void main(String[] args) {for(int x=1; x<=9; x++){for(int y=1; y<=x;y++ )        {System.out.print(y+"*"+x+"="+y*x+"\t");}System.out.println();}}}


 

第三天
其他流程控制语句:
break(跳出),  continue(继续)
break语句:应用范围:选择结构和循环结构。
continue语句:应用于循环结构。
注:
a,这两个语句离开应用范围,存在是没有意义的。
b,这个两个语句单独存在下面都不可以有语句,因为执行不到。
c,continue语句是结束本次循环继续下次循环。
d,标号的出现,可以让这两个语句作用于指定的范围。


函数:
什么是函数?
函数就是定义在类中的具有特定功能的一段独立小程序。
函数也称为方法。
函数的格式:
修饰符 返回值类型 函数名(参数类型 形式参数1,参数类型 形式参数2,)
 {
   执行语句;
   return 返回值;
 }
 返回值类型:函数运行后的结果的数据类型。
 参数类型:是形式参数的数据类型。
 形式参数:是一个变量,用于存储调用函数时传递给函数的实际参数。
 实际参数:传递给形式参数的具体数值。
 return:用于结束函数。
 返回值:该值会返回给调用者。
函数特点:
定义函数可以将功能代码进行封装
便于对该功能进行复用
函数只有被调用才会被执行
函数的出现提高了代码的复用性
对于函数没有具体返回值的情况,返回值类型用关键字void表示,那么该函数中的return语句如果在最后一行可以省略不写。
注意:
函数中只能调用函数,不可以在函数内部定义函数。
定义函数时,函数的结果应该返回给调用者,交由调用者处理。
函数的重载:
在同一个类中,允许存在一个以上的同名函数,只要它们的参数个数或者参数类型不同即可。
下面函数是否重载:

void show(int a,char b,double c){}a.void show(int x,char y,double z){}//没有,因为和原函数一样。b.int show(int a,double c,char b){}//重载,因为参数类型不同。注意:重载和返回值类型没关系。c.void show(int a,double c,char b){}//重载,因为参数类型不同。注意:重载和返回值类型没关系。d.boolean show(int c,char b){}//重载了,因为参数个数不同。e.void show(double c){}//重载了,因为参数个数不同。f.double show(int x,char y,double z){}//没有,这个函数不可以和给定函数同时存在与一个类中。


 

第四天
数组:
概念
同一种类型数据的集合。其实数组就是一个容器。
数组的好处
可以自动给数组中的元素从0开始编号,方便操作这些元素。
格式1:
元素类型[] 数组名 = new 元素类型[元素个数或数组长度];
示例:int[] arr = new int[5];
格式2:
元素类型[] 数组名 = new 元素类型[]{元素,元素,……};
int[] arr(栈内存中的引用) = new(堆类存中的实例) int[]{3,5,1,7};
int[] arr = {3,5,1,7};

数组最大值:

public static int getMax(int[] arr){int max = arr[0];for(int x=1; x<arr.length; x++){if(arr[x]>max)max = arr[x];}return max;}


数组的排序:

import java.util.*;/*对给定数组进行排序。{5,1,6,4,2,8,9}*/class ArrayTest2 {/*选择排序。内循环结束一次,最值出现头角标位置上。比较方式:第一角标和后面每个元素比较。最值就出现在第一位,          然后是第二角标和后面每个元素比较*/public static void selectSort(int[] arr){for (int x=0; x<arr.length-1 ; x++){for(int y=x+1; y<arr.length; y++){if(arr[x]>arr[y]){/*int temp = arr[x];arr[x] = arr[y];arr[y]= temp;*/swap(arr,x,y);}}}}/*冒泡排序*///冒泡排序:相邻两个元素互相比较。最值出现在最后一位。public static void bubbleSort(int[] arr){for(int x=0; x<arr.length-1; x++)//for(int x =arr.length-1;x>;x--){for(int y=0; y<arr.length-x-1; y++)//-x:让每一次比较的元素减少,-1:避免角标越界。{//for(int y=0;y<x;y++)if(arr[y]<arr[y+1]){/*int temp = arr[y];arr[y] = arr[y+1];arr[y+1] = temp;*/swap(arr,y,y+1);}}}}/*发现无论什么排序。都需要对满足条件的元素进行位置置换。所以可以把这部分相同的代码提取出来,单独封装成一个函数。*/public static void swap(int[] arr,int a,int b){int temp = arr[a];arr[a] = arr[b];arr[b] = temp;}public static void main(String[] args){int[] arr = {5,1,6,4,2,8,9};//排序前;printArray(arr);//排序//selectSort(arr);//bubbleSort(arr);//Arrays.sort(arr);//java中已经定义好的一种排序方式。开发中,对数组排序。要使用该句代码。//排序后:printArray(arr);}public static void printArray(int[] arr){System.out.print("[");for(int x=0; x<arr.length; x++){if(x!=arr.length-1)System.out.print(arr[x]+", ");elseSystem.out.println(arr[x]+"]");}}}


 

二维数组:
格式1:int[][] arr = new int[3][2];
 定义了名称为arr的二维数组
 二维数组中有3个一维数组
 每一个一维数组中有2个元素
 一维数组的名称分别为arr[0], arr[1], arr[2]
 给第一个一维数组1脚标位赋值为78写法是:arr[0][1] = 78;
格式2:int[][] arr = new int[3][];
 二维数组中有3个一维数组
 每个一维数组都是默认初始化值null
 可以对这个三个一维数组分别进行初始化
  arr[0] = new int[3];
  arr[1] = new int[1];
  arr[2] = new int[2];

内存结构:
栈内存
 用于存储局部变量,当数据使用完,所占空间会自动释放。
堆内存
 数组和对象,通过new建立的实例都存放在堆内存中。
 每一个实体都有内存地址值
 实体中的变量都有默认初始化值
 实体不在被使用,会在不确定的时间内被垃圾回收器回收

 

原创粉丝点击