java基础语法

2019-05-29  本文已影响0人  Unruly_Wind

转载请标注原文地址,谢谢!

Java 基础语法

对象和类

Java中有一个概念即“万物皆对象”,一个Java程序可以认为是一系列对象的集合,这些对象通过调用彼此的方法来协同工作。

对象和类.jpg

上图中,“猫科动物”为一个类,其状态为“牙齿”、“胡须”,其行为为“吃肉”。将其实例化后为“老虎”和“狮子”。

对象

软件对象和现实对象相比十分相似。

软件对象拥有状态和行为,软件对象的状态就是属性,行为通过方法体现。

在软件开发中,方法可以用来改变对象的状态,也可用来实现对象间的相互调用。

类可以看成是创建Java对象的模板。

public class Dog {
    String breed;
    int age;
    String color;
    void barking() {}
    void hungry() {}
    void sleeping() {}
}

一个类可以包含以下类型变量:

一个类可以拥有多个方法,在上面的例子中:barking()、hungry()和sleeping()都是Dog类的方法。

构造方法

每个类都有构造方法。如果没有显式的为类定义构造方法,Java编译器将会为该类提供一个默认构造方法。

在创建一个对象的时候,至少要调用一个构造方法。构造方法的名称必须与类同名,一个类可以有多个构造方法。

public class Puppy {
    public Puppy() {}
    public Puppy(String name) {
        // 这个构造器仅有一个参数:name
    }
}
创建对象

对象是根据类创建的。在Java中,使用关键字new来创建一个新的对象。创建对象需要以下三步:

public class Puppy {
    public Puppy(String name) {
        // 这个构造器仅有一个参数:name
        System.out.println("小狗的名字是:" + name);
    }
    public static void main(String[] args) {
        // 下面的语句将创建一个Puppy对象
        Puppy puppy = new Puppy("tommy");
    }
}

编译并运行上面的程序,会打印出下面的结果:

小狗的名字是:tommy
访问实例变量和方法

通过已创建的对象来访问成员变量和成员方法,如下所示:

/* 实例化对象 */
ObjectReference = new Constructor();
/* 访问类中的变量 */
ObjectReference.variableName;
/* 访问类中的方法 */
ObjectReference.methodName();

基本数据类型

变量就是申请内存来存储值。也就是说,当创建变量的时候,需要在内存中申请空间。

内存管理系统根据变量的类型为变量分配存储空间,分配的空间只能用来存储该类型数据。

变量在内存中的空间.jpg

因此,通过定义不同类型的变量,可以在内存中存储整数、小数或者字符。

Java的两大数据类型:

内置数据类型

Java语言提供了八种基本类型。六种数字类型(四个整数型,两个浮点型),一种字符类型,还有一种布尔型。

byte

short

int

long

float

double

boolean

char

引用类型
常量

常量在程序运行时是不能被修改的。

在Java中使用final关键字来修饰常量,声明方式和变量类似。

虽然常量名也可以用小写,但为了便于识别,通常使用大写字母表示常量。

final double PI = 3.1415927;

字面量可以赋给任何内置类型的变量。例如:

byte a = 68;
char a = 'A'

byte、int、long和short都可以用十进制、16进制以及8进制的方式来表示。

当使用常量的时候,前缀0表示8进制,而前缀0x代表16进制,例如:

int decimal = 100;
int octal = 0144;
int hexa = 0x64;

和其他语言一样,Java的字符串常量也是包含在两个引号之间的字符序列。下面是字符串型字面量的例子:

"Hello World"
"two\nlines"
"\"This is in quotes\""

字符串常量和字符常量都可以包含任何Unicode字符。例如:

char a = '\u0001';
String a = '\u0001';

Java语言支持一些特殊的转义字符序列:

符号 字符含义
\n 换行(0x0a)
\r 回车(0x0d)
\f 换页符(0x0c)
\b 退格(0x08)
\0 空字符(0x20)
\s 字符串
\t 制表符
\" 双引号
\' 单引号
\\ 反斜杠
\ddd 八进制字符(ddd)
\uxxxx 16进制Unicode字符(xxxx)
自动类型转换

整型、实型(常量)、字符型数据可以混合运算。运算中,不同类型的数据先转换为同一类型,然后进行运算。

转换从低级到高级:

低  ------------------------------------>  高

byte,short,char—> int —> long—> float —> double 

数据类型转换必须满足如下规则:

自动类型转换

必须满足转换前的数据类型的位数要低于转换后的数据类型,例如:short数据类型的位数为16位,就可以自动转换位数为32的int类型,同样float数据类型的位数为32,可以自动转换为64位的double类型。

public class ZiDongLeiXingZhuan {
    public static void main(String[] args) {
        char c1 = 'a'; // 定义一个char类型
        int i1 = c1; // char自动类型转换为int
        System.out.println("char自动类型转换为int后的值等于" + i1);
        char c2 = 'A'; // 定义一个char类型
        int i2 = c2 + 1; // char类型和int类型计算
        System.out.println("char类型和int计算后的值等于" + i2);
    }
}

运行结果为:

char自动类型转为int后的值等于97
char类型和int计算后的值等于66
强制类型转换
public class QiangZhiZhuanHuan {
    public static void main(String[] args) {
        int i1 = 123;
        byte b = (byte) i1; // 强制类型转换为byte
        System.out.println("int强制类型转换为byte后的值等于" + b);
    }
}

运行结果:

int强制类型转换为byte后的值等于123
隐含强制类型转换

变量类型

在Java语言中,所有的变量在使用前必须声明。声明变量的基本格式如下:

type identifier [ = value][, identifier [= value] ...];

格式说明:type为Java数据类型。identifier是变量名。可以使用逗号隔开来表明多个同类型变量。

以下列出了一些变量的声明实例。注意有些包含了初始化过程:

int a, b, c;    // 声明三个int型整数:a、b、c
int d = 3, e = 4, f = 5;    // 声明三个整数并赋予初值
byte z = 22;    // 声明并初始化 z
String s = "aab";   // 声明并初始化字符串 s
double pi = 3.14159;    // 声明双精度浮点型变量 pi
char x = 'x';   // 声明变量 x 的值是字符 'x'

Java语言支持的变量类型有:

public class Variable {
    static int allClicks = 0;   // 类变量
    String str = "hello world"; // 实例变量
    public void method() {
        int i = 0;  // 局部变量
    }
}
局部变量
package com.focustech.test;

public class Test {
    public void pupAge() {
        // 局部变量
        int age = 0;
        age = age + 7;
        System.out.println("小狗的年龄是:" + age);
    }
    
    public static void main(String[] args) {
        Test test = new Test();
        test.pupAge();
    }
}
实例变量
import java.io.*;
public class Employee {
    // 这个实例变量对子类可见
    public String name;
    // 私有变量,仅在该类可见
    private double salary;
       //在构造器中对name赋值
   public Employee (String empName){
      name = empName;
   }
   //设定salary的值
   public void setSalary(double empSal){
      salary = empSal;
   }  
   // 打印信息
   public void printEmp(){
      System.out.println("名字 : " + name );
      System.out.println("薪水 : " + salary);
   }
   public static void main(String[] args){
      Employee empOne = new Employee("AAB");
      empOne.setSalary(1000);
      empOne.printEmp();
   }
}
类变量(静态变量)
import java.io.*;

public class Employee {
    // salary是静态的私有变量
    private static double salary;
    // DEPARTMENT是一个常量
    public static final String DEPARTMENT = "开发人员";
    public static void main(String[] args) {
        salary = 10000;
        System.out.println(DEPARTMENT + "平均工资:" + salary);
    }
}

如果其他类需要访问该变量,可以通过:Employee.DEPARTMENT

标识符

Java所有的组成部分都需要名字。类名、变量名以及方法名都被称为标识符。

关于Java标识符,有以下几点需要注意:

修饰符

Java使用修饰符来修饰类中的方法和属性,主要有两类修饰符:

访问控制修饰符

Java中,可以使用访问控制符来保护对类、变量、方法和构造方法的访问。Java支持4种不同的访问权限。

下表展示说明访问权限:

修饰符 当前类 同一包内 子孙类(同一包) 子孙类(不同包) 其他包
public Y Y Y Y Y
protected Y Y Y Y/N N
default Y Y Y N N
private Y N N N N
默认访问修饰符-不使用任何关键字

使用默认访问修饰符声明的变量和方法,对同一包内的类是可见的。接口里的变量都隐式声明为public static final而接口里的方法默认情况下访问权限为public

String version = '1.5.1';
boolean processOrder() {
    return true;
}
私有访问修饰符-private

私有访问修饰符是最严格的访问级别,所以被声明为private的方法、变量和构造方法只能被所属类访问,并且类和接口不能声明为private

声明为私有访问类型的变量只能通过类中公共的getter方法被外部类访问。

private访问修饰符的使用主要用来隐藏类的实现细节和保护类的数据。

public class Logger {
   private String format;
   public String getFormat() {
      return this.format;
   }
   public void setFormat(String format) {
      this.format = format;
   }
}
公有访问修饰符-public

被声明为public的类、方法、构造方法和接口能够被任何其他类访问。

如果几个相互访问的public类分布在不同的包中,则需要导入相应public类所在的包。由于类的继承性,类所有的公有方法和变量都能被其子类继承。

public static void main(String[] args) {
    // ...
}
受保护的访问修饰符-protected

protected需要从以下两个点来分析说明:

访问控制和继承
非访问修饰符

为了实现一些其他的功能,Java也提供了许多非访问修饰符。

static修饰符

对类变量和方法的访问可以直接使用classname.variablename和classname.methodname的方式访问。

public class InstanceCounter {
   private static int numInstances = 0;
   protected static int getCount() {
      return numInstances;
   }
 
   private static void addInstance() {
      numInstances++;
   }
 
   InstanceCounter() {
      InstanceCounter.addInstance();
   }
}
final修饰符

final变量

final表示“最后的、最终的”含义,变量一旦赋值后,不能被重新赋值。被final修饰的实例变量必须显式指定初始值。

final修饰符通常和static修饰符一起使用来创建类常量。

public class Test {
    final int value = 10;
    // 下面是声明常量的实例
    public static final int BOXWIDTH = 6;
    static final String TITLE = "Manager";
    
    public void changeValue() {
        value = 12; // 将输出一个错误
    }
}

final方法

类中的final方法可以被子类继承,但是不能被子类修改。

声明final方法的主要目的是防止该方法的内容被修改。

public class Test {
    public final void changeName(){}
}

final类

final类不能被继承,没有类能够继承final类的任何特性。

public final class Test {}
abstract修饰符

抽象类

抽象类不能用来实例化对象,声明抽象类的唯一目的是为了将来对该类进行扩充。

一个类不能同时被abstract和final修饰。如果一个类包含抽象方法,那么该类一定要声明为抽象类,否则将出现编译错误。

抽象类可以包含抽象方法和非抽象方法。

abstract class Caravan {
   private double price;
   private String model;
   private String year;
   public abstract void goFast(); // 抽象方法
   public abstract void changeColor();
}

抽象方法

抽象方法是一种没有任何实现的方法,该方法的具体实现由子类提供。

抽象方法不能被声明成final和static。

任何继承抽象类的子类必须实现父类的所有抽象方法,除非该子类也是抽象类。

如果一个类包含若干个抽象方法,那么该类必须声明为抽象类,抽象类可以不包含抽象方法。

抽象方法的声明以分号结尾,例如:public abstract sample();

public abstract class SuperClass {
    abstract void m();  // 抽象方法
}

class SubClass extends SuperClass {
    // 实现抽象方法
    void m() {
        ......
    }
}
synchronized修饰符

synchronized关键字声明的方法同一时间只能被一个线程访问。synchronized修饰符可以应用于四个访问修饰符。

public synchronized void showDetails() {}
transient修饰符

序列化的对象包含被transient修饰的实例变量时,java虚拟机(JVM)跳过该特定的变量。

该修饰符包含在定义变量的语句中,用来预处理类和变量的数据类型。

public transient int limit = 55; // 不会持久化
public int b; // 持久化
volatile修饰符

volatile修饰的成员变量在每次被线程访问时,都强制从共享内存中重新读取该成员变量的值。而且,当成员变量发生变化时,会强制线程将变化值回写到共享内存。这样在任何时刻,两个不同的线程总是看到某个成员变量的同一个值。

一个volatile对象引用可能是null。

public class MyRunnable implements Runnable
{
    private volatile boolean active;
    public void run()
    {
        active = true;
        while (active) // 第一行
        {
            // 代码
        }
    }
    public void stop()
    {
        active = false; // 第二行
    }
}

通常情况下,在一个线程调用run()方法(在Runnable开启的线程),在另一个线程调用stop()方法。如果第一行缓冲区的active值被使用,那么在第二行的active值为false时循环不会停止。

但是以上代码使用了volatile修饰active,所以该循环会停止。

关键字

类别 关键字 说明
访问控制 private 私有的
访问控制 protected 受保护的
访问控制 public 公共的
类、方法和变量修饰符 abstract 声明抽象
类、方法和变量修饰符 class
类、方法和变量修饰符 extends 扩充、继承
类、方法和变量修饰符 final 最终值、不可改变的
类、方法和变量修饰符 implements 实现(接口)
类、方法和变量修饰符 interface 接口
类、方法和变量修饰符 native 本地,原生方法(非Java实现)
类、方法和变量修饰符 new 新,创建
类、方法和变量修饰符 static 静态
类、方法和变量修饰符 strictfp 严格、精准
类、方法和变量修饰符 synchronized 线程、同步
类、方法和变量修饰符 transient 短暂
类、方法和变量修饰符 volatile 易失
程序控制语句 break 跳出循环
程序控制语句 case 定义一个值以供switch选择
程序控制语句 continue 继续
程序控制语句 default 默认
程序控制语句 do 运行
程序控制语句 else 否则
程序控制语句 for 循环
程序控制语句 if 如果
程序控制语句 instanceof 实例
程序控制语句 return 返回
程序控制语句 switch 根据值选择执行
程序控制语句 while 循环
错误处理 assert 断言表达式是否为真
错误处理 catch 捕捉异常
错误处理 finally 有没有异常都执行
错误处理 throw 抛出一个异常对象
错误处理 throws 声明一个异常可能被抛出
错误处理 try 捕获异常
包相关 import 引入
包相关 package
基本类型 boolean 布尔型
基本类型 byte 字节型
基本类型 char 字符型
基本类型 double 双精度浮点
基本类型 float 单精度浮点
基本类型 int 整型
基本类型 long 长整型
基本类型 short 短整型
变量引用 super 父类、超类
变量引用 this 本类
变量引用 void 无返回值
保留关键字 goto 是关键字,但不能使用
保留关键字 const 是关键字,但不能使用
保留关键字 null

枚举

Java5.0引入了枚举,枚举限制变量只能是预先设定好的值。使用枚举可以减少代码中的bug。

例如,我们为果汁店设计了一个程序,它将限制果汁为小杯、中杯、大杯。这就意味着它不允许顾客点除了这三种尺寸外的果汁。

class FreshJuice {
    enum FreshJuiceSize {
        SMALL,
        MEDIUM,
        LARGE
    }
    FreshJuiceSize size;
}

public class FreshJuiceTest {
    public static void main(String[] args) {
        FreshJuice juice = new FreshJuice();
        juice.size = FreshJuice.FreshJuiceSize.MEDIUM;
    }
}

注意:枚举可以单独声明或者声明在类里面。方法、变量、构造函数也可以在枚举中定义。

运算符

Java中的运算符分为以下几组:

算术运算符

算术运算符用在数学表达式中,它们的作用和在数学中的作用一样。下表列出了所有的算术运算符。

表格中的实例假设整数变量A的值为10,变量B的值为20:

操作符 描述 例子
+ 加法:相加运算符两侧的值 A+B=30
- 减法:左操作数减去右操作数 A-B=-10
* 乘法:相乘操作符两侧的值 A*B=200
/ 除法:左操作数除以右操作数 B/A=2
% 取余:左操作数除以右操作数的余数 B%A=0
++ 自增:操作数的值增加1 B++或++B=21
-- 自减:操作数的值减少1 B--或--B=19
自增自减运算符

1、自增(++)和自减(--)运算符是一种特殊的算术运算符。在算术运算符中需要两个操作数来进行运算,而自增自减运算符只需要一个操作数。

2、前缀自增自减法(++a, --a):先进行自增或者自减运算,再进行表达式运算。

3、后缀自增自减法(a++, a--):先进行表达式运算,再进行自增或者自减运算。

关系运算符

下表为Java支持的关系运算符

表格中的实例整数变量A的值为10,变量B的值为20:

运算符 描述 例子
== 检查如果两个操作数的值是否相等,如果相等则条件为真。 (A==B)为假
!= 检查如果两个操作数的值是否相等,如果值不相等则条件为真。 (A!=B)为真
> 检查左操作数的值是否大于右操作数的值,如果是那么条件为真。 (A>B)为假
< 检查左操作数的值是否小于右操作数的值,如果是那么条件为真。 (A<B)为真
>= 检查左操作数的值是否大于或等于右操作数的值,如果是那么条件为真。 (A>=B)为假
<= 检查左操作数的值是否小于或等于右操作数的值,如果是那么条件为真。 (A<=B)为真
位运算符

Java定义了位运算符,应用于整数类型(int),长整型(long),短整型(short),字符型(char)和字节型(byte)等类型。

位运算符作用在所有的位上,并且按位运算。假设a=60,b=13;它们的二进制格式表示将如下:

A = 0011 1100
B = 0000 1101
-----------------
A&b = 0000 1100
A | B = 0011 1101
A ^ B = 0011 0001
~A= 1100 0011

下表列出了位运算符的基本运算,假设整数变量A的值为60和变量B的值为13:

操作符 描述 例子
& 如果相对应位都是1,则结果为1,否则为0 (A&B),得到12,即00001100
| 如果相对应位都是0,则结果为0,否则为1 (A|B),得到61,即00111101
^ 如果相对应位值相同,则结果为0,否则为1 (A^B),得到49,即00110001
~ 按位取反运算符翻转操作数的每一位,即0变成1,1变成0 (~A),得到-61,即11000011
<< 按位左移运算符,左操作数按位左移右操作数指定的位数 A<<2,得到240,即11110000
>> 按位右移运算符,左操作数按位右移右操作数指定的位数 A>>2,得到15,即00001111
>>> 按位右移补零操作符。左操作数的值按右操作数指定的位数右移,移动得到的空位以零填充 A>>>2,得到15,即00001111
逻辑运算符

下表列出了逻辑运算符的基本运算,假设布尔变量A为真,变量B为假:

操作符 描述 例子
&& 当且仅当两个操作数都为真,条件才为真。 (A&&B)为假
|| 如果任何两个操作数任何一个为真,条件为真。 (A||B)为真
! 用来反转操作数的逻辑状态,如果条件为true,则逻辑非运算符将得到false !(A&&B)为真
短路逻辑运算符

当使用与逻辑运算符时,在两个操作数都为true时,结果才为true,但是当得到第一个操作为false时,其结果就必定是false,这时候就不会再判断第二个操作了。

public class LuoJi {
    public static void main(String[] args) {
        int a = 5;// 定义一个变量
        boolean b = (a<4)&&(a++<10);
        System.out.println("使用短路逻辑运算符的结果为"+b);
        System.out.println("a的结果为"+a);
    }
}

运行结果为:

使用短路逻辑运算符的结果为false
a的结果为5

解析:改程序使用了短路逻辑运算符(&&),首先判断a<4的结果为false,则b的结果必定是false,所以不再执行第二个操作a++<10的判断,所以a的值为5。

赋值运算符
操作符 描述 例子
= 简单的赋值运算符,将右操作数的值赋给左操作数 C=A+B,将把A+B得到的值赋给C
+= 加和赋值操作符,它把左操作数和右操作数相加赋值给左操作数 C+=A等价于C=C+A
-= 减和赋值操作符,它把左操作数和右操作数想减赋值给左操作数 C-=A等价于C=C-A
*= 乘和赋值操作符,它把左操作数和右操作数相乘赋值给左操作数 C*=A等价于C=C*A
/= 除和赋值操作符,它把左操作数和右操作数相除赋值给左操作数 C/=A等价于C=C/A
(%)= 取模和赋值操作符,它把左操作数和右操作数取模后赋值给左操作数 C%=A等价于C=C%A
<<= 左移位赋值运算符 C<<=2等价于C=C<<2
>>= 右移位赋值运算符 C>>=等价于C=C>>2
&= 按位与赋值运算符 C&=2等价于C=C&2
^= 按位异或赋值操作符 C=2等价于C=C2
|= 按位或赋值操作符 C|=2等价于C=C|2
条件运算符(?:)

条件运算符也被称为三元运算符。该运算符有3个操作数,并且需要判断布尔表达式的值。该运算符主要决定哪个值应该赋值给变量。

variable x = (expression) ? value if true : value if false
instanceof运算符

该运算符用于操作对象实例,检查该对象是否是一个特定类型(类类型或接口类型)。

instanceof运算符使用格式如下:

(Object reference variable) instanceof (class/interface type)

如果运算符左侧变量所指的对象,是操作符右侧类或接口(class/interface)的一个对象,那么结果为真。

下面是一个例子:

String name = "James";
boolean result = name instanceof String; // 由于name是String类型,所以返回真

如果被比较的对象兼容于右侧类型,该运算符仍然返回true。

Java运算符优先级

下表根据优先级从高到低的顺序排序:

类别 操作符 关联性
后缀 () [] .(点操作符) 左到右
一元 ++ -- ! ~ 从右到左
乘性 * / % 左到右
加性 + - 左到右
移位 >> >>> << 左到右
关系 > >= < <= 左到右
相等 == != 左到右
按位与 & 左到右
按位异或 ^ 左到右
按位或 | 左到右
逻辑与 && 左到右
逻辑或 || 左到右
条件 ? : 从右到左
赋值 = += -= *= /= %= >>= <<= &= ^ = |= 从右到左
逗号 , 左到右

循环结构

Java中有三种主要的循环结构:

在Java5中引入了一种主要用于数组的增强型for循环

while循环

while是最基本的循环,它的结构为:

while(布尔表达式) {
    // 循环内容
}

只要布尔表达式为true,循环就会一直执行下去。

do...while循环

对于while语句而言,如果不满足条件,则不能进入循环。但有时候我们需要即使不满足条件,也至少执行一次。

do...while循环和while循环相似,不同的是,do...while循环至少会执行一次。

do {
    // 代码语句
}while(布尔表达式);
for循环

虽然所有循环结构都可以用while或者do...while表示,但Java提供了另一种语句——for循环,使一些循环结构变得更加简单。

for循环执行的次数是在执行前就确定的。语句格式如下:

for(初始化; 布尔表达式; 更新) {
    // 代码语句
}

关于for循环有以下几点说明:

Java增强for循环

Java5引入了一种主要用于数组的增强型for循环。

Java增强for循环语法格式如下:

for(声明语句 : 表达式) {
    // 代码句子
}

声明语句:声明新的局部变量,该变量的类型必须和数组元素的类型匹配。其作用域限定在循环语句块,其值与此时数组元素的值相等。

表达式:表达式是要访问的数组名,或者是返回值为数组的方法。

break关键字

break主要用在循环语句或者switch语句中,用来跳出整个语句块。

break跳出最里面的循环,并且继续执行该循环下面的语句。

continue关键字

continue适用于任何循环控制结构中。作用是让程序立刻跳转到下一次循环的迭代。

在for循环中,continue语句使程序立即跳转到更新语句。

在while或者do...while循环中,程序立即跳转到布尔表达式的判断语句。

条件语句

if...else语句

if语句后面可以跟else语句,当if语句的布尔表达值为false时,else语句块会被执行。

if(布尔表达式) {
    // 如果布尔表达式的值为true
} else {
    // 如果布尔表达式的值为false
}
if...else if...else语句

if语句后面可以跟else if...else语句,这种语句可以检测到多种可能的情况。

使用if,else if,else语句的时候,需要注意下面几点:

if(布尔表达式1) {
    // 如果布尔表达式1的值为true,执行代码
}else if(布尔表达式2) {
    // 如果布尔表达式2的值为true,执行代码
}else if(布尔表达式3) {
    // 如果布尔表达式3的值为true,执行代码
}else {
    // 如果以上布尔表达式都不为true,执行代码
}
嵌套的if...else语句

使用嵌套的if...else语句是合法的。也就是说你可以在另一个if或者else if语句中使用if或者else if语句。

嵌套的if...else语法格式如下:

if(布尔表达式1) {
    // 如果布尔表达式1的值为true,执行代码
    if(布尔表达式2) {
        // 如果布尔表达式2的值为true,执行代码
    }
}

String

字符串广泛应用在Java编程中,在Java中字符串属于对象,Java提供了String类来创建和操作字符串。

创建字符串
String greeting = "测试字符串"; // 使用字符串常量创建字符串

char[] array = {'a', 'b', 'c'};
String greeting = new String(array); // 使用关键字创建字符串

注意:String类是不可改变的,所以一旦创建了String对象,那它的值就无法改变了。

字符串长度
String site = "www.what's the hell.com";
int len = site.length();
连接字符串

String类提供了两种连接字符串的方法:

"我的名字是:".concat("abc"); // 使用concat方法连接
"我的名字是" + "abc"; // 使用'+'连接
创建格式化字符串

String类使用静态方法format()创建可复用的格式化字符串:

System.out.printf("浮点型变量的值为" + "%f,整型变量的值为" + "%d,字符串变量的值为" + "is %s", floatVar, intVar, stringVar);

还有更多的String的api请大家查看java的官方文档。

日期时间

java.util包提供Date类来封装当前的日期和时间,Date类提供两个构造函数来实例化Date对象。

第一个构造函数使用当前日期和时间来初始化对象:

Date()

第二个构造函数接收一个参数,该参数是1970年1月1日起的毫秒数:

Date(long millisec)
获取当前日期时间
Date date = new Date();
日期比较

Java使用以下三种方法来比较两个日期:

使用SimpleDateFormat格式化日期

SimpleDateFormat是一个以语言环境敏感的方式来格式化和分析日期的类。SimpleDateFormat允许你选择任何用户自定义日期时间格式来运行:

Date now = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
Calendar类

Calendar类的功能比Date类要强大很多,而且在实现方式上也比Date类要复杂一些。

Calendar类是一个抽象类,在实际使用时实现特定的子类的对象,创建对象的过程对程序员来说是透明的,只需要使用getInstance方法创建即可。

创建一个代表系统当前日期的Calendar对象
Calendar c = Calendar.getInstance(); // 默认是当前日期
创建一个指定日期的Calendar对象

使用Calendar代表特定的时间,需要首先创建一个Calendar对象,然后再设定该对象中的年月日参数来完成。

// 创建一个代表2009年6月12日的Calendar对象
Calendar c1 = Calendar.getInstance();
c1.set(2009, 6 - 1, 12);
Calendar类对象字段类型
常量 描述
Calendar.YEAR 年份
Calendar.MONTH 月份
Calendar.DATE 日期
Calendar.DAY_OF_MONTH 日期,和上面的字段意义完全相同
Calendar.HOUR 12小时制的小时
Calendar.HOUR_OF_DAY 24小时制的小时
Calendar.MINUTE 分钟
Calendar.SECOND
Calendar.DAY_OF_WEEK 星期几

编程习惯

上一篇 下一篇

猜你喜欢

热点阅读