java核心技术 卷一 第2-3章 安装java开发工具箱和 java的基本程序设计结构

2015 6 26 java核心技术 卷一 第2-3章 安装java开发工具箱和 java的基本程序设计结构

第二章 安装java开发工具箱

1. jar xvf../scr.zip中的那个xvf是什么意思? -c 创建新的归档文件
 -t  列出归档目录
-x 解压缩已归档的指定(或所有)文件
-u 更新现有的归档文件
-v 在标准输出中生成详细输出
-f 指定归档文件名
-m 包含指定清单文件中的清单信息
-e 为捆绑到可执行 jar 文件的独立应用程序
指定应用程序入口点
-0 仅存储;不使用任何 ZIP 压缩
-M 不创建条目的清单文件
-i 为指定的 jar 文件生成索引信息
-C 更改为指定的目录并包含其中的文件

2.使用集成开发环境
1)如果要创建一个已有的工程。

2)eclipse的错误消息,通常eclipse报错会伴有一个灯泡状的图标,点击这个图标可以得到一个建议解决这个错误的方案列表。



第三章 java的基本程序设计结构
public :称为访问修饰符,用于控制程序的其他部分对这段代码的访问级别。
class :表明java程序中的全部内容都包含在类中。这里,只需要将类作为一个加载程序逻辑的容器程序的逻辑定义了应用程序的行为。
类名的标准命名规范:类名是以大写字母开头的单词。如果名字由多个单词组成,每个单词的第一个字母都应该大写。
源代码的文件名必须与公共类的名字相同。并用.java作为扩展名。
如果已经正确的命名了这个文件,并且源代码中没有任何录入错误,在编译这段源代码之后就会得到一个包含这个类字节码的文件,并于源文件存储在同一个目录下
当使用 java ClassName运行编译程序时,Java虚拟机将从指定类中的main方法开始执行,因此为了代码能够执行,在类的源文件中必须包含一个main方法。当然也可以将用户自定义的方法添加到类中,并且在main方法中调用他们。
根据Java语言规范,main方法必须声名为public
使用了System.out对象并调用了它的println方法。注意点号(.)用于调用方法。Java使用的通用语法是object.method(parameters)
在这个例子中,调用println方法并传递给它一个字符串参数。这个方法将传递给它的字符串参数显示在控制台上。java与C、C++一样,都使用双引号分隔字符串。
 
 
java中的注释不会出现在可执行程序中。 /**/注释不能嵌套。也就是说,如果代码本身包含了一个*/,就不能用/**/将注释括起来。
Java是一种强类型语言。每一个变量必须声名为一种类型。在Java中一共有8种基本类型,其中4种整型、2种浮点类型、1种表示Unicode编码的字符单元的字符类型char和1种用于表示真值的boolean类型。
Java有一个能够表示任意精度的算术包,通常称为大数值。
 
 
               //java7开始,在数字量下加_,更易读,编译器会自动去除
      System.out.println(1_000_000);
       //java7开始,加上前缀0b可以写二进制数
      System.out.println(0b1001); 
      //1100 1010 1111 1110 = 2-15 + 2-14 + 2-11 + 2-9 + 254 =32768+16384+2048+512+254
      //=51966
      System.out.println(0xCAFE);
 
 
      System.out.println(Double.POSITIVE_INFINITY);
      System.out.println(Double.NEGATIVE_INFINITY);
      System.out.println(Double.NaN);

float类型的数值有一个后缀F(3.14F)。没有后缀的浮点数值默认为double类型。
三个特殊的浮点数值:正无穷大,负无穷大,NaN(不是一个数字)。
#注意
1.不能这样测定一个特定值是否等于Double.NaN:if(x==Double.NaN) //is never true所有“非数值”都认为是不相同的。然而可以使用Double.isNaN方法:if(Double.isNaN(x)) //检测 x 是否是一个非数值
!警告
1.浮点数值不适用于禁止舍入误差的金融计算中。例如,命令System.out.println(2.0-1.1)将打印出0.8999999999999999而不是人们想象的0.9。其主要原因是数值采用二进制的系统表示,而在二进制中无法精确的表示数值1/10。如果需要在数值计算中不含有舍入误差,就应该使用BigDecimal类。
    
Unicode编码单元可以表示十六进制值,其范围从\u0000到\uffff。例如:\u2122表示注册符号(TM) ,\u03c0表示希腊字母π。除了转义序列符\u表示Unicode代码单元的编码之外,还有一些用于表示特殊字符的转义序列符。所有这些转义序列符都可以出现在字符常量或字符串的引号内。转义序列符\u还可以出现在字符常量或字符串的引号之外。在Java中char 类型采用UTF-16编码描述一个代码单元。强烈建议不要使用char类型,除非确实需要对UTF-16代码单元进行操作。最好将需要处理的字符串用抽象数据类型表示。
boolean有两个值true和false,用来判定逻辑条件。整型值和布尔值之间不能进行相互转换。在C或C++中,值0相当于false,非0相当于true。在Java中则不是这样。if(x=0)将不能通过编译,因为整数表达式x=0不能转换为布尔值。
 
 
逐一声明每一个变量可以提高程序的可读性。变量名对大小写敏感。
两种命名方式Box box;还有些程序员更加喜欢在变量名前加上前缀“a”。
声明一个变量后,必须用赋值语句对变量进行显示初始化,千万不要使用未被初始化的变量。
也可以将变量的声明和初始化放在同一行中。例如int a = 12;
在Java中,变量的声明尽可能地靠近变量第一次使用的地方。这是一种良好的程序编写风格。
在Java中,不区分变量的声明和定义。


Java中,利用关键字final表示常量。关键字final表示这个变量只能被赋值一次。一旦被赋值后,就不能在更改了。

如果希望某个常量可以在一个类的多个方法中使用,通常将这些常量称为类常量。可以使用关键字static final设置一个类常量。作为类的一个field来存在。

整数被0除将会产生一个异常,而浮点数被0除将会得到无穷大或NaN结果


自增运算符和自减运算符改变的是变量的值,所以。4++就是一条非法的语句。
int m=7;
int n=7;
int a = 2 * ++m;//now a is 16,m is 8
int b = 2 * n++;//now b is 14,n is 8

&&和||是按照短路的方式来求值的。 如果第一个操作数能确定表达式的值,第二个操作数就不必计算了。 例如,表达式
x != 0&&1/x>x+y
     //no division by 0
当x为0时,不会计算第二部分。1/x不会被计算,也不会出现除以0的错误。

位运算
例:如果n是一个整型变脸,求用2进制表示的n的第i位是0还是1.


println方法和sqrt方法存在微小的差异。println方法操作一个定义在System类中的System.out对象。但是Math类中的sqrt方法处理的不是对象,这样的方法被称为静态方法。

如果不想在数学方法名和常量名前添加前缀“ Math. ”,只要在源文件的顶部加上下面这行代码就可以了。这称之为静态导入。
import static java.lang.Math.*;

自动类型转换的规则:
当进行一个二元操作时,先要将两个操作数转换为同一种类型,然后再进行计算。
-如果两个操作数中有一个是double类型,另一个操作数就会转换为 double类型。
-否则,如果其中一个操作数是float类型,另一个操作数就会转换为 float类型。
-否则,如果其中一个操作数是long类型,另一个操作数就会转换为 long类型。
-否则,两个操作数都被转换为 int类型。


强制类型转换通过截断小数部分将浮点值转换为整型。
如果想对浮点数进行舍入运算,以便得到最接近的证书,那就需要使用Math.round方法。
double x = 9.997;
int nx = (int)Math.round(x);
现在变量nx的值为10。当调用round的时候,仍然需要使用强制类型转换(int)。其原因是round方法返回的结果为long类型。

!警告
如果一个类型强制转换为另一种类型,而又超出了目标类型的表示范围,结果就会截断成一个完全不同的值。

从概念上讲,Java字符串就是Unicode字符序列。
子串:String类的 substring方法的第二个参数是  不想 复制第一个位置。substring的工作方式的一个优点是,容易计算子串长度b-a。
拼接:Java语言允许使用“+”连接两个字符串,当将一个字符串与一个非字符串进行拼接时,后者被转换成字符串。

字符串不可变 String类中没有提供用于 修改 字符串的方法。String greeting = “Hello”,如果希望将greeting的内容修改为“Help!”,不能 直接将greeting的最后两个位置的字符修改为“p”,“!”。

该怎样修改呢? 首先提取需要的字符,然后再拼接上替换的字符串:
greeting = greeting.substring(0,3)+"p!";
这条语句将greeting的当前值修改为“Help!”
由于不能修改Java字符串中的字符,所以在Java文档中将String类对象称为不可变字符串,如同数字3永远是数字3一样,字符串“Hello”永远
包含H、e、l、l、和o的代码单元序列,而不能修改其中的任意一个字符。当然,可以 修改字符串变量greeting,让它引用另外一个字符串。这就如同可以将存放3的数值变量改为存放4一样。

检测字符串是否相等: 使用equals方法检测两个字符串是否相等
s.equals(t)。s和t既可以是字符串变量又可以是字符串常量。
如果要检测两个字符串是否相等,而不区分大小写,可以使用equalsIgnoreCase方法。
一定不能使用==运算符检测两个字符串是否相等!这个运算符 只能确定两个字符串是否放置在同一个位置上。当然,如果字符串放置在
同一个位置上,他们必然相等。但是完全有可能将内容相同的字符串的拷贝放在不同的位置上。

空串和NULL串:空串有自己的串长度(0),串内容(空)。不过String变量还可以存放一个特殊的值,名为null,表示目前没有任何对象
与该变量关联。检查一个字符串是否为空if(str.length()==0)或if(str.equals(""))。检查一个字符串是否为null,要使用if(str==null).有时要检查
一个字符串既不是null也不是空串,这时用if(str!=null && str.length() != 0)。 注意要先检查str不为null。

构建字符串:如果需要用 较短的字符串构建字符串,每次采用字符串连接的方式(“+”),都会构建一个新的String对象。既耗时,又浪费时间。
如果需要用许多小段的字符串构建一个字符串,那么应该按下列步骤进行。
1)首先构建一个空的字符串构建器:
    StringBuilder builder = new StringBuilder();
2)当每次需要添加一部分内容时,就调用append方法。
builder.append(ch);
builer.append(str);
3)在需要构建字符串时就调用toString放法,将可以得到一个String对象,其中包含了构建器的字符序列。
String completedString = builder.toString();
(jdk5.0时引入了StringBuilder类。这个类的前身是StringBuiler类。这个类的前身是StringBuffer,其效率稍有些低,但 允许采用多线程的方式执行添加和删除操作。如果所有字符串在一个单线程中编辑,则应该用StringBuilder类替代他。)

输入输出:针对控制台的。
输出:System.out.println
输入:首先需要构造一个Scanner对象,并与“标准输入流对象”System.in关联。Scanner in = new Scanner(System.in);
格式化输出:沿用C语言中的printf函数。%d,%x,%o,%s。%称为格式说明符,后面的字母称为转换符。

日期和时间的格式化选项。使用以t开始任意字母结束的的两个字母格式。
System. out .printf( "%1$s %2$tB %2$te,%2$tY" , "Due date:" , new  Date());
%之后数字为参数索引必须紧跟在%后面并以$中止



可以使用静态的 String.format方法 创建一个格式化的字符串,而不打印输出。
String message = String.format(“Hello,%s.Next year ,you'll be %d”,name,age);

文件的输入与输出
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.PrintWriter;
import java.nio.file.Paths;
import java.util.Scanner;
public class Welcome4 {
    public static void main(String[] args) {
        Scanner in;
        String str1="";
        String str2="";
        String str3="";
        String str4="";
        try {
            in = new Scanner(Paths.get("D:\\学习资料\\abc.txt"));   //用此方法对文件进行读取
            str1 = in.nextLine();
            str2 = in.next();
            str3 = in.next();
            str4 = in.next();
            System.out.println(str1);
            System.out.println(str2);
            System.out.println(str3);
            System.out.println(str4);
        } catch (IOException e) {
            e.printStackTrace();
        }
        try {
            PrintWriter out = new PrintWriter("D:\\学习资料\\def.txt");
            out.write(str1);
            out.println();
            out.write(str2);
            out.println();
            out.write(str3);
            out.println();
            out.write(str4);
            out.println();    
            out.append("输入完毕,就是这样!");
            System.out.println("输出成功!");
            out.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }
}  
当指定一个相对文件名时,文件位于Java虚拟机启动路径的相对位置。如果觉得定位文件比较烦恼,则可以考虑使用绝对路径。如
"D:\\学习资料\\def.txt"

控制流程
当需要对某个表达式的值进行多个检测时可以使用switch。
块作用域:不能在嵌套的两个块中声明相同的变量。

java中有条不成文的规定,for语句的3个部分应该对同一个计数器变量进行初始化、检测、和更新。

多重选择switch语句
例如:建立一个包含4个选项的菜单系统
Scanner in = new Scanner(System.in);
System.out.println("Select an option(1,2,3,4)");
int choice = in.nextInt();
switch(choice)
{
    case 1:
            break;
    case 2:
            break;
    case 3:
            break;
    case 4:
            break;
    default:
         //bad input
        break;
}
如果将continue语句用于for循环中,就可以跳到for循环更新部分。例如
for(count =1;count<=100;count++)
{
    System.out.println(Enter a number,-1 to quit:);
    n = in.nextInt();
    if(n<0) continue;
         sum += n;     //not executed if n <0
}

大数值
如果基本的整数和浮点数精度不能够满足需求,那么可以使用java.math包中的两个很有用的类:BigIntegerBigDecimal。可以处理包含任意长度数字序列的数值。前者实现了任意精度的整数运算,后者实现了任意精度的浮点数运算。
使用静态的valueOf方法可以将普通的数值转换为大数值:
BigInteger a =  BigInteger.valueOf(100);
如果要实现人们熟悉的算术运算,需要使用大数值类的add和multiply方法,BigInteger c = a.add(b);//c = a+b; 
BigInteger  d = c.multiply(b.add(BigInteger .valueOf(2)));//d = c * (b+2);

数组
使用数组,首先要声明数组int []a;这条语句只声明了变量a,并没有将a初始化为一个真正的数组。应该使用new关键字创建数组。

int []a = new int[100]。//数组长度可以不为常量

创建一个int数组时,所有元素自动都初始化为0。boolean数组时的元素都自动初始化为false。对象数组的元素则初始化为一个特殊值null。
一旦创建了数组,就不能改变数组的大小。如果经常需要在运行过程中扩展数组的大小,就应该使用另一种数据结构--数组列表array list。

要打印数组中的所有值 ,可以用 Arrays类中的toString 方法。 System.out.println(Arrays.toString(a));

创建数组对象同时赋予初值的简化写法。在使用这种语句时,不需要调用new。
int[] a={2,3,5,7,11,13}。

注意:Java 允许数组的长度为0.在编写一个结果为数组的方法时。如果碰巧结果为空,则这种语法形式非常有用。

在Java中,允许将一个数组变量拷贝给另一个数组变量。这时,两个变量将 引用同一个数组。
int[] luckyNumbers = smallPrimes;
luckyNumbers[5] = 12; //now smallPrimes[5] is also 12

数组拷贝:如果希望将一个数组的所有值拷贝到一个新的数组中去。就要使用Arrays类的copyTo方法。
int[] copiedLuckyNumbers = Arrays.copyOf(luckyNumbers, luckyNumbers.length);
如果要将数组的大小扩充为原来的2倍。可以这样
luckynumbers = Arrays.copyOf(luckyNumbers,2*  luckyNumbers.length );

命令行参数
每一个Java应用程序都有一个带String args[]参数的main方法。这个参数表明main方法接收一个字符串数组,也就是命令行参数。


运行结果:


数组的排序
可以使用Arrays类的sort方法,这个方法使用了优化的快速排序算法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值