一个关于Scanner的android api文档档的事例代码允许不起来。

信息安全在线视频培训 云端托管 即时使用 教学光盘 培训系统 定制课程
Main menu:
安全启蒙教育让员工不再成为安全管理盲点基于云计算的,立等可用的安全意识培训平台 &包括讲解视频、动画案例、互动游戏和在线试题等内容的安全教育课程
弹指之间,发起安全意识宣传推广活动,让人为安全隐患消灭在萌芽一刻
现成的课件课件包括丰富的教学内容资源,如讲解视频、安全案例、互动游戏、检测试题等等。
即时的进度随时掌握在线学习进展情况,更可从记录文件中自行生成强大的报表,让领导及监管人员满意。
轻松的实现无需IT系统投入和专业技能,直接使用在线应用平台,即可让学员随时随地汲取安全知识和营养。拥有2个小站,订阅0个话题,关注18个小站
贝福Java年薪十万的秘密系列活动之&五百万天使投资背后的故事&将于明晚6点在计算机大楼B108举办。到场就送贝福乐扣杯,参与人人墙互动将有机会获得一等奖万达电影票两张,二等奖8G卡片式U盘3个,三等奖高级紫砂杯5只。来自大山里的80后青年企业家黄燚将为你讲述从平凡到非凡的创业故事!期待你的到来!...&
贝福Java年薪十万的秘密系列活动之&五百万天使投资背后的故事&将于明晚6点在计算机大楼B108举办。到场就送贝福乐扣杯,参与人人墙互动将有机会获得一等奖万达电影票两张,二等奖8G卡片式U盘3个,三等奖高级紫砂杯5只。来自大山里的80后青年企业家黄燚将为你讲述从平凡到非凡的创业故事!期待你的到来!
目前hadoop算是比较热门的一个技术,简单来说就是大数据处理的技术,但是目前相关学习资料非常少,网上流传的一些,比如传智播客、连数成金等等都是几讲很基础的教程,要想深入学习光是看这些根本没有什么用处,所以说要想学好这门技术必要得要个好的老师指导你,或者是有一套好的教材资料,不然只能是停留在入门阶段。在此给你推荐三套很不错的教程,《深入浅出Hadoop实战开...&
目前hadoop算是比较热门的一个技术,简单来说就是大数据处理的技术,但是目前相关学习资料非常少,网上流传的一些,比如传智播客、连数成金等等都是几讲很基础的教程,要想深入学习光是看这些根本没有什么用处,所以说要想学好这门技术必要得要个好的老师指导你,或者是有一套好的教材资料,不然只能是停留在入门阶段。在此给你推荐三套很不错的教程,《深入浅出Hadoop实战开发30讲》《Hadoop应用开发实战 28讲》《Cloudera Hadoop 4系列实战课程40讲》,都是目前比较经典的教程。
下面是一些网络资源:
1."Hadoop.Operations.pdf.zip"
2."Hadoop权威指南(中文版)(带书签).pdf"
3."[Hadoop权威指南(第2版)].pdf"
4."hadoop权威指南第3版2012.rar"
5.《Hadoop技术内幕:深入解析HadoopCommon和HDFS.pdf"
6."Hadoop技术内幕:深入解析MapReduce架构设计与实现原理.pdf"
7."Hadoop实战.pdf"
8."Hadoop实战-陆嘉恒(高清完整版).pdf"
9."Hadoop实战(第2版).pdf"
10."HadoopinAction.pdf"
11"Hadoop in practice.pdf"
12"HadoopThe.Definitive.Guide,3Ed.pdf"
13."O'Reilly.Hadoop.The.Definitive.Guide.3rd.Edition.May.2012.pdf"
14."hadoop入门实战手册.pdf"
15."Hadoop入门手册.chm"
16."windows下配置cygwin、hadoop等并运行mapreduce及mapreduce程序讲解.doc"
17"在Windows上安装Hadoop教程.pdf"
18."Hadoop源代码分析(完整版).pdf"
19."hadoop-api.CHM"
20."HBase-Hadoop@小米.pptx"&
21."但彬-Hadoop平台的大数据整合.pdf"
22."QCon2013-罗李-Hadoop在阿里.pdf"
23."百度hadoop计算技术发展.pdf"
24."QCon-吴威-基于Hadoop的海量数据平台.pdf"
25."8步安装好你的hadoop.docx"
26."hadoop运维经验分享.ppsx"
27."PPT集萃:20位Hadoop专家分享大数据技术工具与最佳实践.rar"
28."Hadoop2.0基本架构和发展趋势.pdf"
29."Hadoop与大数据技术大会PPT资料.rar"
30."Hadoop2011云计算大会.rar"
31."hadoop开发者(1~3)期.zip"
不仅是简单学学Java,作为吉大学生想去名企,你需要扎实的数据结构与算法能力。贝福9期11月9日开班!引领意味着课程体系的革新,Java+Android的复合才能将会让你成为移动互联网时代的宠儿。贝福Java课程体系全面升级,内容涵盖J2SE、J2EE、大数据(linux+hadoop)、算法与数据结构以及Android。学习Java企业级开发课程标准价格为...&
不仅是简单学学Java,作为吉大学生想去名企,你需要扎实的数据结构与算法能力。贝福9期11月9日开班!引领意味着课程体系的革新,Java+Android的复合才能将会让你成为移动互联网时代的宠儿。贝福Java课程体系全面升级,内容涵盖J2SE、J2EE、大数据(linux+hadoop)、算法与数据结构以及Android。学习Java企业级开发课程标准价格为7200元,另加1800元即可学习Android。这是一次收益率超高的投资机会,用自己未来一个月的工资,给自己一个更好的未来。贝福Famliy期待你的加入,详询。
贝福成立于07年,于09年得到500万天使投资,成立吉林省康宁白润电子商务有限公司运营软件业务,现每年研发费用在600万左右。在阳光大厦有300平的自有场地,20余位开发人员。公司从联通总部直接接入40兆光纤,同时有7台IBM2U机架式服务器。贝福的Java人才培养以软件业务为依托,自有软件公司和合作伙伴可同时接收50位实习生。首席讲师黄燚曾在上海神州科技工...&
贝福成立于07年,于09年得到500万天使投资,成立吉林省康宁白润电子商务有限公司运营软件业务,现每年研发费用在600万左右。在阳光大厦有300平的自有场地,20余位开发人员。公司从联通总部直接接入40兆光纤,同时有7台IBM2U机架式服务器。贝福的Java人才培养以软件业务为依托,自有软件公司和合作伙伴可同时接收50位实习生。首席讲师黄燚曾在上海神州科技工程有限公司担任研发部经理兼架构师,带过100多人的研发团队,负责过千万级的项目。后任职于新东方一博担任长春校区校长,月薪税后两万。这就是你不知道的贝福。
贝福每年四万元专项资金强力支持吉大软件学院和计算机学院的学生活动,在新学期里,同学们将有机会得到100本贝福学习笔记、500只磨砂杯、500只乐扣杯、1000张鹿皮眼镜布、5000把塑料扇。敬请期待吧~
贝福每年四万元专项资金强力支持吉大软件学院和计算机学院的学生活动,在新学期里,同学们将有机会得到100本贝福学习笔记、500只磨砂杯、500只乐扣杯、1000张鹿皮眼镜布、5000把塑料扇。敬请期待吧~
泛型:JDK1.5版本出现的一个安全机制。好处:将运行时出现的问题(ClassCastException)转移到了编译时期。 避免了强转的麻烦。格式:通过&&在内指定操作的引用数据类型。泛型可以定义在类上。早期:class Tool{private Opublic void setObj(Object obj){this.obj = ob...&
泛型:JDK1.5版本出现的一个安全机制。&好处:将运行时出现的问题(ClassCastException)转移到了编译时期。&&&&&& 避免了强转的麻烦。&格式:通过&&在内指定操作的引用数据类型。泛型可以定义在类上。早期:class Tool{&private O&public void setObj(Object obj)&{&&this.obj =&}&public Object getObj()&{&&&}}main(){&Tool t = new Tool();&t.setObj(new Worker());//当往里传递的参数为t.setObject(new Student());//编译通过,运行出现ClassCastException&Worker w = (Worker)t.getObj();//必须要强转}
现在:通过泛型类来完成。class Tool&Q&{&private Q&public void setObj(Q obj)&{&&this.obj =&}&public Q getObj()&{&&&}}main(){&Tool&Worker& t = new Tool&Worker&();&t.setObject(new Worker());//如果传入t.setObject(new Student());编译时会出现失败。&&&&&//那么就是将运行时出现的问题转移到了编译时期。&Worker w = t.getObj();//不需要在进行强转。}什么时候定义泛型类呢?当类中要操作的引用数据类型不确定的时候,就使用泛型类。在使用泛型类时,只有在建立泛型类对象时,才可以指定具体要操作的引用数据类型。那么该对象在调用方法时,操作的类型都是相同的。如果想方法在调用的时,操作的类型不确定,而且不相同,可以将泛型定义在方法上。class Utils{&public &T& void printInfo(T t)&{&&&}&public &Q& void show(Q q)&{&&&}}
泛型的限定:1,? extends E: 接收的是E类型对象或者E的子类型对象。2,? super E:接收的是E类型对象或者E的超类,直至Object对象
学会了使用按钮监听以及鼠标监听器之后,我们就可以制作一个属于自己的画图板了,以下是我之前制作的一个简易的画图板,功能方面尚还不足,不过已经可以完成铅笔,橡皮,画直线,圆等基本工作了,还可以完成颜色的自由选择,大家不放自己也动手做做吧。
首先是界面类:
importjava.awt.BorderL
importjava.awt.C...&
学会了使用按钮监听以及鼠标监听器之后,我们就可以制作一个属于自己的画图板了,以下是我之前制作的一个简易的画图板,功能方面尚还不足,不过已经可以完成铅笔,橡皮,画直线,圆等基本工作了,还可以完成颜色的自由选择,大家不放自己也动手做做吧。
首先是界面类:
import&java.awt.BorderL
import&java.awt.Color;
import&java.awt.D
import&java.awt.FlowL
import&java.awt.G
import&java.awt.GridL
import&java.awt.event.ActionE
import&java.awt.event.ActionL&
import&javax.swing.ButtonG
import&javax.swing.ImageI
import&javax.swing.JB
import&javax.swing.JColorC
import&javax.swing.JF
import&javax.swing.JL
import&javax.swing.JP
import&javax.swing.JRadioB&
publicclass&Draw&extends&JFrame{
public&Color&color=Color.BLACK;//设置初始颜色
private&Color&colorselector;
private&JButton&colorselectorbu[]=new&JButton[6];
//创建对象时需要new一个对象,否则他的默认值就是NULL
private&JPanel&colorjp=new&JPanel();
publicstaticvoid&main(String args[]){
Draw dr=new&Draw();
dr.showframe();
publicvoid&showframe(){
JPanel north=new&JPanel();//上方区域,存放颜色按钮以及颜色选择器
JPanel west=new&JPanel();//左边区域,存放图形按钮
JPanel center=new&JPanel();//中间区域,存放画板
JPanel south=new&JPanel();//下面区域,用来显示当前鼠标所在前位置以及所画图形的大小
//-----------------中间区域---------------
center.setLayout(new&FlowLayout(FlowLayout.LEFT));//将中间区域的布局设置为左对齐
JPanel drawjp=new&JPanel();
drawjp.setBackground(Color.white);
drawjp.setPreferredSize(new&Dimension(600,500));
center.add(drawjp);
//-----------------上方区域----------------
JButton colorchooserbu=new&JButton("更多颜色");
colorchooserbu.addActionListener(colorlistener);
colorjp.setPreferredSize(new&Dimension(120,60));
colorjp.setLayout(new&GridLayout(3,6,0,0));
//创建一个颜色组
Color&color[]=new&Color[]{Color.BLACK,Color.BLUE,Color.CYAN,Color.DARK_GRAY,Color.GRAY,Color.GREEN
,Color.LIGHT_GRAY,Color.GREEN,Color.MAGENTA,Color.ORANGE,Color.PINK,Color.YELLOW};
Dimension d=new&Dimension(20,20);
for(int&i=0;i&color.length;i++){
JButton colorbu=new&JButton();
colorbu.setBackground(color[i]);
colorbu.setPreferredSize(d);
colorjp.add(colorbu);
colorbu.addActionListener(listener);
//按钮选择器的自定义颜色组
for(int&j=0;j&colorselectorbu.length;j++){
colorselectorbu[j]=new&JButton();
colorselectorbu[j].setPreferredSize(d);
colorjp.add(colorselectorbu[j]);
colorselectorbu[j].addActionListener(listener);
north.add(colorjp);
north.add(colorchooserbu);
//-----------------左边区域----------------
String img[]=new&String[]{"Line",&"oval",&"rect",&"roundrect",&"eraser",&"fill",
"pencil",&"select"};
String img1[]=new&String[]{"Line1","oval1","rect1","roundrect1","eraser1","fill1",
"pencil1","select1"};
ButtonGroup bg=new&ButtonGroup();
for(int&i=0;i&img.length;i++){
//创建Icon组
ImageIcon shapeicon=new&ImageIcon("back/"+img[i]+".jpg");
ImageIcon shapeicon1=new&ImageIcon("back/"+img1[i]+".jpg");
JRadioButton shapebu=new&JRadioButton(shapeicon);
bg.add(shapebu);
shapebu.setPressedIcon(shapeicon1);
//设置选中时的图案
shapebu.setSelectedIcon(shapeicon1);
shapebu.setActionCommand(img[i]);
west.add(shapebu);
//---------------下方区域-------------
JLabel la1=new&JLabel();
JLabel la2=new&JLabel();
JLabel la3=new&JLabel("600x500像素");
JLabel la4=new&JLabel();
south.add(la4);
south.add(la1);
south.add(la2);
south.add(la3);
south.setLayout(new&GridLayout(1,4,20,20));
north.setPreferredSize(new&Dimension(200,80));
west.setPreferredSize(new&Dimension(80,200));
south.setPreferredSize(new&Dimension(200,20));
north.setBackground(Color.GRAY);
west.setBackground(Color.DARK_GRAY);
center.setBackground(Color.LIGHT_GRAY);
south.setBackground(Color.WHITE);
this.setLayout(new&BorderLayout());
this.add(north,BorderLayout.NORTH);
this.add(west,BorderLayout.WEST);
this.add(south,BorderLayout.SOUTH);
this.add(center,BorderLayout.CENTER);
this.setTitle("画图板复习");
this.setSize(900,700);
this.setLocationRelativeTo(null);
this.setDefaultCloseOperation(3);
this.setVisible(true);
//在画板上获取画布权限
Graphics g=drawjp.getGraphics();
DrawListener listener=new&DrawListener(g,bg,this,la1,la2);
drawjp.addMouseListener(listener);
drawjp.addMouseMotionListener(listener);
//添加按钮监听,获取按钮的背景颜色
ActionListener&listener=new&ActionListener(){
publicvoid&actionPerformed(ActionEvent e) {
//获取事件源,发生事件的对象
Object obj=e.getSource();
if(obj&instanceof&JButton){
color=((JButton) obj).getBackground();
ActionListener&colorlistener=new&ActionListener(){
//按钮数组累加器
publicvoid&actionPerformed(ActionEvent e){
colorselector=JColorChooser.showDialog(null,&"颜色选择器",&Color.BLACK);
colorselectorbu[i].setBackground(colorselector);
//超出六个按钮,返回0
然后是鼠标监听类:
import&java.awt.C
import&java.awt.G
import&java.awt.event.MouseA
import&java.awt.event.MouseE
import&java.util.R&
import&javax.swing.ButtonGroup;
import&javax.swing.ButtonM
import&javax.swing.JL&
publicclass&DrawListener&extends&MouseAdapter{
privateintx1,x2,y1,y2;
private&Graphics&g;//将画布对象传过来
private&ButtonGroup&bg;//将按钮组传过来
private&Draw&dr;
private&JLabel&la1;
private&JLabel&la2;
public&DrawListener(Graphics g,ButtonGroup&bg,Draw dr,JLabel la1,JLabel la2){
this.la1=la1;
this.la2=la2;
//鼠标按下
publicvoid&mousePressed(MouseEvent e){
x1=e.getX();
y1=e.getY();
g.setColor(dr.color);
//鼠标释放
publicvoid&mouseReleased(MouseEvent e){
x2=e.getX();
y2=e.getY();
ButtonModel bm=bg.getSelection();
String com=bm.getActionCommand();
if(com.equals("Line")){
g.drawLine(x1,&y1,&x2,&y2);
//改变la2中的数字
la2.setText(Math.abs(x1-x2)+"x"+Math.abs(y1-y2));
elseif(com.equals("oval")){
g.drawOval(Math.min(x1,&x2),Math.min(y1,&y2),Math.abs(x1-x2),Math.abs(y1-y2));
la2.setText(Math.abs(x1-x2)+"x"+Math.abs(y1-y2));
elseif(com.equals("rect")){
g.drawRect(Math.min(x1,x2), Math.min(y1,y2), Math.abs(x1-x2),Math.abs(y1-y2));
la2.setText(Math.abs(x1-x2)+"x"+Math.abs(y1-y2));
elseif(com.equals("roundrect")){
g.drawRoundRect(Math.min(x1,x2), Math.min(y1,y2),Math.abs(x1-x2),Math.abs(y1-y2), Math.abs(x1-x2)/4,Math.abs(y1-y2)/4);
la2.setText(Math.abs(x1-x2)+"x"+Math.abs(y1-y2));
publicvoid&mouseMoved(MouseEvent e){
int&X=e.getX();
int&Y=e.getY();
la1.setText(X+","+Y);
publicvoid&mouseExited(MouseEvent e) {
la1.setText("");
//鼠标拖动
publicvoid&mouseDragged(MouseEvent e){
int&X=e.getX();
int&Y=e.getY();
la1.setText(X+","+Y);
x2=e.getX();
y2=e.getY();
String com=bg.getSelection().getActionCommand();
if(com.equals("pencil")){
g.drawLine(x1,&y1,&x2,&y2);
elseif(com.equals("eraser")){
g.setColor(Color.WHITE);
for(int&i=-8;i&8;i++){
g.drawLine(x1+i,y1+i,x2+i,y2+i);
elseif(com.equals("select")){
g.drawLine(x1,y1,x2,y2);
elseif(com.equals("fill")){
Random ran=new&Random();
int&a=ran.nextInt(16)-8;
g.drawLine(x1+a,&y1+a,&x2+a,&y2+a);
使用到的图片是从WINDOWS中的画图板中截图下来的,附件中已提供给大家,自己也动手试试吧
我们都是在尚有回旋的余地的时候讨价还价,在没有退路的时候开始妥协。与其被动接受,不如主动选择。贝福Java,带你走向技术之巅。5月4日准时开课,我们期待你的到来。资讯电话:。
public class Sorts {/*** 冒泡排序* @param nums* @return*/public static int[] bubble(int[] nums) {if (nums != null) {for (int i = nums.length - 1; i & 0; i--) {for (int j =...&
&public class Sorts {&/*** 冒泡排序* @param nums* @return*/public static int[] bubble(int[] nums) {if (nums != null) {for (int i = nums.length - 1; i & 0; i--) {for (int j = 0; j & j++) {if (nums[j] & nums[j + 1]) {int num = nums[j];nums[j] = nums[j + 1];nums[j + 1] =}}}}}&/*** 选择排序* @param nums* @return*/public static int[] selection(int[] nums) {if (nums != null) {for (int i = nums.length - 1; i & 0; i--) {int k = 0;for (int j = 1; j &= j++) {if (nums[k] & nums[j]) {k =}}if (k != i) {int num = nums[k];nums[k] = nums[i];nums[i] =}}}}&/*** 插入排序* @param nums* @return*/public static int[] insertion(int[] nums) {if (nums != null) {for (int i = 1 ; i & nums. i++) {int num = nums[i];for (int j = i - 1; j &= 0; j--) {if (num & nums[j]) {nums[j + 1] =} else {nums[j + 1] = nums[j];if (j == 0) {nums[0] =}}}}}}&/*** 快速排序* @param nums* @param low* @param high* @return*/public static int[] quick(int[] nums, int low, int high) {if (nums != null) {if (low &= high) {}int index = partition(nums, low, high);quick(nums, low, index - 1);quick(nums, index + 1, high);}}&/*** 快速排序分区算法* @param nums* @param low* @param high* @return*/public static int partition(int[] nums, int low, int high) {if (nums != null) {int key = nums[low];while (low & high) {while (nums[high] &= key && high & low) {high--;}nums[low] = nums[high];while (nums[low] &= key && high & low) {low++;}nums[high] = nums[low];}nums[high] =}}&public static void main(String[] args) {int[] nums = {9,8,7,6,5,4,3,1,2,10};&//bubble(nums);//selection(nums);//insertion(nums);quick(nums, 0, nums.length - 1);&for (int num : nums) {System.out.print(num + ", ");}&}}&
身体和梦想总该有一个在路上,作为计算机相关专业的你不应该放弃对技术的追逐。也许你也暂时迷茫,也许你现在还不清楚未来的方向。与行业专家面对面对话,IT职业生涯规划公益活动欢迎你的到来。时间:下周一到周五的某一天晚上。地点:贝福Java吉大教学中心。主讲嘉宾:黄燚。拥有十一年行业经验的软件公司老总,为你揭开软件行业高薪就业的神秘面纱。报名请发送学院+年级+姓名至。
1)单行注释:从//开始到本行结尾
2)长篇注释:/*开始,*/结束
3)文档注释:/**开始,*/结束,可以用来自动生成文档
2. 数据类型
short(2)
long(8)[以L结尾]
float(4)[有效位7,以F结尾]
1. 注释& & &1)单行注释:从//开始到本行结尾& & &2)长篇注释:/*开始,*/结束& & &3)文档注释:/**开始,*/结束,可以用来自动生成文档
2. 数据类型
& & &1)整数& & & & & int(4) & & short(2) & & byte(1)&& & long(8)[以L结尾]
& & &2)浮点& & & & & float(4)[有效位7,以F结尾] & & double(8)[有效位15]& & & & & 三个特殊的浮点数值:& & & & & & & &正无穷大(Double.POSITIVE_INFINITY)& & & & & & & &负无穷大(Double.NEGATIVE_INFINITY)& & & & & & & &Double.NaN(0/0或者负数的平方根结果为NaN),Double.isNaN(double num)判断是否是NaN
& & &3)字符& & & & & char(2) 单引号'A',Unicode编码单元\u0000~\uffff,\u2122表示注册符号等& & & & & Character类中有很多字符是否是标示符等的判定方法
& & &4)布尔& & & & & boolean(1) 两个值:true和false
& & &1)不要使用未被初始化的变量,最好显示进行初始化& & &2)使用final声明常量(const是Java保留的关键字,但目前没有被使用)
& & &1)Math类中包含了各种各样的数学函数,在函数前加Math.或者import static java.lang.Math.*(静态导入)& & &2)可预测结果比运行速度更重压的话,使用StrictMath类(fdlibm实现的算法)& & &3)int和long转换成float或者long转成double都会有精度损失
5. 代码点和代码单元
& & &1)代码点就是一个Unicode字符。代码单元就是代码点的集合& & &2)辅助字符需要一对代码单元表示,辅助字符一般用于汉字或者日文等字符& & &3)遍历字符串,依次查看每一个代码点:& & & &&
int&cp&=&sentence.codePointAt(i);&&
if(Character.isSupplementaryCodePoint(cp))&&
&&&&&&&&i+=2;&&
&&&&&&&&i++;&&
&& & & 4)回退操作
int&cp&=&sentence.codePointAt(i);&&
if(Character.isSupplementaryCodePoint(cp))&&
&&&&&&&&i--;&&
&6. StringBuffer vs. StringBuilder
& & &1)StringBuffer线程安全& & & 2)StringBuilder非线程安全,单线程中使用比StringBuffer快
7. 控制台输入输出&&&
1)Scanner&in&=&new&Scanner(System.in);&&
&&&&&System.out.println("What&is&your&name?");&&
&&&&&String&name&=&in.nextLine();&&
&&&&&System.out.println("How&old&are&you?");&&
&&&&&int&age&=&in.nextInt();&&
&&&&&in.next();&&&&&&//读一个单词&&
2)Console&cons&=&System.console();&&
&&&&&String&userName&=&cons.readLine("User&Name:&");&&
&&&&&char[]&password&=&cons.readPassword("Password:&");&&&&&//&密码处理之后马上用填充值覆盖数组元素&&安全&&
& & &3)格式化输出& & & & & &System.out.printf("%,.2f", .0); & & ==& & & & 3,333.33
8. 文件的输入输出
& & &1)Scanner in = new Scanner(new File("myfile.txt")); & & // 构造一个从给定文件读取数据的Scanner& & &2)Scanner in = new Scanner(String data); & & & & & & & & & // 构造一个从给定字符串读取数据的Scanner& & &3)PrintWriter out = new PrintWriter("myfile.txt"));& & & & & &
9. 控制流程
& & &1)flag: &... &
10. 大数值
& & &1)BigInteger& & &2)BigDecimal
& & &1)简单打印System.out.println(Arrays.toString(array));& & &2)数组拷贝Arrays.copyOf/System.arraycopy(from, fromIndex, to, toIndex, count);& & &3)数组排序Arrays.sort(array);& & &4)int r = (int)(Math.random() * n) [0, n-1]随机整数& & &5)for(double[] row : array)& & & & & & & &for(double value: row)& & & & & & & & & & do something with value
& & &6)二维数组快速打印System.out.println(Arrays.deepToString(array));& & &7)不规则数组& & & & & & & &int[][] odds = new int[NMAX + 1][]& & & & & & & &for(int n = 0; n &= NMAX; n++)& & & & & & & & & & odds[n] = new int[n+1];
如果你觉得缺少一种疯狂学习技术的氛围,欢迎你来到贝福Java实训中心!上课地点离吉大北门仅200米,7*24小时对学员开放。企业老总亲,教学与项目并行。五大板块涵盖Java数据库开发、Java通信网络开发、Java Web开发、J2EE框架开发、Oracle数据库企业级项目开发。更有IBM Java相关四项认证、企业带薪实习、免费就业推荐、Android选修...&
如果你觉得缺少一种疯狂学习技术的氛围,欢迎你来到贝福Java实训中心!上课地点离吉大北门仅200米,7*24小时对学员开放。企业老总亲,教学与项目并行。五大板块涵盖Java数据库开发、Java通信网络开发、Java Web开发、J2EE框架开发、Oracle数据库企业级项目开发。更有IBM Java相关四项认证、企业带薪实习、免费就业推荐、Android选修等更多超值服务。让你真正品位高端赢在起跑线。下周开班,试听16课时再缴费,最后几个名额打架报名中。11级的同学再不学习技术就有些晚啦,12级的同学现在起步也不早。咨询电话:。
package com.mon.import java.io.Fimport java.io.FileInputSimport java.io.InputSimport java.text.DecimalFimport org.apache.poi.hssf.usermod...&
package com.mon.&import java.io.Fimport java.io.FileInputSimport java.io.InputSimport java.text.DecimalFimport org.apache.poi.hssf.usermodel.HSSFCimport org.apache.poi.hssf.usermodel.HSSFDateUimport org.apache.poi.hssf.usermodel.HSSFRimport org.apache.poi.hssf.usermodel.HSSFSimport org.apache.poi.hssf.usermodel.HSSFWimport org.apache.poi.poifs.filesystem.POIFSFileSimport org.apache.poi.ss.usermodel.Cimport org.apache.poi.ss.usermodel.Rimport org.apache.poi.ss.usermodel.Simport org.apache.poi.ss.usermodel.Wimport org.apache.poi.xssf.usermodel.XSSFW&public class ExcelUtil{& & private static final String EXCEL_2007 = "xlsx";& &&& & public static void main(String[] args) throws Exception& & {& & & & String path = "D:\\学历.xlsx";& & & & ExcelUtil.read(path);& & }& &&& & public static void read(InputStream is, boolean flag) throws Exception& & {& & & & Workbook wb =& & & & if(flag)& & & & {& & & & & & wb = new HSSFWorkbook(is);// 2003& & & & }& & & & else& & & & {& & & & & & wb = new XSSFWorkbook(is);// 2007& & & & }& & & & read(wb);& & }& &&& & public static void read(String fileName) throws Exception& & {& & & & Workbook wb =& & & & if(fileName.endsWith(EXCEL_2007))& & & & {& & & & & & wb = new XSSFWorkbook(fileName);& & & & }& & & & else& & & & {& & & & & & File f = new File(fileName);& & & & & & FileInputStream is = new FileInputStream(f);& & & & & & POIFSFileSystem fs = new POIFSFileSystem(is);& & & & & & wb = new HSSFWorkbook(fs);& & & & & & is.close();& & & & }& & & & read(wb);& & }& &&& & public static void read(Workbook wb) throws Exception& & {& & & & try& & & & {& & & & & & for(int k = 0; k & wb.getNumberOfSheets(); k++)& & & & & & {& & & & & & & & // sheet& & & & & & & & Sheet sheet = wb.getSheetAt(k);& & & & & & & & int rows = sheet.getPhysicalNumberOfRows();& & & & & & & & for(int r = 0; r & r++)& & & & & & & & {& & & & & & & & & & // 定义 row& & & & & & & & & & Row row = sheet.getRow(r);& & & & & & & & & & if(row != null)& & & & & & & & & & {& & & & & & & & & & & & int cells = row.getPhysicalNumberOfCells();& & & & & & & & & & & & for(short c = 0; c & c++)& & & & & & & & & & & & {& & & & & & & & & & & & & & Cell cell = row.getCell(c);& & & & & & & & & & & & & & if(cell != null)& & & & & & & & & & & & & & {& & & & & & & & & & & & & & & & Object value =& & & & & & & & & & & & & & & & switch(cell.getCellType())& & & & & & & & & & & & & & & & {& & & & & & & & & & & & & & & & & &&& & & & & & & & & & & & & & & & & & case Cell.CELL_TYPE_FORMULA:& & & & & & & & & & & & & & & & & & & & value = cell.getCellFormula();& & & & & & & & & & & & & & & & & & & && & & & & & & & & & & & & & & & & & case Cell.CELL_TYPE_NUMERIC:& & & & & & & & & & & & & & & & & & & & if(HSSFDateUtil.isCellDateFormatted(cell))& & & & & & & & & & & & & & & & & & & & {& & & & & & & & & & & & & & & & & & & & & & value = cell.getDateCellValue();& & & & & & & & & & & & & & & & & & & & }& & & & & & & & & & & & & & & & & & & & else& & & & & & & & & & & & & & & & & & & & {& & & & & & & & & & & & & & & & & & & & & & value = cell.getNumericCellValue();& & & & & & & & & & & & & & & & & & & & }& & & & & & & & & & & & & & & & & & & && & & & & & & & & & & & & & & & & & case Cell.CELL_TYPE_STRING:& & & & & & & & & & & & & & & & & & & & value = cell.getStringCellValue();& & & & & & & & & & & & & & & & & & & && & & & & & & & & & & & & & & & & & case Cell.CELL_TYPE_BOOLEAN:& & & & & & & & & & & & & & & & & & & & value = cell.getBooleanCellValue();& & & & & & & & & & & & & & & & & & & & cell.getDateCellValue();& & & & & & & & & & & & & & & & & & & && & & & & & & & & & & & & & & & & & default:& & & & & & & & & & & & & & & & }& & & & & & & & & & & & & & & & System.out.println(value);& & & & & & & & & & & & & & }& & & & & & & & & & & & }& & & & & & & & & & }& & & & & & & & }& & & & & & }& & & & }& & & & catch(Exception e)& & & & {& & & & & & e.printStackTrace();& & & & }& & }& &&}&
英文原文:Java Code Geeks,翻译:ImportNew-朱伟杰这篇文章会讲述 2012 年发生的一些大大小小事件,并且对 2013 年进行一点预测。有些仅仅只是猜测而已&.好吧,我只能说我邪恶的一面已经暴露出来了。多的就不说了,我们来看看 2012 年发生的关于 Java 的一些事情。
2012 & 回顾对于 Java,JVM 和社区而言,...&
英文原文:,翻译:&-&这篇文章会讲述 2012 年发生的一些大大小小事件,并且对 2013 年进行一点预测。有些仅仅只是猜测而已&.好吧,我只能说我邪恶的一面已经暴露出来了。多的就不说了,我们来看看 2012 年发生的关于 Java 的一些事情。
2012 & 回顾对于 Java,JVM 和社区而言,2012 年是动荡的一年。James Governer(RedMonk 的分析师)说过&2012 是 Java 发展的第二个阶段的曙光&。
Java 进入云计算(这次是来真的)基于 Java/JVM 提供的云平台在 2012 年成为了现实,它带来了很多新的 PAAS 和 IAAS 产品。,,,&,&&现在只是众多云平台中的 5 个而已。对于作为开发者的你而言,这意味着什么呢?好吧,这意味则你有更多的选择,并且可以花很少的成品来使用不同的云空间。我强烈建议你在空闲的时候试用一下这些产品(你只需要花费几分钟的时间就可以创建一个免费账号),然后来看看这些东西到底是什么。与之相反的是,这个领域还缺少一个行业标准,尽管 JEE8 承诺会改变这个现状(假设提供商们都参与的话)&&但是在接下来的几年里你还是需要仔细考虑锁定某一个平台。如果你比较关心如何让任意的服务/代码能够在不同的平台上运行的话,那么我推荐你去看看&&的 API。诚然,很多提供商在充分利用 JVM 的时候都是非常谨慎的,尤其是对于多客户共享的问题,同样还有垃圾回收和在虚拟环境上的性能问题。有些公司,譬如&&&(免责声明:我是它们的 CTO),提供了缓解这些问题的方案。
Java社区的繁荣虽然有很多主流媒体报道称&开发者渐渐离开 Java 平台&或者&Java 已死&,但是 Java 的社区依旧很繁荣。现在的&&(JUGs) 的数目比以前多了很多,它们由来自世界各地的超过 400,000 的开发者组成。尤为引人注目的是它们其中的一个,( London Java Community),它赢得了很多奖项,其中包含 Duke s Choice 大奖以及年度最杰出 JCP 成员(分享该奖项的还有 SouJava&&巴西最主要的 JUG)。世界级的 Java 巡回会议,例如&,&当然也包含&,举办的次数越来越多,而且门票都是提前售罄。除此之外,千人左右的规模的区域性会议,也保持的很好。Oracle 的&&也发行的很好,订阅者的数量已经超过了 100,000。Java 的坚定的支持者,例如&,&和&&的读者的数量也在不断增长。
OpenJDKOpenJDK 在 2012 年做了一个影响深远的改革,现在一个新的记分卡制度可以让这个更加壮大的社区能够对社区的管理,开发和透明度进行很好的反馈。2012 年,加入 OpenJDK 的个人和组织的数目已经破纪录了。特别值得一提的是,移植到 ARM 处理器以及在图形卡(graphic card)上运行 Java(Project Sumatra)这两个项目都是今年的亮点。
Java Community Process (JCP)Java Community Process(JCP),Java 标准的主要社区,也还是生机勃勃,有大量的新注册用户,竞争非常激烈。除了处理商标,工业生产和 Java 的授权等重要商业问题外,在技术方面关于 Java 规范请求(Java Specification Request-JSRs)的主题也被重新关注起来。特别值得一提的是,新的采纳一个 JSR()的规划是被 JCP 强力支持的。
Java&和 JVMJVM 一直都在通过 OpenJDK 进行快速发展&&加入到 Java 8 里的 Java 增强提议(Java Enhancement Proposals&&JEPs)的。Jigsaw 的退出很让人失望,不过相比较缺乏大量的厂商支持和大量的技术工作要做而言,这个决定是很明智的。
JEE / SpringJEE7 的进展也非常顺利(而且很快就会发布),它给 Java 开发者带来了处理现代 web(JSON,Web Sockets 等等)的标准。当然,很多开发者都在已经在使用 SpringSource 的 API 套件,不过在规范层面得到支持会更好。
快速 Web 开发基于 Java/JVM 的 web 快速开发框架最终得到了它们应有的肯定。类似于&,,,&等框架给 Java 开发者类似于 Rails 和 Django 等框架的开发体验。
Mechanical Sympathy2012 年的一个焦点是 Mechanical Sympathy(Martin Thompson 在他的上杜撰的)。现在趋势已经改变了,我们必须要关心多核的机器和虚拟化的系统。Java 开发者需要开始考虑 Java 和 JVM 如何和底层的平台和硬件进行交互的问题了。专注于性能的公司,例如&,一直在构建一些工具来帮助开发者理解这个复杂的领域,这样的话,开发者就可以放心地把书架上的硬件手册都拿下来了。
2013 & 预测未来对于未来的预测往往是很有趣的,现在我们来看看一些对于 2013 年的预测!
Java8&会按时发布Java 8 支持 Nashorn,Lambda,加上对于 ARM 处理器的支持,将会给那些在 web 和移动开发前沿的开发者带来更多的机会。我预计 Java 8 会很快被广泛采用(会比 Java 7 快不少)。不过,由于 IOS 和 Android 设备上没有 JVM,还是会减少一部分采用量。
Java在云端的商业化2013 年将会是 Java/JVM 在云端商业化的一年&&很多和多租户和内存管理的问题都会消除,并且一个丰富的 SASS 生态系统会开始慢慢形成。那些允许企业把自己内部的 Java 应用搬到云端的组织将会是商业上的赢家。在这个领域,我们也会见证一些大的厂商兼并一些有技术实力的小公司的例子。
OpenJDKOpenJDK 会通过继续保持真正的开放,通过使用基于 JIRA 的公开的问题追踪,以及一个分布式的对所有开发者可用的构建和一个优秀的 code review 和 patch 系统。Oracle,IBM 以及其他的主要提供商都积极主动把它们自己内部的测试套件公开出来,捐献给这个项目,让大家共同受益。
JVM语言和其他语言多亏新增的静态编译以及改善的 IDE 工具,Groovy 将会复活。特别是 Grails 将会成为一个更加吸引人的快速开发框架,并且它会给中等规模的 web 应用带来相当不错的性能提升。Scala 会一直使人保持兴奋,不过它只会在小团队里获得成功。Clojure 会继续在小的细分领域里保持自己的地位。Java 会继续帮助它们在实际数量和占有率上持续增长。一个随机的预测是JRuby会诱惑那些想利用 JVM 的性能和可扩展性的 Rails 开发者。
类层次结构图:
java.lang.Object
--java.awt.Container
--javax.swing.JComponent
--javax.swing.JTabel
在使用JTable以前,我...&
类层次结构图:
java.lang.Object
--java.awt.Container
--javax.swing.JComponent
--javax.swing.JTabel
在使用JTable以前,我们先看一下它的构造函数有哪些, 以及应该如何使用:
JTabel构造函数:
JTable():建立一个新的JTables,并使用系统默认的Model.
JTable(int numRows,int numColumns):建立一个具有numRows行,numColumns列的空表格,使用的是DefaultTableModel.
JTable(Object[][] rowData,Object[][] columnNames):建立一个显示二维数组数据的表格,且可以显示列的名称。
JTable(TableModel dm):建立一个JTable,有默认的字段模式以及选择模式,并设置数据模式。
JTable(TableModel dm,TableColumnModel cm):建立一个JTable,设置数据模式与字段模式,并有默认的选择模式。
JTable(TableModel dm,TableColumnModel cm,ListSelectionModel sm):建立一个JTable,设置数据模式、字段模式、与选择模式。
JTable(Vector rowData,Vector columnNames):建立一个以Vector为输入来源的数据表格,可显示行的名称。
我们先以Array构造方式,说明如何利用JTable来建立一个简单的表格:
import&javax.swing.*;
import&java.awt.*;
import&java.awt.event.*;
import&java.util.*;
public&class&SimpleTable{
public&SimpleTable(){&&&&&JFrame&f=new&JFrame();&&&&&Object[][]&playerInfo={&&&&&&&&&&&&&&&&&{"阿呆",new&Integer(66),new&Integer(32),new&Integer(98),new&Boolean(false)},&&&&&&&&&&&&&&&&{"阿呆",new&Integer(82),new&Integer(69),new&Integer(128),new&Boolean(true)},&&&&};&&&&String[]&Names={"姓名","语文","数学","总分","及格"};&&&&JTable&table=new&JTable(playerInfo,Names);&&&&table.setPreferredScrollableViewportSize(new&Dimension(550,30));&&&&JScrollPane&scrollPane=new&JScrollPane(table);&&&&f.getContentPane().add(scrollPane,BorderLayout.CENTER);&&&&f.setTitle("Simple&Table");&&&&f.pack();&&&&f.show();
&&&&f.addWindowListener(new&WindowAdapter()&{&&&&&&&&&&&&&&&&&&&&&&&&public&void&windowClosing(WindowEvent&e)&{&&&&&&&&&&&&&&&&&&&&&&&&&&System.exit(0);&&&&&&&&&&&&&&&&&&&&&&&&}&&&&&&&&&&&&&&&&&&&&&&});&&&}&&&public&static&void&main(String[]&args){&&&&&SimpleTable&b=new&SimpleTable();&&&}&&}&表格由两部份组成:分别是行标题(Column Header)与行对象(Column Object).利用JTable所提供的getTableHeader()方法取得行标题。在这个例子中,我们将JTable放在 JScrollPane中,这种做法可以将Column Header与Colmn Object完整的显示出来,因为JScrollPane会自动取得Column Header.但如果文坛读者将上面第15行去掉并修改第16行:f.getContentPane().add(table,BorderLayout.CENTER); 则运行结果你会发现Column Header不见了。如果你不想用JScrollPane,要解决这个问题,你必须将程序修改如下:JTable table=new JTable(p,n);table.setPreferredScrollableViewportSize(new Dimension(550,30));f.getContentPane().add(table.getTableHeader(),BorderLayout.NORTH);f.getContentPane().add(table,BorderLayout.CENTER);运行结果就会跟之前一样有行标题了.上面的运行结果就会跟发现,每个字段的宽度都是一样的,除非你自行拉曳某个列宽。若我们想一开始就设置列宽的值,可以 利用TableColumn类所提供的setPreferredWidth()方法来设置,并可利用JTable类所提供的 setAutoResizeMode()方法来设置调整某个列宽时其他列宽的变化情况,我们看下面这个例子:
import&javax.swing.*;
import&javax.swing.table.*;
import&java.awt.*;
import&java.awt.event.*;
import&java.util.*;
public&class&SimpleTable2{
public&SimpleTable2(){&&&&JFrame&f=new&JFrame();&&&&Object[][]&p={&&&&&&{"阿呆",new&Integer(66),new&Integer(32),new&Integer(98),new&Boolean(false),new&Boolean(false)},&&&&&&{"阿呆",new&Integer(82),new&Integer(69),new&Integer(128),new&Boolean(true),new&Boolean(false)},&&&&};&&&&String[]&n={"姓名","语文","数学","总分","及格","作弊"};&&&&TableColumn&column=null;&&&&JTable&table=new&JTable(p,n);&&&&table.setPreferredScrollableViewportSize(new&Dimension(550,30));&&&&table.setAutoResizeMode(JTable.AUTO_RESIZE_SUBSEQUENT_COLUMNS);&&&&//利用JTable中的getColumnModel()方法取得TableColumnModel对象;再利用TableColumnModel界面&所定义的getColumn()方法取TableColumn对象,利用此对象的setPreferredWidth()方法就可以控制字段的宽度.
&&&&for&(int&i=0;i&6;i++){&&&&&&column=table.getColumnModel().getColumn(i);&&&&&&if&((i%2)==0)&column.setPreferredWidth(150);&&&&&&else&column.setPreferredWidth(50);&&&&}&&&&JScrollPane&scrollPane=new&JScrollPane(table);&&&&f.getContentPane().add(scrollPane,BorderLayout.CENTER);&&&&f.setTitle("Simple&Table");&&&&f.pack();&&&&f.show();&&&&f.setVisible(true);&&&&f.addWindowListener(new&WindowAdapter()&{&&&&&&&&&&&&&&&&&&&&&&&&public&void&windowClosing(WindowEvent&e)&{&&&&&&&&&&&&&&&&&&&&&&&&&&System.exit(0);&&&&&&&&&&&&&&&&&&&&&&&&}&&&&&&&&&&&&&&&&&&&&&&});&&&&&&}
public&static&void&main(String[]&args){&&&&new&SimpleTable2();}}列可调整的5个参数:AUTO_RESIZE_SUBSEQUENT_COLUMENS:当调整某一列宽时,此字段之后的所有字段列宽都会跟着一起变动。此为系统默认值。AUTO_RESIZE_ALL_COLUMNS:当调整某一列宽时,此表格上所有字段的列宽都会跟着一起变动。AUTO_RESIZE_OFF:当调整某一列宽时,此表格上所有字段列宽都不会跟着改变。AUTO_RESIZE_NEXT_COLUMN:当调整某一列宽时,此字段的下一个字段的列宽会跟着改变,其余均不会变。AUTO_RESIZE_LAST_COLUMN:当调整某一列宽时,最后一个字段的列宽会跟着改变,其余均不会改变。由以上范例可知,利用Swing来构造一个表格其实很简单的,只要你利用Vector或Array来作为我们表格的数据输入,将Vector或Array 的内容填入JTable中,一个基本的表格就产生了。不过,虽然利用JTable(Object[][] rowData,Object[][] columnNames)以及JTable(Vector rowData,Vector columnNames)构造函数来构造构造JTable很方便,但却有些缺点。例如上例中,我们表格中的每个字段(cell)一开始都是默认为可修改 的,用户因此可能修改到我们的数据;其次,表格中每个单元(cell)中的数据类型将会被视为同一种。在我们的例子中,数据类型皆被显示为String的 类型,因此,原来的数据类型声明为Boolean的数据会以String的形式出现而不是以检查框(Check Box)出现。除此之外,如果我们所要显示的数据是不固定的,或是随情况而变,例如同样是一份成绩单,老师与学生所看到的表格就不会一样,显示的外观或操 作模式也许也不相同。为了因应这些种种复杂情况,上面简单的构造方式已不宜使用,Swing提供各种Model(如:TableModel、 TableColumnModel与ListSelectionModel)来解决上述的不便,以增加我们设计表格的弹性。我们下面就先对 TableModel来做介绍:
8-2:TableModelTableModel类本身是一个interface,在这个interface里面定义了若干的方法:包括了存取表格字段(cell)的内容、计算表格 的列数等等的基本存取操作,让设计者可以简单地利用TableModel来实作他所想要的表格。TableModel界面是放在 javax.swing.table package中,这个package定义了许多JTable会用到的各种Model,读者可利用java api文件找到这个package,并由此package找到各类或界面所定义的方法。TableModel方法:void addTableModelListener(TableModelListener l):使表格具有处理TableModelEvent的能力。当表格的Table Model有所变化时,会发出TableModel Event事件信息.Class getColumnClass(int columnIndex):返回字段数据类型的类名称.int getColumnCount():返回字段(行)数量.String getColumnName(int columnIndex):返回字段名称.int getRowCount():返回数据列数量.Object getValueAt(int rowIndex,int columnIndex):返回数据某个cell中的值.boolean isCellEditable(int rowIndex,int columnIndex):返回cell是否可编辑,true的话为可编辑.void removeTableModelListener(TableModelListener l):从TableModelListener中移除一个listener.void setValueAt(Object aValue,int rowIndex,int columnIndex):设置某个cell(rowIndex,columnIndex)的值;由于TableModel本身是一个Interface,因此若要直接实现此界面来建立表格并不是件轻松的事.幸好java提供了两个类分别实现了 这个界面,一个是AbstractTableModel抽象类,一个是DefaultTableModel实体类.前者实现了大部份的 TableModel方法,让用户可以很有弹性地构造自己的表格模式;后者继承前者类,是java默认的表格模式.这三者的关系如下所示:TableModel---implements---&AbstractTableModel-----extends---&DefaultTableModel
8-3:AbstractTableModel:java提供的AbstractTableModel是一个抽象类,这个类帮我们实现大部份的TableModel方法,除了 getRowCount(),getColumnCount(),getValueAt()这三个方法外.因此我们的主要任务就是去实现这三个方法.利用 这个抽象类就可以设计出不同格式的表格.我们来看看它所提供的方法.AbstractTableModel方法:void addTableModelListener(TableModelListener l):使表格具有处理TableModelEvent的能力.当表格的Table Model有所变化时,会发出TableModelEvent事件信息.int findColumn(String columnName):寻找在行名称中是否含有columnName这个项目.若有,则返回其所在行的位置;反之则返回-1表示未找到.void fireTableCellUpdated(int row, int column):通知所有的Listener在这个表格中的(row,column)字段的内容已经改变了.void fireTableChanged(TableModelEvent e):将所收的事件通知传送给所有在这个table model中注册过的TableModelListeners.void fireTableDataChanged():通知所有的listener在这个表格中列的内容已经改变了.列的数目可能已经改变了,因此JTable可能需要重新显示此表格的结构.void fireTableRowsDeleted(int firstRow, int lastRow):通知所有的listener在这个表格中第firstrow行至lastrow列已经被删除了.void fireTableRowsUpdated(int firstRow, int lastRow):通知所有的listener在这个表格中第firstrow行至lastrow列已经被修改了.void fireTableRowsInserted(int firstRow, int lastRow):通知所有的listener在这个表格中第firstrow行至lastrow列已经被加入了.void fireTableStructureChanged():通知所有的listener在这个表格的结构已经改变了.行的数目,名称以及数据类型都可能已经改变了.Class getColumnClass(int columnIndex):返回字段数据类型的类名称.String getColumnName(int column):若没有设置列标题则返回默认值,依次为A,B,C,...Z,AA,AB,..;若无此column,则返回一个空的String.&Public EventListener[] getListeners(Class listenerType):返回所有在这个table model所建立的listener中符合listenerType的listener,并以数组形式返回.boolean isCellEditable(int rowIndex, int columnIndex):返回所有在这个table model所建立的listener中符合listenerType形式的listener,并以数组形式返回.void removeTableModelListener(TableModelListener l):从TableModelListener中移除一个listener.void setValueAt(Object aValue, int rowIndex, int columnIndex):设置某个cell(rowIndex,columnIndex)的值.若你仔细比较TableModel所定义的方法与上述AbstractTableModel所提供的方法,你可以发 现,AbstractTableModel抽象类并没有实现getRowCount(),getColumnCount(),getValueAt()这 三个方法,这也就是为什么我们要去实现这三个方法的原因.下面我们来看如何使用AbstractTableModel来实作出自己想要的表格模式.范例:TableModel1.java
这样"作弊"会以Check Box显示,数据类型一律靠右显示,String类型一律靠左显示.TableModel2.java&
8-4:TableColumnModel:TableColumnModel本身是一个Interface,里面定义了许多与表格的"列(行)"有关的方法,例如增加列,删除列,设置与取得"列" 的相关信息.通常我们不会直接实现TableColumnModel界面,而是会利用JTable的getColumnModel()方法取得 TableColumnModel对象,再利用此对象对字段做设置.举例来说,如果我们想设计的表格是包括有下拉式列表的Combo Box,我们就能利用TableColumnModel来达到这样的效果.我们先看看下面的例子:
&&&& 读者运行此程序可以发现,利用继承AbstractTableModel抽象类所产生的JTable的内容是不能被修改的.那如果想要让用户可以修改表格 中的某一个字段,例如勾选Check Box或是直接修改某个字段的数字,该怎么做呢?很简单,只要我们在范例中的MyTable类中覆写AbstractTableModel抽象类中的 isCellEditable()方法即可.下面即是isCellEditable()的实作:public boolean isCellEditable(int rowIndex,int columnIndex){}在isCellEditable()中,我们只有一行简单的程序代码:return true,意思是将我们表格内的每个cell都变成可修改.但仅仅修改这个程序代码还不行,你可以发现虽然表格现在变成了可以修改了,但更改完之后按下 Enter 键,内容马上恢复成原有的值!解决的方法是覆写AbstractTableModel抽象类中的setValueAt()方法,这个方法主要是让我们将改 过的值存入表格中,如下所示:public void setValueAt(Object value,int row,int col){p[row][col]=fireTableCellUpdated(row,col);}其中value为我们所更改的值,我们将value存入p[row][col]中,并且调用firTableCellUpdated()函数来告诉我们的 系统表格已经做了更改了,关于这一部份,我们后面会再对事件处理作详细地介绍,在此范例中有没有加入fireTableCellUpdated()方法对 运行结果不会造成影响.
8-5:SelectionModel表格的选择模式是依据我们前面所讲的ListSelectionModel而来,因此它的操作模式与事件处理跟JList没什么分别!我们稍微复习一下ListSelectionModel这个Interface,它包含了3个常数值,如下:static int SINGLE_SELECTIONstatic int SINGLE_INTERVAL_SELECTIONstatic int MULTIPLE_INTERVAL_SELECTION分别可让用户作单一选择,连续区间选择与多重选择.当用户作后面两个模式的操作时,应配合 Shift 键或 Ctrl 键.要使用ListSelectionModel可利用JTable的getSelectionModel()方法取得 ListSelectionModel对象,再利用ListSelectionModel界面所定义的setSelectionModel()来设置选择 模式.如同JList一般,当用户对表格作数据域位的选取时会产生ListSelectionEvent事件,要处理这个事件就必须实现 ListSelectionListener这个界面,此界面定义了一个方法,那就是valueChanged().我们来看下面的例子,用户可在按钮上 选择哪种选择模式,当用户选取表格数据时,程序会将用户选取的数据显示在表格下面的JLabel中.SelectionModelDemo.java
&&&&& 说明:在此范例中,我们要处理ActionEvent与ListSelectionEvent,因此在程序中我们要实现ActionListenrer与 ListSelectionListener界面,而ListSelectionEvent是属于Swing事件,因此程序中我们要import javax.swing.event package进来.
8-6:DefaultTableModel我们曾提到过DefaultTableModel类,并说明了此类是继承AbstractTableModel抽象类而来,且实现了 getColumnCount(),getRowCount()与getValueAt()3个方法.因此在实际的使用 上,DefaultTableModel比AbstractTableModel要来得简单许多,也较常被拿来使用.DefaultTableModel 内部使用Vector来使用表格的数据,若佻所要显示的表格格式是比较单纯的变化,笔者建议使用DefaultTableModel类会来得方便也简单许 多.若佻所要显示的数据模式非常复杂,例如我们所举的成绩表格外加学生选课信息等,像这类的表格通常显示的信息会因人面异,因此使用 AbstractTableModel会比较容易设计些.下面是DefaultTableModel的构造函数:DefaultTableModel():建立一个DefaultTableModel,里面没有任何数据.DefaultTableModel(int numRows,int numColumns):建立一个指定行列数的DefaultTableModel.DefaultTableModel(Object[][] data,Object[] columnNames):建立一个DefaultTableModel,输入数据格式为Object Array.系统会自动调用setDataVector()方法来设置数据。DefaultTableModel(Object[] columnNames,int numRows):建立一个DefaultTableModel,并具有Column Header名称与行数信息。DefaultTableModel(Vector columnNames,int numRows):建立一个DefaultTableModel,并具有column Header名称与行数信息。DefaultTableModel(Vector data,Vector columnNames):建立一个DefaultTableModel,输入数据格式为Vector.系统会自动调用setDataVector()方法来设置数据。DefaultTableModel类提供相当多好用的方法,如之前我们谈论过的 getColumnCount(),getRowCount(),getValueAt(),isCellEditable(),setValueAt() 等方法,均可直接使用。且DefaultTableModel也提供了addColumn()与addRow()等方法,可让我们随时增加表格的数据。下 面我们就举一个动态增加表格字段的例子:
import&java.awt.*;
import&java.awt.event.*;
import&java.util.V
import&javax.swing.*;
import&javax.swing.event.*;
import&javax.swing.table.*;
public&class&AddRemoveCells&implements&ActionListener{JTable&table&=&null;DefaultTableModel&defaultModel&=&null;
public&AddRemoveCells(){&&&&JFrame&f&=&new&JFrame();&&&&String[]&name&=&{"字段&1","字段&2","字段&3","字段&4","字段&5"};&&&&String[][]&data&=&new&String[5][5];&&&&int&value&=1;&&&&for(int&i=0;&i&data.&i++){&&&&&&for(int&j=0;&j&data.length&;&j++)&&&&&&data[j]&=&String.valueOf(value++);&&&&}
&&&&defaultModel&=&new&DefaultTableModel(data,name);&&&&table=new&JTable(defaultModel);&&&&table.setPreferredScrollableViewportSize(new&Dimension(400,&80));&&&&JScrollPane&s&=&new&JScrollPane(table);
&&&&JPanel&panel&=&new&JPanel();&&&&JButton&b&=&new&JButton("增加行");&&&&panel.add(b);&&&&b.addActionListener(this);&&&&b&=&new&JButton("增加列");&&&&panel.add(b);&&&&b.addActionListener(this);&&&&b&=&new&JButton("删除行");&&&&panel.add(b);&&&&b.addActionListener(this);&&&&b&=&new&JButton("删除列");&&&&panel.add(b);&&&&b.addActionListener(this);
&&&&Container&contentPane&=&f.getContentPane();&&&&contentPane.add(panel,&BorderLayout.NORTH);&&&&contentPane.add(s,&BorderLayout.CENTER);
&&&&f.setTitle("AddRemoveCells");&&&&f.pack();&&&&f.setVisible(true);
&&&&f.addWindowListener(new&WindowAdapter()&{&&&&&&public&void&windowClosing(WindowEvent&e)&{&&&&&&&&System.exit(0);&&&&&&}&&&&});}
/*要删除列必须使用TableColumnModel界面定义的removeColumn()方法。因此我闪先由JTable类的&getColumnModel()方法取得TableColumnModel对象,再由TableColumnModel的getColumn()方法取&得要删除列的TableColumn.此TableColumn对象当作是removeColumn()的参数。删除此列完毕后必须重新设置列数,也就是&使用DefaultTableModel的setColumnCount()方法来设置。*/
public&void&actionPerformed(ActionEvent&e){&&&&if(e.getActionCommand().equals("增加列"))&&&&defaultModel.addColumn("增加列");&&&&if(e.getActionCommand().equals("增加行"))&&&&defaultModel.addRow(new&Vector());&&&&if(e.getActionCommand().equals("删除列")){&&&&&&int&columncount&=&defaultModel.getColumnCount()-1;&&&&&&if(columncount&&=&0)&{&&&&//若columncount&0代表已经没有任何列了。
&&&&&&&&TableColumnModel&columnModel&=&table.getColumnModel();&&&&&&&&TableColumn&tableColumn&=&columnModel.getColumn(columncount);&&&&&&&&columnModel.removeColumn(tableColumn);&&&&&&&&defaultModel.setColumnCount(columncount);&&&&&&}&&&&}&&&&if(e.getActionCommand().equals("删除行")){&&&&&&int&rowcount&=&defaultModel.getRowCount()-1;//getRowCount返回行数,rowcount&0代表已经没有任何行了。
&&&&&&if(rowcount&&=&0){&&&&&&&&defaultModel.removeRow(rowcount);&&&&&&&&defaultModel.setRowCount(rowcount);
/*删除行比较简单,只要用DefaultTableModel的removeRow()方法即可。//删除行完毕后必须重新设置列数,也就是使用DefaultTableModel的setRowCount()方法来设置。*/
&&&&&&}&&&&}&&&&table.revalidate();}
public&static&void&main(String&args[])&{&&&&new&AddRemoveCells();}}&
1.定义:继承是用一个类继承另一个类的属性和方法,被继承的类称为父类或超类,而经继承产生的类称为子类或派生类。根据继承机制,子类继承父类的所有成员,并相应增加自己的一些新成员。
2.关键字:extends
格式:public class(子类名) extends class(父类名){}
1.定义:继承是用一个类继承另一个类的属性和方法,被继承的类称为父类或超类,而经继承产生的类称为子类或派生类。根据继承机制,子类继承父类的所有成员,并相应增加自己的一些新成员。&
2.关键字:extends&
& 格式:public class(子类名) extends class(父类名){}&
3.注意:通常,一个子类只能继承一个父类,称为单继承,Java通过接口(interface)使子类可以继承多个父类。但Java允许多重继承,即一个父类还可以有一个父类。&
4.继承的优点:&
& 提高代码的重用性;&
& 提高程序的扩展性;&
5.继承在生活中的实例:&
& 在实际生活中先有父母才有孩子,孩子不能凭空蹦出;人和学生的关系,学生也是人,具有人的特性和习惯。&
6.子类继承父类的属性和方法:&
& 子类继承父类的所有属性和方法,担不是所有的属性和方法都可以直接使用。&
& 子类和子类的对象能直接调用父类的属性和方法的两种情况:&
& (1)子类和父类在同一个包下:&
&&&&& 私有的属性和方法以及构造方法不能被子类直接继承。&
&&&&& 默认的、受保护的、公有的属性和方法能被子类直接继承。&
& (2)子类和父类不在同一个包下:&
&&&&& 在子类的{}下,只有受保护的、公有的属性和方法能被子类直接继承。&
&&&&& 子类的对象只能直接调用父类中公有的属性和方法。&
&&&&& 私有的、默认的属性和方法不能被子类和子类的直接继承。&
1.定义:所谓的方法重写子类定义了与父类中同名的方法。&
2.重写的条件:&
& (1)必须存在继承关系。&
& (2)子类在重写方法时,重新方法的格式(返回值类型,方法名,参数个数,参数类型,参数顺序)与父类方法必须相同。&
& (3)子类方法的访问修饰符必须大于或等于父类方法的访问修饰符。&
3.子类方法调用规则:&
& 如果子类重写了父类的方法,则首先调用子类的方法,但new的对象必须是子类的。&
& 如果子类没有重写父类的方法,则调用父类的方法。&
& 即new关键字后面的构造方法是谁的就先调用谁的方法。&
& 大学生和中学生都是学生,他们都要学习,但他们学习的方法是不同的。&
1.定义:向上转型,子类对象-&父类对象&
& 格式:父类名 父类对象=new 子类的构造方法()&
2.条件:必须存在继承关系。&
3.缺点:对象发生自动转型后,所调用的方法一定是被子类重写过的方法,而不能调用子类自己定义的方法,这是由Java的编译机制造成的。&
& 优点:提高代码的重用性。&
& 英语教授可以教大学生,中学生,小学生,而不管大学生,中学生还是小学生都是学生。&
1.定义:由Java中的方法重载、方法重写、继承和自动转型等组成
1.如何学习程序设计?
JAVA是一种平台,也是一种程序设计语言,如何学好程序设计不仅仅适用于JAVA,对C++等其他程序设计语言也一样管用。有编程高手认为,JAVA也好C也好没什么分别,拿来就用。为什么他们能达到如此境界?我想是因为编程语言之间有共通之处,领会了编程的精髓,自然能够做到一通百通。如何学习程序设计理所当然也有许多共通的地方。 ...&
1.如何学习程序设计?
& &&&JAVA是一种平台,也是一种程序设计语言,如何学好程序设计不仅仅适用于JAVA,对C++等其他程序设计语言也一样管用。有编程高手认为,JAVA也好C也好没什么分别,拿来就用。为什么他们能达到如此境界?我想是因为编程语言之间有共通之处,领会了编程的精髓,自然能够做到一通百通。如何学习程序设计理所当然也有许多共通的地方。
1.1 培养兴趣
& & 兴趣是能够让你坚持下去的动力。如果只是把写程序作为谋生的手段的话,你会活的很累,也太对不起自己了。多关心一些行业趣事,多想想盖茨。不是提倡天天做白日梦,但人要是没有了梦想,你觉得有味道吗?可能像许多深圳本地农民一样,打打麻将,喝喝功夫茶,拜拜财神爷;每个月就有几万十几万甚至更多的进帐,凭空多出个"食利阶层"。你认为,这样有味道吗?有空多到一些程序员论坛转转,你会发现,他们其实很乐观幽默,时不时会冒出智慧的火花。
1.2 慎选程序设计语言
& &&&男怕入错行,女怕嫁错郎。初学者选择程序设计语言需要谨慎对待。软件开发不仅仅是掌握一门编程语言了事,它还需要其他很多方面的背景知识。软件开发也不仅仅局限于某几个领域,而是已经渗透到了各行各业几乎每一个角落。
如果你对硬件比较感兴趣,你可以学习C语言/汇编语言,进入硬件开发领域。如果你对电信的行业知识及网络比较熟悉,你可以在C/C++等之上多花时间,以期进入电信软件开发领域。如果你对操作系统比较熟悉,你可以学习C/Linux等等,为Linux内核开发/驱动程序开发/嵌入式开发打基础。如果你想介入到应用范围最广泛的应用软件开发(包括电子商务电子政务系统)的话,你可以选择J2EE或.NET,甚至LAMP组合。每个领域要求的背景知识不一样。做应用软件需要对数据库等很熟悉。总之,你需要根据自己的特点来选择合适你的编程语言。
1.3 要脚踏实地,快餐式的学习不可取
& &&&先分享一个故事。
& &&&有一个小朋友,他很喜欢研究生物学,很想知道那些蝴蝶如何从蛹壳里出来,变成蝴蝶便会飞。有一次,他走到草原上面看见一个蛹,便取了回家,然后看着,过了几天以后,这个蛹出了一条裂痕,看见里面的蝴蝶开始挣扎,想抓破蛹壳飞出来。这个过程达数小时之久,蝴蝶在蛹里面很辛苦地拼命挣扎,怎么也没法子走出来。这个小孩看着看着不忍心,就想不如让我帮帮它吧,便随手拿起剪刀在蛹上剪开,使蝴蝶破蛹而出。但蝴蝶出来以后,因为翅膀不够力,变得很臃肿,飞不起来。
这个故事给我们的启示是:欲速则不达。
& && &浮躁是现代人最普遍的心态,能怪谁?也许是贫穷落后了这么多年的缘故,就像当年的大跃进一样,都想大步跨入共产主义社会。现在的软件公司、客户、政府、学校、培训机构等等到处弥漫着浮躁之气。社会环境如是,我们不能改变,只能改变自己,闹市中的安宁,弥足珍贵。许多初学者C++/JAVA没开始学,立马使用VC/JBuilder,会使用VC/JBuilder开发一个HelloWorld程序,就忙不迭的向世界宣告,"我会软件开发了",简历上也大言不惭地写上"精通VC/JAVA"。结果到软件公司面试时要么被三两下打发走了,要么被驳的体无完肤,无地自容。到处碰壁之后才知道捧起《C++编程思想》《JAVA编程思想》仔细钻研,早知如此何必当初呀。
& &&&"你现在讲究简单方便,你以后的路就长了",好象也是佛经中的劝戒。
1.4 多实践,快实践
& &&&彭端淑的《为学一首示子侄》中有穷和尚与富和尚的故事。
从前,四川边境有两个和尚,一个贫穷,一个有钱。一天,穷和尚对富和尚说:"我打算去南海朝圣,你看怎么样?"富和尚说:"这里离南海有几千里远,你靠什么去呢?"穷和尚说:"我只要一个水钵,一个饭碗就够了。"富和尚为难地说:"几年前我就打算买条船去南海,可至今没去成,你还是别去吧!"一年以后,富和尚还在为租赁船只筹钱,穷和尚却已经从南海朝圣回来了。
& &&&这个故事可解读为:任何事情,一旦考虑好了,就要马上上路,不要等到准备周全之后,再去干事情。假如事情准备考虑周全了再上路的话,别人恐怕捷足先登了。软件开发是一门工程学科,注重的就是实践,"君子动口不动手"对软件开发人员来讲根本就是错误的,他们提倡"动手至上",但别害怕,他们大多温文尔雅,没有暴力倾向,虽然有时候蓬头垢面的一副"比尔盖茨"样。有前辈高人认为,学习编程的秘诀是:编程、编程、再编程,笔者深表赞同。不仅要多实践,而且要快实践。我们在看书的时候,不要等到你完全理解了才动手敲代码,而是应该在看书的同时敲代码,程序运行的各种情况可以让你更快更牢固的掌握知识点。
1.5 多参考程序代码
& &&&程序代码是软件开发最重要的成果之一,其中渗透了程序员的思想与灵魂。许多人被《仙剑奇侠传》中凄美的爱情故事感动,悲剧的结局更有一种缺憾美。为什么要以悲剧结尾?据说是因为写《仙剑奇侠传》的程序员失恋而安排了这样的结局,他把自己的感觉融入到游戏中,却让众多的仙剑迷扼腕叹息。
& & 多多参考代码例子,对JAVA而言有参考文献[4.3],有API类的源代码(JDK安装目录下的src.zip文件),也可以研究一些开源的软件或框架。
1.6 加强英文阅读能力
& &&&对学习编程来说,不要求英语,但不能一点不会,。最起码像JAVAAPI文档(参考文献[4.4])这些东西还是要能看懂的,连猜带懵都可以;旁边再开启一个"金山词霸"。看多了就会越来越熟练。在学JAVA的同时学习英文,一箭双雕多好。另外好多软件需要到英文网站下载,你要能够找到它们,这些是最基本的要求。英语好对你学习有很大的帮助。口语好的话更有机会进入管理层,进而可以成为剥削程序员的"周扒皮"。
1.7 万不得已才请教别人
请教别人之前,你应该先回答如下几个问题。
你是否在google中搜索了问题的解决办法?
你是否查看了JAVAAPI文档?
你是否查找过相关书籍?
你是否写代码测试过?
如果回答都是"是"的话,而且还没有找到解决办法,再问别人不迟。要知道独立思考的能力对你很重要。要知道程序员的时间是很宝贵的。
1.8 多读好书
& &书中自有颜如玉。比尔?盖茨是一个饱读群书的人。虽然没有读完大学,但九岁的时候比尔?盖茨就已经读完了所有的百科全书,所以他精通天文、历史、地理等等各类学科,可以说比尔?盖茨不仅是当今世界上金钱的首富,而且也可以称得上是知识的巨富。
1.9 使用合适的工具
& && &工欲善其事必先利其器。软件开发包含各种各样的活动,需求收集分析、建立用例模型、建立分析设计模型、编程实现、调试程序、自动化测试、持续集成等等,没有工具帮忙可以说是寸步难行。工具可以提高开发效率,使软件的质量更高BUG更少。组合称手的武器。到飞花摘叶皆可伤人的境界就很高了,无招胜有招,手中无剑心中有剑这样的境界几乎不可企及。
2.软件开发学习路线
& &&&两千多年的儒家思想孔孟之道,中庸的思想透入骨髓,既不冒进也不保守并非中庸之道,而是找寻学习软件开发的正确路线与规律。
& & 从软件开发人员的生涯规划来讲,我们可以大致分为三个阶段,软件工程师&软件设计师&架构设计师或项目管理师。不想当元帅的士兵不是好士兵,不想当架构设计师或项目管理师的程序员也不是好的程序员。我们应该努力往上走。让我们先整理一下开发应用软件需要学习的主要技术。
A.基础理论知识,如操作系统、编译原理、数据结构与算法、计算机原理等,它们并非不重要。如不想成为计算机科学家的话,可以采取"用到的时候再来学"的原则。
B.一门编程语言,现在基本上都是面向对象的语言,JAVA/C++/C#等等。如果做WEB开发的话还要学习HTML/Jav**ript等等。
C.一种方法学或者说思想,现在基本都是面向对象思想(OOA/OOD/设计模式)。由此而衍生的基于组件开发CBD/面向方面编程AOP等等。
D.一种关系型数据库,ORACLE/SqlServer/DB2/MySQL等等
E.一种提高生产率的IDE集成开发环境JBuilder/Eclipse/VS.NET等。
F.一种UML建模工具,用ROSE/VISIO/钢笔进行建模。
G.一种软件过程,RUP/XP/CMM等等,通过软件过程来组织软件开发的众多活动,使开发流程专业化规范化。当然还有其他的一些软件工程知识。
H.项目管理、体系结构、框架知识。
正确的路线应该是:B&C&E&F&G&H。
还需要补充几点:
1).对于A与C要补充的是,我们应该在实践中逐步领悟编程理论与编程思想。新技术虽然不断涌现,更新速度令人眼花燎乱雾里看花;但万变不离其宗,编程理论与编程思想的变化却很慢。掌握了编程理论与编程思想你就会有拨云见日之感。面向对象的思想在目前来讲是相当关键的,是强势技术之一,在上面需要多投入时间,给你的回报也会让你惊喜。
2).对于数据库来说是独立学习的,这个时机就由你来决定吧。
3).编程语言作为学习软件开发的主线,而其余的作为辅线。
4).软件工程师着重于B、C、E、D;软件设计师着重于B、C、E、D、F;架构设计师着重于C、F、H。
3.如何学习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公司的工程师打国际长途甚至飘洋过海来告诉你他编写的类该如何使用吧。他们只能提供文档给我们查看,JAVADOC文档(参考文献4.4)就是这样的文档,它可以说是程序员与程序员交流的文档。
基本API指的是实现了一些底层功能的类,通用性较强的API,如字符串处理/输入输出等等。我们又把它成为类库。熟悉API的方法一是多查JAVADOC文档(参考文献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公司开发,在硝烟弥漫的JAVAIDE大战中,以其快速的版本更新击败IBM的VisualAgeforJAVA等而成就一番伟业。IBM在VisualAgeforJAVA上已经无利可图之下,干脆将之贡献给开源社区,成为Eclipse的前身,真所谓"柳暗花明又一村"。浴火重生的Eclipse以其开放式的插件扩展机制、免费开源获得广大程序员(包括几乎所有的骨灰级程序员)的青睐,极具发展潜力。
3.1.6 学习软件工程
& &&&对小型项目而言,你可能认为软件工程没太大的必要。随着项目的复杂性越来越高,软件工程的必要性才会体现出来。参见"软件开发学习路线"小节。
3.2 学习要点
& && &确立的学习路线之后,我们还需要总结一下JAVA的学习要点,这些要点在前文多多少少提到过,只是笔者觉得这些地方特别要注意才对它们进行汇总,不要嫌我婆婆妈妈啊。
3.2.1 勤查API文档
& && &当程序员编写好某些类,觉得很有成就感,想把它贡献给各位苦难的同行。这时候你要使用"javadoc"工具(包含在JDK中)生成标准的JAVADOC文档,供同行使用。J2SE/J2EE/J2ME的DOC文档是程序员与程序员交流的工具,几乎人手一份,除了菜鸟之外。J2SEDOC文档官方下载地址:/j2se/1.5.0/download.jsp,你可以到google搜索CHM版本下载。也可以在线查看:/j2se/1.5.0/docs/api/index.html。
& && &对待DOC文档要像毛zhuxi语录,早上起床念一遍,吃饭睡觉前念一遍。
当需要某项功能的时候,你应该先查相应的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.jcp.org下载JSRXXX规范,多读规范,这是最权威准确最新的教材。第二层含义是编程规范,如果你使用了大量的独特算法,富有个性的变量及方法的命名方式;同时,没给程序作注释,以显示你的编程功底是多么的深厚。这样的代码别人看起来像天书,要理解谈何容易,更不用说维护了,必然会被无情地扫入垃圾堆。JAVA编码规范到此查看或下载/docs/codeconv/,中文的也有,啊,还要问我在哪,请参考3.2.2节。
3.2.5 不局限于JAVA
& && & 很不幸,很幸运,要学习的东西还有很多。不幸的是因为要学的东西太多且多变,没时间陪老婆家人或女朋友,导致身心疲惫,严重者甚至导致抑郁症。幸运的是别人要抢你饭碗绝非易事,他们或她们需要付出很多才能达成心愿。
JAVA不要孤立地去学习,需要综合学习数据结构、OOP、软件工程、UML、网络编程、数据库技术等知识,用横向纵向的比较联想的方式去学习会更有效。如学习JAVA集合的时候找数据结构的书看看;学JDBC的时候复习数据库技术;采取的依然是"需要的时候再学"的原则。
贝福Java采用项目驱动教学,企业老总亲自授课。从七期班开始仅招收吉大学院,教学中心在南校北门剑桥园, 7*24小时对学员开放,让你感受疯狂学习Java技术的快乐。教学与项目并行,五大板块涵盖Java数据库开发、Java通信网络开发、Java Web开发、J2EE框架开发、Oracle数据库企业级项目开发。更有IBM Java相关四项认证作为支撑,让你真正品位高端赢在起跑线。本月开班,报名火热进行中,试听16课时再缴费。咨询电话:。}

我要回帖

更多关于 java api文档 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信