天天看点

java学习笔记(一)程序基本结构

Java程序设计的基本结构

1.一个简单的Java应用程序(要十分注意java的大小写)

关键字class表明Java的全部程序都在类中(这里有一个对于类的有意思定义:将类看做是加载程序逻辑的容器,程序逻辑定义了应用程序的行为)

********************************************************************

public class FirstSample   //这一行是表明了类的类型

{

  public static void main(String[] args) //在所有包含主线程的程序中都会出现

   {

     System.out.println("HelloWorld"); //在屏幕上打印出“HelloWorld”

   }

}

在类名以及关键字方面的限制:

类名必须以字母开头,但是在后面的命名就可以随意的采用数字或者是字母,而且没有长度的限制。类名最好采用骆驼命名法(这样显得专业)

注意:

1>

所谓的驼峰命名法就是以单词组成你的函数名(方法名),变量,但是每个单词的首字母都要大写

例如:  FirstSample     isPrime

2>

System.out.print()这个方法在输出之后不换行,紧紧地跟随在最后一个字符的后面

System.out.println()这个方法在打印进行的时候,会进行换行

2.注释

注释一共有三种类型:

一。行注释以//开始,到一行的末尾结束

第二就是块注释以结尾,同样的在Java中不能再进行嵌套其他的注释符

第三就是用来自动的生成文档用法就是

3.数据类型

a.整型

整型一共有四种类型:

标准整型int(范围是正负二十亿)、

短整型short(范围是正负三万两千多)、

长整形long(反正是8个字节,大的很)、

byte(127)

注意:

1>

长整形的后面有l或L,   16进制有0x的前缀,八进制有前缀0(不过不容易与进制进行区分)

2>

从Java 7 开始就可以在数字的字面量的前面加上0b/0B,并且在数字中加上下划线例如1_000_1111,编译器在后期会把它删除,不用管。

3>

在Java中没有无符号类型

b.浮点类型

浮点类型就只有两类单精度和双精度(float/double),大部分在工程中的应用都是双精度的。注意如果要使用单精度的时候(在单精度变量的后面加上F/f后缀,双精度是默认的)

浮点数值用十六进制进行表示

注:

在十六进制表示法中,使用p表示指数而不是e

用于表示出错情况和溢出的三个特殊的浮点数值:正无穷大、负无穷小、NaN(不是数字)

能不能检测一个数据是不是非数值的一种方法(NaN的判断的方法)

//例如正整数除以0就是NaN

if(Double.isNaN(x))

//检测一个值是不是NaN

c.字符类型(char)

推荐尽量不要使用

d.变量

1>

变量的定义、变量的初始化

int variable = 100;    //所有的变量都要进行赋值

double Dvariable = 100.0;  

2>

常量的定义 在Java中利用final来指示常量,该变量只能被赋值一次,用大写

可以使用一个常量类static final 定义的数值可以在一个类中的多个“函数”使用。一般定义于main方法的外部。如果一个常量声明为public,其他的类的“函数”也可以使用这个常量。   

4.运算符

a一般的具体运算符

+ - * / %

b.在Math类中包含各式各样的数学函数:

计算数值的平方根sqrt()     例如 double y = Math.sqrt(x);

******************************************

具体的可以使用牛顿迭代法实现:

public static double sqrt(double c)

{

  if(c < 0)   return Double.NaN;

  double err = 1e - 15;

  double t = c;

  while(Math.abs(t - c / t) > err * t)  //abs是绝对值的方法

    t = (c / t + t) * 2.0;

  return t;

}

************************************************

进行幂运算所要用的pow()   

例如  double y = Math.pow(x,a);  //传入两个double参数,而且最后的计算结果也是double

进行取余运算的floorMod(position+adjustment,12)得到0到11内的数

一些三角函数方法:Math.sin()、Math.cos()、Math.tan()、Math.atan()、Math.atan2()、

指数函数Math.exp、反函数Math.log、以10为底的对数Math.log10、

圆周率Math.PI,e的常量Math.E

注:

(调用这些数学方法的方法:在源文件的顶部加上这些代码  import static java.lang.Math.*,就可以使用了)

c.数值类型转换(略)、强制转换(略)

注:

进行舍入运算就是找到最为接近的整数,调用Math.round方法

double x = 9.997;

int nx = (int)Math.round(x);   //保留为最近的整数,仍然得强制转换为整型

d.结合赋值(强制跟随被赋值对象的类型)、自增/自减运算符(不要用)、关系运算符(略)、位运算符(P43)、括号/运算符级别(会细讲这个问题)

5.字符串

a.子串

使用String类的substring方法从一个大的字符串中提取一个字串

String greeting = “Hello”;

String s = greeting.substring(0,3);   //创建Hel

Substring的第二个参数是不想复制的第一个位置,在String类中字符串都是从0开始计算

b.拼接

在Java中可以使用“+”进行连接,在连接的时候单词与单词之间的空格不计

进行字符串与非字符串进行拼接时,将非字符串转换为字符串

int age = 13;

String rating = “PG”+age;   //结果为PG13

将多个字符串连接在一起,使用分界符分割,并且使用静态的join方法

String all = String.join(“/”,”S”,”M”,”L”,”XL”);//输出S/M/L/XL

c.不可变字符串

在Java的String类中没有提供可以修改字符串的方法,可以先将目标字符串提取出来,再进行连接

d.检查字符串是否相等

使用equals方法进行字符串,字符的比较

s.equals(t);   // 检测两个s,t字符串是否相等

如果比较两个字符串相等与否(不区分大小写)

“Hello”.equalsIgnoreCase(“hello”);

不要使用==运算符进行字符串是否相等的判断

e.空串与Null串

空串就是长度为0的字符串,可以用来检测一个字符串是不是为空

调用方法:

if(str.length()==0)       if(str.equals(“”))  //用来判断字符串是不是空

注:

空串是一个java对象,有自己的串长度(0)和内容(空)

不过有一个特殊的值,null,这个变量没有任何对象与之关联

检测方法:

if(srt == null)   //检测一个字符串是不是null

if(str != null && str.length() != 0)

//检测一个字符串既不是空字符串,也不是null

f.码点和代码单元

1>

length方法返回采用UTF-16编码方式的代码长度(字符串所需的代码单元的数量)

String greeting = “Hello”;

int n = greeting.length();  //返回5

2>

得到实际的长度就是码点的数量

int cpCount = greeting.codePointCount(0,greeting.length());

3>

调用s.charAt(n)返回位置n的代码单元

char first = greeting.charAt(0);    //返回Hello的第一个字符H

使用codePoint的方法来遍历字符串

int cp = sentance.codePointAt(i);

if(Charcter.isSupplementaryCodePoint(cp)) i += 2;

else i++;

g.构建字符串

连接许多小段字符串用StringBuilder类

步骤:

构建一个空的字符串构建器

StringBuilder builder = new StringBuilder();

当每次添加一部分内容的时候

builder.append(ch);

builder.append(str);

在需要构建字符串的时候调用toString类,得到一个String对象

String completedString = builder.toString();

6.输入输出

A.

读取输入(Scanner定义在java.util.*包中,在使用之前必须将它用import加载进来)

进行标准输入流System.in,首先构造一个Scanner对象,并与System.in相关联

Scanner in = new Scanner(System.in);

使用Scanner类的方法进行输入的操作

****************************************************

nextLine方法输入一行(在输入的行中可能存在空格)

System.out.println(“What your name?”);

String name = in.nextLine();

读取一个整数,调用nextInt方法

System.out.println(“How old are you?”);

int age = in.nextInt();

想要读取下一个浮点数,调用nextDouble方法

int num = in.nextDouble();

使用Java中的Console这个类进行密码的输入

Console cons = System.console();

String username = cons.readLine(“User name :”);

char[] passwd = cons.readPassword(“Password :”);

注:

返回的密码是存放在一维数组中,对密码进行处理之后吧应该立刻用填充值来覆盖这个密码的值

B.格式化的输出

利用Java SE 中的C语言库函数中的printf方法

double x = 10000.0/3.0;

System.out.printf(“%8.2f”,x);//可以用8个字符宽度,以及可以小数点后两位

在printf的方法中可以使用多个参数

System.out.printf(“Hello,%s . Next year ,you will be %d ”,name,age);

System.out.printf(“Hello,”+name+”. Next year ,you will be ”+(age+1));

//对比这两句话上面的在名字,年龄的地方进行了替换

注:

每一个以%开头的格式说明符都用相应的参数进行替换,f表示浮点数,d表示整数,s表示字符串

System.out.printf(“%,.2f”,10000.0/3.0);//输出3,333.33

printf方法中时间和日期的表达方法(本来可以直接使用java.time包)

格式包括两个字母,以t开始以转换表中的任意一个转换符为结束System.out.printf(“%tc”,new date());   

//打印出当前的日期和时间  Mon Feb 09 18:05:19 PST 2015

System.out.printf(“%tF”,new date());   //打印ISO8601日期    

C.文件输入与输出*

想要对文件进行读取,就需要用File对象构造一个Scanner对象

Scanner in = new Scanner(Path.get(“myfile.txt”),”UTF-8”);

//指定了采用UTF-8编码形式的名为myfile的txt文件,就是生成了一个文件叫做myfile

如果文件中包含反斜杠“\”,必须在每个反斜杠之前再加一个额外的反斜杠“\”

“C:\\mydirectory\\myfile.txt”

想要写入文件,就需要构造一个PrintWriter对象,在构造器中,只需要提供文件名

PrintWriter out = new Scanner(“myfile.txt”,”UTF-8”);

//如果该文件不存在,就会创建该文件,然后就可以正常的使用print,println,printf

注:

如果用一个不存在的文件构建一个Scanner,或者用一个不能被创建的文件名,系统就会抛出异常

public static void main(String[] args) throws IOexception

{

   Scanner in = new Scanner(Path.get("myfile.txt"),"UTF-8");

}

当发生异常的时候,红色字体的部分的功能就是抛出这个异常的原因与形式

//**********************************************

        API

        *  java.util.Scanner

           Scanner(File f)       //构造从指定文件中读取数据的Scanner

           Scanner(String data)   //构造从给定字符串中读取数据

        *  java.io.PrintWriter

           PrintWriter(String fileName)   //将数据写入文件中,名字自己起

        *  java.nio.Paths

           static Path get(String pathname)  //根据给定的路径名,构造一个Path,就是指路

        //*********************************************************************

7.控制流

A.块作用域

一对大括号括起来的多条Java语句(在嵌套的块中不能定义同名的变量---就是括号

套括号的情况下)

B.条件语句(与C++一样略)

C.循环(略与C++一样)

注:

for循环进行浮点数比较的时候,由于舍入否认操作有可能永远无法继续进行下面步骤

for(double x = 0;x != 10;x += 0.1;)

在循环体内部定义的变量不能再定义到外部

switch语句与C++完全一样(略)

在Java中switch的标签case

*可以是char、byte、short、int的常量表达式

*枚举常量

*case标签还可以是字符串字面常量

***********************************

String input;

Switch(input.toLowerCase())

{

case "yes" :  

        .........

        break;

}

D.中断控制流程语句

break语句

正常的不带标签的break语句

while(years <= 100)

{

   balance += payment;

   double interest = banlance * interestRate / 100;

   balance += interest;

   if(balance >= goal)  break;

   years++;

}

使用case的标签跳转语句(就是在你想要跳转的地方放置一个标签,然后使用break语句+你的标签)

注:所有的置在外面的标签的值必须放在最外层循环之前,加上冒号

      read_data:

      while(......)

      {  ........

        break read_data;

}//作用就是返回上一个放置标签read_data的地方(最外层)

如果输入有误的话,break就会跳转到带标签语句块的末尾,所以当循环中带有break标签的时候必须检测循环能不能正常进行

      continue语句

      将语句控制转到最内层的循环

*******************************************

      Scanner in = new Scanner(System.in);

      while(sum>goal)

      {.........

       if(n<0) continue;

       statement.....

      }//直接跳出当前循环的剩余部分,直接跳到循环的首部(在没有for语句的情况下)

      //for语句的话,就是直接跳转到for语句的“++部分”

     还有带标签的continue语句,就是跳到带有标签的循环块的首部

大数值

     使用java.math包中的BigInteger   BigDecimal (就是处理超出范围的数的方法)

     调用包的格式:

     import java .math.*;  //使用math这个包

     BigInteger实现了对于任意精度的整数进行计算

     BigDecimal实现了对于任意精度的浮点数的计算

     BigInteger a = BigInteger.valueOf(100);

     //将100转为精度不受限制的大数值

     不能继续使用通常的“+”“*”进行一般的算术运算

     BigInteger c = a.add(b);   //将大数值a和b进行相加

     BigInteger d = c.multiply(b.add(BigInteger.valueOf(2)));   //d=c*(b+2)

     BigInteger k = d.divide(b);             //k=d/b

     在Java中里面用一个包的方法必须先:包名 变量名 =包名.方法名(参数)

     //****************************************************************

     API

     *  java.math.BigInteger

        BigInteger  a .add(BigInteger b)       //a+b

        BigInteger  a.multiply(BigInteger b)    //a*b

        BigInteger  a.divide(BigInteger b)      //a/b

        BigInteger  a.mod(BigInteger b)       //a%b

        BigInteger  a.subtract(BigInteger b)    //a-b

        int a.compareTo(BigInteger b)   //a,b相等返回0,a<b返回负数,a>b返回正数

        BigDecimal (和BigInteger一样的用法)

    //*************************************************************************

9.数组

A.数组的基本概念

    声明数组:

    int[] a;   //声明一个变量名为a的整型数组

    对数组进行初始化操作

    int[] a = new a[100]; //创建一个可以储存100个元素的数组,并且将数组初始化为0

    对数组进行循环赋值

    for(int i= 0;i<100;i++)

      a[i] = i;  //填充数组从0到99(fills the array with numbers 0 to 99)  

    *创建一个数字数组时,初始化为0

     int[] a = new a[100];

    *创建一个boolean数组,初始化为false

    *创建一个对象数组,初始化为null(表示在这些元素中啥也没有)

     String[] names = new String[10];

     for(int i=0;i<10;i++)

       names[i] = “ ”;  //指定元素为空串

     想要获取数组中字符的个数,使用array.length方法

         for(int i=0;i<array.length;i++)

B.for each循环

     定义一个变量暂时存放集合中的每个元素,并执行相应的语句或是语句块

         for(int element: a)

         System.out.println(element); //遍历a中的每一个元素,执行相应的语句

         可以利用Arrays类中的toString方法直接就进行输出

         System.out.println(Arrays.toString(a));

         //将a中的所有元素以逗号进行分割,并且放在括号里打印出来

    C.数组的初始化以及匿名数组

         int[] smallPrimers = {2,3,4,5,6};

         //不用调用new

         new int[] {34,45};  //直接开辟匿名数组

         int[] smallPrimers = new int[] {34,45}

//使用匿名数组给已知数组重刷

         int[] annoymous = {23,45};

         smallPrimer = annoymous;  //直接就可以用数组来初始化数组(重刷,确保类型一致

         注:Java中数组可以为0长度

    D.数组拷贝

         在Java中可以将一个数组变量拷贝给另外的一个数组变量(就是用数组声明数组)

         int[] a = smallPrimer;//smallPrimer也是一个数组变量

         将整个数组的所有的值进行拷贝,使用Arrays类的copyOf方法

int[] copiedLuckyNumber = Arrays.copyOf(LuckyNumber,LuckyNumber.length);

         //方法中的参数就是数组名,数组长度

         可以使用这样的拷贝方法增加数组的长度

      int[] LuckyNumber = Arrays.copyOf(LuckyNumber,2*LuckyNumber.length);

注:

如果数组时数字型的,多余的数字就会被置为0

如果数组时boolean类型,多余的元素就会被置为false

如果你将要进行拷贝的目标数组的位宽小,拷贝的数组就会截断

E.命令行参数

每一个Java程序都带有String arg[]参数的main方法,表明main方法接受一个字符串数组

**************************************

public class Massage

{

  public static void main(String[] args)

  {

    if(args.length == 0 || args[0].equals("-h"))

      System.out.print("Hello ");

    else

      if(args[0].equals("-g"))

        System.out.print("Goodbye ,");

     for(int i = 0;i < args.length;i++)

        System.out.print(" "+args[i]);

  }

}

如果在命令行界面输入

java Massage -g cruel world

//这个数组包含以下的内容

-g

cruel

world

然后运行这个程序

Goodbye,cruel world

***********************

注:

你在同时必须要注意,所谓的java Massage 并不包含在args数组当中

F.数组排序

1>

对数值型数组进行排序用Arrays类中的sort方法

int[] a = new int[100];

Arrays.sort(a);

2>

产生随机数

调用Math.random方法返回一个0到1之间的随机浮点数

int r = (int)(Math.random() * n);

//用返回的这个浮点数乘以n就可以得到0 到n- 1之间的一个整数了

API

          static type copeOf(type[] a,int length)   //拷贝数组,后面的是长度

          static type sort(type[] a)      //对数组进行排序

          static void fill(type[] a.type v)  //将数组全部置为v,类型随前面

          static boolean equals(type[] a,type[] b)

          //数组a,b大小相同,下标元素相同返回true ***********************************************************

    G.多维数组(和c++完全一致)

         二维数组初始化

         int[][] a = {

                  {1,2,3,4},

                  {2,3,4,5},

                  {3,4,5,6},

                  {4,5,6,7}

                 }

         for each循环不能自动的处理多维数组,需要进行嵌套

for(double[] row:a)       //遍历二维数组的行变量

for(double[] value:row)   //遍历二维数组的列变量,其中把上一个的中间变量作为下一个的遍历数组

         快速打印二维数组

         System.out.println(Arrays.deepToString(a))

    H.不规则数组

         创建不规则数组

         int[][] odds = new int[MAX+1][];

         对行,以及列进行创建

         for(int i = 0;i<odds.length;i++)

           odds[i] = new int[i+1];

         对数组进行赋值

         for(int i = 0;i < odds.length;i++)

           for(int k = 0;k < odds[i].length;k++)

{.........}//可以打印出一个直角三角形的数字矩阵