第一篇:JAVA学习日记
第一天
Javac –version 检查JDK版本
Path设置技巧
JAVA_HOME环境变量 设置为bin前面的路径 设置为Path = %JAVA_HOME%bin 避免对系统环境的频繁修改造成错误 path只支持可执行文件 配置临时环境变量 set path = XXXX 增加临时环境变量 set path=XXX;%path% 环境变量从头开始查找
Hello World 任何事物的第一步
代码:计算机能识别的特殊格式的单词 class Demo{ } 源程序经过编译 计算机能识别的文件 一次编译到处运行
任何程序都有入口 主函数就是入口 被虚拟机调用 保证程序的独立运行
Javac 检查源代码的正确性 保证语法正确 经验来源于错误
java命令对应虚拟机JVM 虚拟机将类文件加载入内存
classpath 类文件路径
将java的类文件目录告诉JVM 未设置在当前路径 set classpath=c:xxxxx;加了分号虚拟机会在当前目录下查找类文件
阅读性加强 set classpath=.;c:xxxxx;
找不到类文件(1)类名错误
(2)set classpath设置
java文件名 类名要一致
第二天
高级语言的特征:关键字 标识符 注视 变量和常量 运算符 语句 函数 数组 但是表现形式不同 掌握两点:(1)表现形式(2)什么时候用 关键字:被赋予特殊含义的单词 关键字都是小写 类名首字母大写
标示符:程序中自定义的一些名称
标示符组成:26个大小写字母 数字 _ $符号(1)数字不可以开头(2)不可以使用关键字 名字尽量要有意义 java中严格区分大小写 标识符可以做 类名 变量名 方法名
下划线 美元符号的作用 用于连接某些名称
文档注释可以用javadoc提取出来
多行注释不能嵌套
注释可以进行代码的调试 注释不写入字节码 代码中一定要写注释
代码是思想表现形式的一种
写代码前必须格式 /* 需求:XXXX 思路: 1.XXXX 2.。。。步骤: 1.XXXXX */
常量表示不能改变的数值
常量分类:整数常量 小数常量 布尔常量 字符常量 字符串常量 null常量(只有一个值null)
整数的进制表现形式:二进制 八进制 十进制 十六进制 八进制占二进制三位 十六进制占二进制4位 常用的是二进制和十六进制
负数在内存中是以补码的形式存在的 负数二进制最高位是1 整数是0 补码的算法:负数的绝对值取反加1
变量的概念:
内存中的一个存储区域 该区域有自己的名称和类型
该区域的数据可以在同一个类型的范围内不断变化
作用:用来不断的存放同一类型的常量,并可以重复使用 变量的格式
数据类型 变量名 = 初始化值 变量就如同数学中的未知数 当数据不确定时就定义变量 Java的数据类型
变量不能重复定义 局部变量必须初始化
实例变量可以不初始化 虚拟机会为实例变量初始化
运算两端必须都是相同类型的变量 Java整形默认是int 浮点默认是double 强制转换必须小心使用,会丢失精度 int x = 2;byte b = 3;b =(byte)(x+b);ASII码表 美国信息交换表 GB2312 国标表 GBK 国标扩展表
Unicode表 国际标准码表 强转例子: byte b = 4;b = 3+7;byte b1 = 3;byte b2 = 4;b = b1+b2;//err 精度损失
分析:byte b =4;4在java中默认是int型 编译器会先检查所赋的值在-128~127范围内,在的话自动强转为byte类型 b = b1+b2;//err 精度损失
b1,b2 为变量范围不确定 编译器不能确定值,所以编译报错 注意:右边无法确定则无法判断并赋值,编译无法通过 int 类型
int x1= Integer.MAX_VALUE;int x2 = 2;int x = x1 + x2;会产生精度丢失 负数只参考被取余的数
5%-2 == 1 int a = 3,b;b = a++;内存中的过程:a变量先在内存中划一块临时区域保存a变量的值,再自增运算,最后将临时区域的值赋值给b变量 面试小例子1:int i =3;i =i ++;//i的值为3 过程:i=i+1 i = i在临时区域的值 面试小例子2:short s = 3;
s+=4;//加等会在底层自动转换类型 与short s =3 类似
s = s+4;//error 损失精度
第三天 运算符
比较运算符运算完的结果必须是true或者是false 逻辑运算符:用于连接两个boolean类型的表达式 & 与符号运算特点: true & true true true & false false false & false false 与运算两边只要有一边为false结果为false 只有两边都为true结果为true | 或运算符特点: true | true true true | false true false | false false 或运算两边只要有一边为true结果为true 只有两边都为false结果为false ^ 异或运算符 和或有点不一样 true | true false true | false true false | false false 异或运算规律:相同为false 不同为true 面试细节:
&& 短路与 当左边为false时右边不运算 || 短路或 当左边为true时右边不运算
位运算符
& 运算
可以取二进制数的某一段
^ 异或符号 一个数异或同一个数两次,结果还是这个数 6^3^3 = 6;~ 取反
一个正数的反码是这个正数的负数减一 6的反码是-7
移位运算符号
>> 右移 3>>2 右移2位 符号位补最高位 右移n位其实就是该数字除以2^n次方
<< 左移 3<<2 左移两位 最低位补零 左移n位其实就是该数字乘以2^n次方
>>> 无符号位右移
3>>>2 无符号位右移2位
对两个值进行互换高效方法(不用第三方变量)int a = 5,b =3;a = a^b;b = a^b;a = a^b;
三元运算符
(表达式)?表达式1 : 表达式2
流程控制:顺序结构 判断结构 选择结构 循环结构 If语句时候要注意写{ }
简化格式简化代码书写但是造成代码可读性变差 简写格式什么时候用?
当if else运算后有具体结果时可以使用三目运算符替代
局部代码块可以节省内存空间 可以定义局部变量的生命周期
代码复用性 当多个条件对应一个结果时,可以讲条件合并
switch表达式中的数据类型 byte short char int String enum switch{
case 1: case 2:
} switch多个对应关系
if和switch的应用
if:1.对具体的值进行判断
2.对区间判断
3.对运算结果是boolean类型的表达式进行判断 switch:1.对具体的值进行判断
2.值的个数通常是固定的
对于几个固定的值判断,建议使用switch语句,因为switch语句会将具体的答案都加载入内存,效率相对高一些
循环结构的代表性结构有三个 while(){} do{} while()for(){} do{}while()特点无论条件如何循环体都要执行
累加思想 计数器思想
for(表达式1;表达式2;表达式3){} 表达式2必须为boolean表达式 表达式1和3可以为任意表达式 for和while的区别
1.for和while可以互换
2.格式上的不同,在使用上有点小区别
控制循环的变量for只在for范围内有效 while在范围大些 无限循环最简单的形式 while(true){} for(;;)for第二个表达式默认为true 什么时候使用循环结构
当对某些代码执行多次时,使用循环结构完成
当对一个条件进行一次判断是,可以使用if语句 当对一个条件进行多次判断是可以使用while语句
第四天
大圈套小圈思想:有一种重复的情况,每种情况对应其他的重复情况多次 转义字符 n 回车 t 制表符 b 退格
r按下回车 Window系统中回车其实是有两个符号组成的 rn Linux中回车符是 n 制表符 tab break:跳出
break作用范围:要么是switch语句,要么是循环语句
记住:当break语句单独存在时,下面不要定义其他语句,因为执行不到会编译错误 break跳出最近的循环 continue :继续 作用范围:循环结构
continue结束本次循环,继续下次循环
函数就是定义在类中的具有特定功能的小程序 函数特点:
(1)函数提高代码的复用性,简化书写(2)定义函数将功能代码封装,(3)便于功能复用(4)函数被调用才执行
注意:函数中只能调用函数,不能定义函数
如何定义一个函数 通过两个明确来完成
明确一:这个功能的结果是什么?
明确函数返回值
明确二:这个功能实现 过程中是否需要位置内容参与?
明确参数列表
注意:返回值类型和参数类型没有直接关系
函数内存加载过程:
javac命令启动java编译器 java 命令 启动java虚拟机
在运行时期java虚拟机寻找主函数main()
函数的重载 Overload 增强阅读性 两同一不同 1.同一个类中
2.相同的方法名
3.不同的参数列表
注意:函数重载与返回值无关
Java是严谨性的语言,如果函数出现调用的不确定性,会编译失败
函数重载使用动态绑定,当程序运行时,JVM函数标签存入一张表中,当调用函数时在表中查询相应的参数类型,即可调用相应的方法
函数的重写:Override: 1.在不同的类中
2.相同的方法名和参数类表
3.重写函数的权限要比被重写的函数权限大
4.函数的返回值是被重写的函数的返回值的子类或者相同
数组:同一种数据类型的集合,其实数组就是一个容器 数组格式:静态数组:int[] arr = new int[]{0,1,2,3,4};
动态数组:int[] arr = new int[length];
arr[0] = 0;
arr[1] = 1;
…………
arr[length-1] = n;JVM内存的划分 1.寄存器
cpu 2.本地方法区
与所在系统相关 3.方法区
4.栈内存
5.堆内存
栈内存:存储的都是局部变量(定义在方法中的变量),而且变量所属的作用域一旦结束,该变量自动释放 { }局部代码块 限定局部变量的生命周期
动态数组创建后会默认初始化
堆内存
存储的是数组和对象 凡是new出来的对象 堆内存不会随时释放
队中存储的是实体,实体中存储多个数据 特点:
1. 每一个实体都有一个首地址值
2. 堆内存中每一个变量都有默认初始化值,根据类型不同而不同,整数是0,小数是0.0或0.0f boolean false char ‘u0000’(unicode码)3. 垃圾回收机制
第五天
数组中常见的问题 1.角标越界异常 2.空指针异常 格式一:
需要一个容器,但是不明确容器具体的数据 格式二
需要一个容器,存储已知的具体数据
数组常见操作 基本动作:存、取
核心思想:对角标的操作
获取最值的思路:
1.定义一个变量存储最值 2.比较数组的值得到最大值 3.存储最大值
排序:
选择排序和冒泡排序
选择排序:大圈套小圈思想
选择排序:
for(int i = 0;i for(int j =i+1;j for(int i = 0;i int num = arr[i]; int index = i; for(int j =i+1;j 冒泡排序: 解释:外层循环-1 是因为最后一个数不用比较 外层循环控制比较的大次数 内层循环-1是为了不将角标越界 -i 是为了控制每次比较的元素数量 for(int i = 0;i 查找: public static int getIndex(int[] arr,int num){ for(int i =0,i if(arr[i] == num) return i;} return-1;} 折半查找法:二分法 数组必须是有序的 //方法一 public static int binserach(int[] arr,int key){ int left = 0; int right = arr.length-1; int mid =(left+right)/2; while(arr[mid]!=key){ if(arr[mid]>key){ right = mid-1; mid =(left+right)/2; } else if(arr[mid] left = mid+1; mid =(left+right)/2; } if(left>right)return-1; } return mid; } //方法二 public static int halfserach(int[] arr,int key){ int left = 0; int right = arr.length-1; while(left<=right){ int mid =(left+right)>>1; if(arr[mid] left = mid+1; else if(arr[mid]>key) right = mid-1; else return mid; } return-1; } 面试题: 给定一个有序的数组,如果往该数组中存储一个元素,并保证这个数组还是有序的,那么这个元素的存储的角标位如何获取 思路:用折半查找法查找保证数组有序的位置 要放的位置就是在最后一次比较left和right角标的时候left的值 public static int halfserach(int[] arr,int key){ int left = 0; int right = arr.length-1; while(left<=right){ int mid =(left+right)>>1; if(arr[mid] left = mid+1; else if(arr[mid]>key) right = mid-1; else return mid; } return min; } Arrays.binarySerach();当数不存在时返回插入点负值-1 将一个整数的16进制表现形式 public static String toHex(int num){ char[] nums = {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'}; return nums[(num>>4)&0xf]+""+nums[num&0xf]; } 第六天 二维数组定定义方法 方法一: int[][] arr = new arr[2][3];方法二: int[][] arr = new arr[2][];arr[0] = new int [3];..........初始化 int[][] arr = {{1,2,3}, {4,5,6}, {7,8,9}}; 面向对象 面向过程:举例:大象装进冰箱 打开冰箱-> 存储大象->关上冰箱 对于面向过程思想强调过程(动作)C语言 面向对象是一种思想 面向对象强调对象(实体) 总结:面向对象就是将对象的方法进行封装,不关注具体实现的具体步骤 C++ Java C# 特点: 1.面向对象就是一种常见的思想,符合人们的思考习惯 2.面向对象的出现,将复杂问题简单化 3.面向对象的出现,让曾经在过程中的执行者,变成了对象中的指挥者 名词定义法 人开门 人是一个对象 门是一个对象 类与对象的关系:用java语言对现实生活中的事物进行描述,通过类的形式来体现的 对象:其实就是该类事物实实在在存在的个体 类是某一类对象的抽象体现 类:事物的描述 对象:该类事物的实例,在java中通过new来创建的 成员:成员变量(属性) 成员函数(行为) 一旦产生对象,对象中存在类中的内容 成员变量和局部变量的区别: 1.成员变量定义在类中,整个类中都可以访问 局部变量定义在函数,语句,局部代码块中,只在多数的区域有效 2.成员变量存在于堆内存对象中 局部变量存在以栈内存的方法中 3.成员变量随着对象的创建而存在,绥中对象而消亡 局部变量随着所属的区域执行而存在,随着所属区域消亡而释放 4.成员变量有默认初始化值 局部变量没有默认初始化值必须程序员手动初始化 5.成员变量可以不初始化 局部变量必须要初始化 匿名对象 1.当对象方法仅进行一次调用的时候,就可以简化为匿名对象 2.匿名对象可以作为实际参数进行传递 面向对象三大特性:封装、继承、多态 封装: 隐藏对象的属性和实现细节,仅对外提供公共访问方式 好处:将变量隔离、便于使用、提高复用性、保证数据安全 封装原则: 将不需要对外提供的隐藏起来 注意:私有仅仅是封装的一种体现而已 保证数据的安全,隐藏代码 java最小的封装体是函数 第七天 构造函数 特点:1.函数名与类名一致 2.不能定义函数返回值类型 3.没有返回值 class Human{ private String name; private int age; public Human(String name){//定义一个有参数的构造函数 this.name = name;} } 构造函数:在构建创造对象时调用的函数 构造函数作用:给对象进行初始化 创建对象都必须通过构造函数初始化 一个类中如果没有定义构造函数,那么该类中就有一个默认的空参数构造函数 如果在类中定义了指定的构造函数就没有默认的构造函数 一般函数和构造函数的区别 构造函数:对象创建时就会调用与之对应的构造函数,对对象初始化 一般函数:对象创建后,需要函数功能时候才会调用 构造函数:对象创建时会调用,只调用一次 一般函数:对象创建后,可以被调用多次 什么时候定义构造函数 在描述事物时,该事物已经存在的属性 (Overload)函数重载:增加复用性,增强阅读性 构造函数内存分配 构造函数中有return语句 当成员变量和局部变量重名,可以用关键字this来区分 this:代表对象,代表当前函数所属对象的引用 谁调用this代表谁 注意:一个类中的成员想要被执行必须有对象 this也可以在构造函数中调用其他构造函数 注意:只能 定义在构造函数第一行,因为初始化动作必须先执行 只要在本类中使用本类属性或方法使用this static关键字 增强代码复用性 static特点: 1. static是一个修饰符,用于修饰成员 2. static修饰的成员被所有对象共享 3. static优先于对象存在,因为static的成员随着类的加载就已经存在了 4. static修饰的成员可以以 类名.成员变量 方式调用 5. static修饰的数据是共享数据,对象中的存储是特有的数据 成员变量和类变量的区别 1.两个变量的生命周期不同 成员变量随着对象的创建而存在,随着对象的被回收而释放 类变量随着类的加载而存在,随着类的消失而消失 2.调用方式不同 成员变量只可以被对象调用 类变量可以被类名和对象调用 3.别名不同 成员变量为实例变量 静态变量称为类变量 4.成员变量在堆中 类变量在方法区的静态去(共享数据区) 方法存储在【方法区】中 方法中的代码也存放在方法区 static使用注意事项: 1.静态方法只能访问静态成员。(非静态可以访问静态和非静态成员)2.静态方法中不可以定义this和super关键字 3.(main)主函数是静态的 public static void main(String[] args)主函数特殊之处: 1.格式固定 2.被JVM所识别和调用 public:因为权限必须是最大的 static:不需要对象的,直接用主函数所属类名调用即可 void:主函数没有具体的返回值 main:函数名,不是关键,只是一个JVM识别的固定的名字 String[] args:主函数的参数列表,是一个数组类型的参数,而且元素都是字符串类型 主函数留参数原因:程序员将自定义的参数传入程序,使程序自定义性更高 类加载:类在什么时候用什么时候加载 静态什么时候用 1.静态变量 当分析对象所具备的成员变量的值都是相同的 当这个成员可以被静态修饰 2.静态方法 该函数功能是否访问到对象中的非静态数据 静态代码块 随着类的加载而执行,而且只执行一次 作用: 用于给类进行初始化 执行顺序: 类加载->静态代码块->构造代码块->构造函数 构造代码块:可以对所有对象初始化 Java学习日记 1,一个文件里可编写多个类,一个文件里不能有两个public类。独立运行的类必须有main()函数。 2,Print()不换行,println()打印新东西之前会换行。3,在set classpath前后不能有空格,不能有中文符号。 4,三种注释方法://、/*…*/、/**….*/,/*….*/不能嵌套,注释功能有:说明程序的功能,可以取消代码,或者是回复代码。 5,标识符:由字母、数字、下划线、美元符号组成,不能以数字、关键字开头。 6,常量:不变的数值。有整型,长整型,单精度、双精度、布尔常量、字符常量、字符号常量。单精度常量以’f’结尾。 7,变量就是系统为程序分配的一块内存单元,用来存储数据。变量须先定义后使用,不允许嵌套定义。 8,低字节的类型可以转换成高字节的类型,高字节的类型不可以转换成低字节。 9,流程控制:if若有多条语句最好用大括号括起来。问号表达式:y=x>0?x:-x;若表达式为真,结果为x,反之为-x.10,Switch()语句只接受int、byte、char、short类型数据,switch语句用break,多个条件执行相同命令:case 1: case 2:…… break; 11,while语句后若有“;”,不是不执行该语句,而是一直在执行空语句。12,do..while..语句不管三七二十一都执行该语句,直到while语句为假,且while()后有“;”。 13,system.in.read():从键盘上读取数据; 14,定义数组:int[] x或 int x[];arraycopy数组拷贝。 15,面向对象三大特征:封装、继承、多态。一个类中方法可以访问同类成员。若局部变量和成员变量名字一样,则成员变量隐藏。16,一个类中方法可以访问同类的成员变量和局部变量。 17,“==”与“equals()”的区别:“==”是比较两个对象的值是否相同,而equals()是比较两个对象的内容是否相同。例如: String str1=new String(“abc”);String str2=new String(“abc”);String str3=str1;If(str1==str2)System.out.println(“true”);System.out.println(“false”);Else 则结果返回为false。因为sr1和str2在堆中首地址不一样,而str1和str3首地址是一样的。若 If(str1.equals(str2)) System.out.println(“true”);System.out.prinltn(“false”);Else 则结果返回的是true,因为比较的是内容。 18,用private修饰的成员变量,在同一类中可以访问,在其他类中不可以访问。程序代码要求强内聚弱耦合 19,构造方法:和类名一样,无返回值,不能用return语句。实例对象一产生就立马调用构造方法,有几个实例对象就调用几次,一次完成对实例对象的初始化,若没有定义构造函数,系统会自动生成一个空构造函数,也可以进行重载。若定义了构造函数,则不再产生构造函数。了解构造函数执行过程。 20,finalize()方法类似于C++中析构函数,在被清除之前会调用这个函数。21,static静态方法只能直接调用同类中其他的静态成员,而不能访问非静态成员。静态方法在使用之前不用创建任何对象,而非静态对象在使用之前必须先创建实例对象。静态方法不以任何方式调用this和super方法 22,内部类:在类中直接定义内部类,内部类可以访问外部类成员变量。在程序块中均可定义内部类。 23,类的继承:在java中只支持单继承,但类可以有多层继承,子类继承了父类所有的成员变量和成员方法,但不继承父类的构造方法,可使用super方法调用父类的构造方法。 24,final()可声明类、属性、方法,若声明为类,则该类不被继承。若声明为变量,则该变量变为常量。若声明为方法,则该方法在子类中不能被覆盖。25,含有抽象方法的类称为抽象类。抽象方法:abstract int aa(int x,int y);一般方法:int aa(int x,int y){ 程序代码 } 两者的区别:前者必须由abstract修饰,只能声明,不能实例化,没有大括号;后者有大括号,说明实现了代码,不是抽象方法。 26,特殊的抽象类称为接口,接口中所有的方法都是抽象的。一个类用implements去实现一个接口的所有方法。27,一个类继承了另一个类,不能使用比继承类的访问权限更低的权限去访问该类。 28,del person.class 删除person字节码;javac *.java:编译所有源文件。29,a instanceof B:判断a是否是B的一个实例对象。对象的类型转换:子类可以转换成父类。Object是所有类的父类。 30,异常是非致命的错误,不是语法错误。对异常处理用try….catch..。用throws关键字抛出异常,也可以自定义异常。try后面可以跟多个catch捕获多个异常。finally语句无论如何都要执行,没有异常也会执行。 31,包,package语句,为java源文件的第一条语句,若无包则为缺省无包。同一个包中的类可以相互调用,不必写上包名。若为类加上包,则应将源文件中所有类都存到该包中。同一包中辆各类不一定在一个目录上。 32,访问控制:类本身有两种访问控制:public和默认。父类不能是private和protected,否则子类无法继承。默认修饰的类只被同一包中的所有类访问。33,进程:正在进行的程序。线程:一个程序内部的一条执行线索,每个线程上所要运行的程序代码段是多线程,用Thread类创建线程。 34,后台线程:如果对某线程对象在启动(调用start方法)前调用了setDaemon(true)方法,这个线程就变成了后台线程。只要还有一个前台线程在运行,这个进程就不会结束。如果一个进程中只有后台线程在进行,这个进程就会结束。Pp.join()的作用是把pp所对应的线程合并到调用pp.join();语句的线程中。35,单线程和多线程的区别:必须等到run()调用后才实现 36,要实现多线程必须要编写一个继承了Thread类的子类,子类要覆盖Thread类的run方法,在子类run方法中调用正在新程序中运行的程序代码,启动一个新线程是调用Thread类的start方法,Thread类对象的start方法产生一个新线程,并在该线程上运行Thread类对象中的run方法,控制线程是否结束。37,产生一个TestThread对象,四个tt.start()线程,共同去卖同100张车票: TestThread tt =new TestThread();tt.start();tt.start();tt.start();tt.start(); 38,多个线程共享同一数据就会发生线程安全问题。 39,线程间的通信:wait():当前线程放弃监视器并进入睡眠状态直到其他线程进入同一监视器并调用notify()为止。 40,API:应用程序编程接口。Windous API:WIndous操作系统提供的各种函数。Java API:JDK提供的各种java类 41,java开发工具软件的基本特点:集成编辑软件功能,使用工程化管理,产生应用程序的基本框架,支持调试,提供各种辅助工具。 42,JCreator Pro:一个工作区可以管理多个工程,只能有一个活动工程。使用该软件时不用完全记住函数或者参数,因为有提示,43,String 类对象中的内容一旦被初始化就不能在改变。而stringBuffer类用于封装,内容可以改变。 44,indexOf(int ch)方法用于返回一个字符在字符串中第一次出现的位置,若没有该字符,返回-1.45,集合类,用于存储一组对象,其中每个对象称为元素,常用到的有:Vetor、Enumeration、ArrayList等。 46,从键盘上读取数字:int b=System.in.read();Vector.addElement():向Vector中添加元素。 47,Collection,Set与List三者区别:Collection是父类,通用集合类,各元素对象无指定顺序,允许有重复元素和null元素对象。Set为子类,无指定顺序,不允许有重复元素,最多允许一个null元素对象。List也为子类,有指定顺序,允许有重复元素和多个null元素对象。 48,Hashtable类:Hashtable像Vector一样动态存储一系列对象,而且对存储的每个对象都要安排另一个对象与之相关联。用put()存储数据: Hashtable ht=new Hashtable();Ht.put(“one”,new Integer(1));检索数据用get方法: Integer n=(Integer)ht.get(“two”);If(n!=null){ System.out.println(“two=”+n);} 要成功检索某个字,用作关键字的类必须覆盖Object.hashtableCode()和Object.equals().49.Properties类:Hashtable类的子类,增加了讲Hashtable对象中的关键字和值保存到文件和从文件中读取关键字和值到Hashtable对象中的方法。如果要用Properties.store方法存储Properties对象中的内容,每个属性的关键字和值都必须是String类型。 50,System类中的exit方法用于结束java虚拟机运行的程序。currentTimeMills():可以检测程序运行的时间。Java虚拟机系统变量或者系统环境变量都是变量和值成对出现。getProperties方法获取java虚拟机系统属性,setProperties方法用于设置系统属性。 51,Date类:日期时间的类;Calendar:日期字段相互间的操作类; Calendar.add():增加时间;Calendar.Set():设置时间;Calendar.get():获取时间。Calendar类位于java.util包中 52.TimerTash类实现了Runable接口,要运行的任务,由它里面实现的run方法来完成。 53,Math类包含了所用于几何和三角运算的方法,Random类一个伪随机数产生类。 54,File类:IO包中唯一代表磁盘文件本身信息的类,而不是文件中的内容。File f=new File(“hello.txt”);If(f.exist()){f.delete();} Else {f.createNewFile();} System.out.println(“File name:”+f.getName());获取文件的名称 System.out.println(“File path:”+f.getPath());获取文件的路径 System.out.println(f.exist()?”exist”:”not exist”);判断文件是否存在 55,RandomAccessFile类提供了众多的文件访问方法;RandomAccessFile类支持随机访问,但是不能访问其他的Io设备,如网络、内存映像等。两种构造方法: new RandomAccessFile(f,”rw”);可以读写 new RandomAccessFile(f,”r”);只读 56,流是字节序列的抽象概念。文件是数据的静态存储形式流是数据传输时的形态。流分为两种:节点流类和过滤流类。57,InputStream类方法:int read();读取方法 void close();读取后要关闭文件 58,FileInputStream inone=new FileInputStream(“hello.test”);等同于 File f=new File(“hello.test”); FileInputStream intwo=new FileInputStream(f); 59,System.in连接到键盘,而System.out连接到显示器,用-1作为键盘输入的结束。 60,PipedInputStream与PipedOntputStream类:创建管道通信,使用管道流类,可以实现各个程序模块之间的耦合通信。 61,DateOutputStream类提供了三个写入字符串方法:-public final void writeByte(String s)-public final void writeChars(String s) -public final void writeUTF(String s) 62,ObjectInputStream、ObjectInputStream用于从底层输入流中读取对象类型的数据和将对象类型的数据写入到底层输出流。 63,避免频繁地在字符与字节间进行转换,最好不要直接使用InputStreamReader和OutputStreamWriter类读写数据,应尽量使用BufferedWriter类包装OutputStreamWriter类,用BufferredReader类包装InputStreamReader。InputStreamrReader和OutputStreamWriter用于将字节转换成字符流来读写的两个类。 63,读取一行文本用BufferredReader。 64,printStackTrace()用于将异常信息打印在标准输出设备上。65,AWT:应用窗口工具集;GUI:图形用户界面。66,将窗口从内存中显示出来用Frame.setViseble(true);Frame.setSize(int x,int y);设置窗口大小 Frame.add(new Button(“OK”));增加一个新按钮 67,GUI:包括基本组件和容器。Frame.dispose()将窗口对象释放,但线程消失,而Frame.setVisible(false);窗口不显示但程序没有结束。 68,事件适配器:事件监听器接口的最简单的实现类,称为Adapter。69,调用enableevents(long eventsToEnable))方法,可以在即使没有注册事件监听器情况下,组件也能够对某些类型的时间进行响应和产生相应的事件对象。70,GraPhics类与图形绘制有关。GraPhics.draw String()方法的坐标参数是左下面,这和其他的坐标在左上方是不一样的。 71,设置图形颜色:GraPhics.setColor(Color.Red);颜色英文须大写 72使用GraPhics.drawImage(Image img,int s,int y,imageObserver observer)方法显示图像。 73,与菜单相关的类:MenuBar、Menu、MenuItem。创建菜单的过程:先创建一个菜单条,再把几个菜单挂在菜单条上,最后在每个菜单上添加菜单项。也可以在菜单上创建子菜单。 74Container容器类,所有容器类的父类,Container.add()用于将组件添加到容器中。 75,Dialog类用于产生对话框,分为模态对话框和非模态对话框两种。76,Checkbox类用来建立单选按钮和多选按钮,单选按钮和多选按钮语义事件为ItemEvent,对应的监听器接口为ItemOutstream。 77,panel容器类,产生空白面板,可容纳多个组件,不能独立存在。78,ScrollPane用于产生滚动窗口。79,布局管理器管理组件在容器中的布局。 BroderLagout:NORTH、WEST、SOUTH、EAST、CENTER FlowLagout:布局分配是从左到右从上到下 GridLagout:网格布局,模块大小完全相同,也是从左到右,从上到下 cardLagout:多个组件交替显示,只有最上面的那一个可见。Container.setLagout(null)用于取消布局管理器 Container.setBounds(x1.y1,x2,y2)用坐标来设置组件位置 80,Swing提供了丰富的GUi组件,增强了AWT中原有组件的功能。JFC:java功能类,集合了Swing组件和其他能够开发API类。 81,JFrame是与AWT中的Frame相对应的Swing组件,只能有一个唯一组件——JRootPane; 82,Applet:嵌套在网页中的小程序。 83,浏览器显示网页的原理和打开记事本方式一样 84,Applet由浏览器来启动执行过程:1)浏览器载入HTML文件。2)浏览器载入HTML文件中引用的Applet字节码。3)浏览器启动java虚拟机执行Applet; 85Applet需要覆盖的方法:init()、start()、stop()、destroy()、paint()。鼠标事件监听器: MouseListener()。 86,Thread.sleep(1000);语句需要捕获异常,用try…catch….语句捕获 87,Applet相关知识:容器与插件的程序架构设计模式、Applet程序中的控制台输出。 88,Applet程序的限制:不能启动执行其他应用程序,不能进行文件IO操作,不能调用本机代码,不能与Applet所在的主机之外的其他主机进行网络连接; 89,Applet标记的详细表: [archive=archiveList]方括号的为可选项 Code=appletFile.class不带方括号的为必选项 90,OBJECT标记:使用HTMLContainer将Applet标记转换成OBJECT标记。使用OBJECT标记执行Applet小程序的java解释器被作为一个ActiveX插件使用。使用OBJECT标记比Applet标记多了自动下载和安装java解释器的功能。91,网络协议:TCP/IP UDP 92,获取本机IP地址:在命令行输入:ipcongif;端口号的范围是0-65535之间。93,TCP传输控制协议,是面向连接的通信协议 UDP用户数据报协议,是无连接的通信协议 94,Socket是网络驱动层提供给应用程序编程的接口和一种机制。网络编程类位于java.net包中。95,DatagramSocket类用于UDP通信,ServerSocket类用于TCP通信的服务器端。Socket类用于TCP通信的服务器端和客户端。 96,了解DatagramSocket类三种构造方法,close()关闭方法,send(DatagramPackage p)发送数据包方法;receive(DatagramPackage p)接受数据包方法 97,DatagramPackage提供了两种构造方法。getInetAddresss用于表示计算机IP地址的一个类,类中有getByName方法,返回一个相应的inetAddress实例对象。 98,TCP网络编程工作原理,利用TCP协议进行,两个应用程序有主次之分,主的称为服务器端,另一个称为客户端。 99,客户端与服务器端交互过程:1)服务器程序创建一个ServerSocket,然后调用Accept方法等待客户来连接。2)客户端程序创建一个Socket并请求与服务器建立连接。3)服务器接受客户的连接请求,并创建一个新的Socket与该客户建立专线连接。4)建立了连接的两个Socket在一个单独的线程上对话。5)服务器开始等待新的连接请求,当新的连接请求达到时,重复步骤2到5.100,TCP服务器程序必须先启动运行,TCP客户程序才能连接上TCP服务器,使用Windous提供的telent程序测试服务器程序,使用BufferredReader包装类,从网络输入流中一次读取一行文本。 101,使用netstart命令查看当前正在被使用的TCP端口号。通过一个配置参数来指定TCP服务器程序所使用的端口号。 102,ObjectInputStream和ObjectOutputStream可以从底层输入流中读取对象类型的数据和将对象类型的数据写入到底层输出流。 103,使用ObjectInputStream和ObjectOutputStream来包装底层网络字节流,TCP服务器和TCP客户端之间可以接受对象类型的数据。 104URL:统一资源定位器,由协议、主机名、端口号和资源名组成,了解相对URL和绝对URl的含义。 买本《java疯狂讲义》 或者 在网上下载下来看看主要看java语法部分和面向对象编程部分这些要速度过 接下来开始写一些小例子 从例子里面学习会更快例子差不多了就开始web方面的涉猎,先学struts->jsp->servlet->hibernate->spring学习javascript .如何学习Java? 3.1 Java学习路线 3.1.1 基础语法及Java原理基础语法和Java原理是地基,地基不牢靠,犹如沙地上建摩天大厦,是相当危险的。学习Java也是如此,必须要有扎实的基础,你才能在J2EE、J2ME领域游刃有余。参加SCJP(SUN公司认证的Java程序员)考试不失为一个好方法,原因之一是为了对得起你交的1200大洋考试费,你会更努力学习,原因之二是SCJP考试能够让你把基础打得很牢靠,它要求你跟JDK一样熟悉Java基础知识;但是你千万不要认为考过了SCJP就有多了不起,就能够获得软件公司的青睐,就能够获取高薪,这样的想法也是很危险的。获得“真正”的SCJP只能证明你的基础还过得去,但离实际开发还有很长的一段路要走。 3.1.2 OO思想的领悟掌握了基础语法和Java程序运行原理后,我们就可以用Java语言实现面向对象的思想了。面向对象,是一种方法学;是独立于语言之外的编程思想;是 CBD基于组件开发的基础;属于强势技术之一。当以后因工作需要转到别的面向对象语言的时候,你会感到特别的熟悉亲切,学起来像喝凉水这么简单。 使用面向对象的思想进行开发的基本过程是: ●调查收集需求。●建立用例模型。 ●从用例模型中识别分析类及类与类之间的静态动态关系,从而建立分析模型。●细化分析模型到设计模型。●用具体的技术去实现。●测试、部署、总结。 3.1.3 基本API的学习进行软件开发的时候,并不是什么功能都需要我们去实现,也就是经典名言所说的“不需要重新发明轮子”。我们可以利用现成的类、组件、框架来搭建我们的应用,如SUN公司编写好了众多类实现一些底层功能,以及我们下载过来的JAR文件中包含的类,我们可以调用类中的方法来完成某些功能或继承它。那么这些类中究竟提供了哪些方法给我们使用?方法的参数个数及类型是?类的构造器需不需要参数?总不可能SUN公司的工程师打国际长途甚至飘洋过海来告诉你他编写的类该如何使用吧。他们只能提供文档给我们查看,Java DOC文档(参考文献4.4)就是这样的文档,它可以说是程序员与程序员交流的文档。基本API指的是实现了一些底层功能的类,通用性较强的API,如字符串处理/输入输出等等。我们又把它成为类库。熟悉API的方法一是多查Java DOC文档(参考文献4.4),二是使用JBuilder/Eclipse等IDE的代码提示功能。 3.1.4 特定API的学习Java介入的领域很广泛,不同的领域有不同的API,没有人熟悉所有的API,对一般人而言只是熟悉工作中要用到的API。如果你做界面开发,那么你需要学习Swing/AWT/SWT等API;如果你进行网络游戏开发,你需要深入了解网络API/多媒体API/2D3D等;如果你做WEB开发,就需要熟 悉Servlet等API啦。总之,需要根据工作的需要或你的兴趣发展方向去选择学习特定的API。 3.1.5 开发工具的用法在学习基础语法与基本的面向对象概念时,从锻炼语言熟练程度的角度考虑,我们推荐使用的工具是Editplus/JCreator+JDK,这时候不要急于上手JBuilder/Eclipse等集成开发环境,以免过于关注IDE的强大功能而分散对Java技术本身的注意力。过了这一阶段你就可以开始熟悉 IDE了。程序员日常工作包括很多活动,编辑、编译及构建、调试、单元测试、版本控制、维持模型与代码同步、文档的更新等等,几乎每一项活动都有专门的工具,如果独立使用这些工具的话,你将会很痛苦,你需要在堆满工具的任务栏上不断的切换,效率很低下,也很容易出错。在JBuilder、Eclipse等IDE中已经自动集成编辑器、编译器、调试器、单元测试工具JUnit、自动构建工具ANT、版本控制工具CVS、DOC文档生成与更新等等,甚至可以把UML建模工具也集成进去,又提供了丰富的向导帮助生成框架代码,让我们的开发变得更轻松。应该说IDE发展的趋势就是集成软件开发中要用到的几乎所有工具。从开发效率的角度考虑,使用IDE是必经之路,也是从一个学生到一个职业程序员转变的里程碑。Java开发使用的IDE主要有Eclipse、JBuilder、JDeveloper、NetBeans等几种;而Eclipse、JBuilder 占有的市场份额是最大的。JBuilder在近几年来一直是Java集成开发环境中的霸主,它是由备受程序员尊敬的Borland公司开发,在硝烟弥漫的 Java IDE大战中,以其快速的版本更新击败IBM的Visual Age for Java等而成就一番伟业。IBM在Visual Age for Java上已经无利可图之下,干脆将之贡献给开源社区,成为Eclipse的前身,真所谓“柳暗花明又一村”。浴火重生的Eclipse以其开放式的插件扩展机制、免费开源获得广大程序员(包括几乎所有的骨灰级程序员)的青睐,极具发展潜力。 3.1.6 学习软件工程 对小型项目而言,你可能认为软件工程没太大的必要。随着项目的复杂性越来越高,软件工程的必要性才会体现出来。参见“软件开发学习路线”小节。 3.2学习要点 确立的学习路线之后,我们还需要总结一下Java的学习要点,这些要点在前文多多少少提到过,只是笔者觉得这些地方特别要注意才对它们进行汇总,不要嫌我婆婆妈妈啊。 3.2.1勤查API文档当程序员编写好某些类,觉得很有成就感,想把它贡献给各位苦难的同行。这时候你要使用“Javadoc”工具(包含在JDK中)生成标准的Java DOC文档,供同行使用。J2SE/J2EE/J2ME的DOC文档是程序员与程序员交流的工具,几乎人手一份,除了菜鸟之外。J2SE DOC文档官方下载地址:http://Java.sun.com/j2se/1.5.0/download.jsp,你可以到google搜索CHM版本下载。也可以在线查看:http://Java.sun.com/j2se/1.5.0/docs/api/index.html。对待DOC文档要像毛主席语录,早上起床念一遍,吃饭睡觉前念一遍。当需要某项功能的时候,你应该先查相应的DOC文档看看有没有现成的实现,有的话就不必劳神费心了直接用就可以了,找不到的时候才考虑自己实现。使用步骤一般如下: ●找特定的包,包一般根据功能组织。●找需要使用类,类命名规范的话我们由类的名字可猜出一二。●选择构造器,大多数使用类的方式是创建对象。●选择你需要的方法。 3.2.2 查书/google->写代码测试->查看源代码->请教别人 当我们遇到问题的时候该如何解决?这时候不要急着问别人,太简单的问题,没经过思考的问题,别人会因此而瞧不起你。可以先找找书,到google中搜一下看看,绝大部分问题基本就解决了。而像“某些类/方法如何使用的问题”,DOC文档就是答案。对某些知识点有疑惑是,写代码测试一下,会给你留下深刻的印象。而有的问题,你可能需要直接看 API的源代码验证你的想法。万不得已才去请教别人。 3.2.3学习开源软件的设计思想 Java领域有许多源代码开放的工具、组件、框架,JUnit、ANT、Tomcat、Struts、Spring、Jive论坛、PetStore宠物店等等多如牛毛。这些可是前辈给我们留下的瑰宝呀。入宝山而空手归,你心甘吗?对这些工具、框架进行分析,领会其中的设计思想,有朝一日说不定你也能写一个XXX框架什么的,风光一把。分析开源软件其实是你提高技术、提高实战能力的便捷方法。 3.2.4 规范的重要性 没有规矩,不成方圆。这里的规范有两层含义。第一层含义是技术规范,多到http://www.xiexiebang.com下载JSRXXX规范,多读规范,这是最权威准确最新的教材。第二层含义是编程规范,如果你使用了大量的独特算法,富有个性的变量及方法的命名方式;同时,没给程序作注释,以显示你的编程功底是多么的深厚。这样的代码别人看起来像天书,要理解谈何容易,更不用说维护了,必然会被无情地扫入垃圾堆。Java编码规范到此查看或下载http://Java.sun.com/docs/codeconv/,中文的也有,啊,还要问我在哪,请参考3.2.2节。 3.2.5 不局限于Java 很不幸,很幸运,要学习的东西还有很多。不幸的是因为要学的东西太多且多变,没时间陪老婆家人或女朋友,导致身心疲惫,严重者甚至导致抑郁症。幸运的是别人要抢你饭碗绝非易事,他们或她们需要付出很多才能达成心愿。Java不要孤立地去学习,需要综合学习数据结构、OOP、软件工程、UML、网络编程、数据库技术等知识,用横向纵向的比较联想的方式去学习会更有效。如学习Java集合的时候找数据结构的书看看;学JDBC的时候复习数据库技术;采取的依然是“需要的时候再学”的原则。 4.结束语需要强调的是,学习软件开发确实有一定的难度,也很辛苦,需要付出很多努力,但千万不要半途而废。本文如果能对一直徘徊在Java神殿之外的朋友有所帮助的话,笔者也欣慰了。哈哈,怎么听起来老气横秋呀?没办法,在电脑的长期辐射之下,都快变成小老头了。最后奉劝各位程序员尤其是MM程序员,完成工作后赶快远离电脑,据《胡播乱报》报道,电脑辐射会在白皙的皮肤上面点缀一些小黑点,看起来鲜艳无比…… Java学习周报 随着时间的推移,学习Java已经是第二周了。在这一周中,可以说是充分体验了困难与收获。经过第一周的熟悉,Java学习越来越深入,许多的新知识出现在我的眼前。这其中有难以理解的,让我充分认识到了Java学习的困难,但是当我深入学习并理解了这些知识时,又让我感到难以言表的收获与满足。在这一周中,主要学习了一下内容在: (1)学习内容:Java面向对象编程技术,包括程序包的使用,类的继承与访问控制,多态性及其应用,类成员及其应用,方法的重载与重写,以及关键字static、final的使用。 收获:通过本章的学习,我深入理解了Java面向对象编程技术,并能够恰当的使用包、访问控制与重载技术,能够掌握与应用继承、方法重写与多态性机制实现对现有类型的扩充与改造,以满足新的需求。 (2)学习内容:重点学习了抽象类、接口和嵌套类。作为面向对象编程技术中的几种重要机制,这是必须要求掌握的,对他们的综合应用能够使Java程序代码结构更加紧凑、简洁。 收获:在这一章中,我深入学习和掌握了Java高级类特性,其重点是抽象类与接口的用法,作为高层次的类型抽象,在实际应用中应能够熟练应用JDK中定义好的抽象和接口类型。而对于嵌套类则应该理解与掌握。 (3)学习内容:在本章中,主要了解与掌握Java在异常处理方面的知识,包括Java语言异常处理的内部机制;能够随时及开发中常见的异常进行分类展示,并给出Java异常处理原则与具体应用技巧。 收获:学习完本章后,我充分理解了Java异常概念及其处理机制,能够捕获并处理常见的异常,或根据需要声明抛出异常,能够定义自己的异常类型。 (4)学习内容:本章主要学习了Java中常见的类,包括Object类、字符串相关类型、封装类、日期相关类型、数学相关类型。 收获:通过本章的学习,我掌握了常用的Java类及其功能方法,尤其是Object类的equals()方法、toString()方法、常用的字符串及数学操作相关方法、封装类的自动封装与拆封机制以及日期信息的处理。 (5)学习内容:在以前学习的基础上,这章重点学习了命令行参数、系统属性、可变参数、注释的使用。 收获:通过本章的学习,基本掌握了通过命令行参数、标准I/O和文件I/O实现应用程序与外界之间的信息传输,理解并掌握可变参数、API及注解机制。 (6)学习内容:本章主要学习Java框架结构、Collection及Map接口、列表、集以及映射。 收获:通过本章的学习,全面理解了Java集合的相关概念、框架体系及其工作原理,基本能够熟练应用常用的Java集合类型。经过又一周的学习,使我更加深入的理解了Java,当然,在这期间,有许多的疑难点困扰着我,比如多重继承,比如作为Java特性之一的多态性的理解与实际使用,比如嵌套类的使用及其实现机制,比如人工抛出异常的具体操作方法等。但是通过自己的深入学习,以及查阅资料,和询问老师,最后在上手实际操作,基本解决了这些疑难点,这使我收获良多。 对于未来一周的学习,因为要深入到Java的具体开发技术,对于前面的基础知识要能够实际综合运用,在新知识的基础上做到温故而知新。第二篇:Java学习日记
第三篇:JAVA学习
第四篇:java学习
第五篇:Java学习周报