java基础

Java

基本数据类型

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

数据类型  默认值
int 整型 4个字节 0
byte 字节类型 1个字节 0
char 字符类型 2个字节 'u0000'
short 短整型 2个字节 0
float 浮点型(单精度) 4个字节 0.0f
double 长整型 8个字节 0.0d
long 双精度类型 8个字节 0L
boolean 布尔型 1个字节(8bit) false

Java中默认的整数类型是int,如果要定义为long ,则要在数值后加上L或者l

默认的浮点型是双精度浮点,如果要定义float,则要在数值后面加上f或者F

一个字节等于8位,1个字节等于256个数。2^8

一个英文字母或者阿拉伯数字占一个字节

一个汉字占2个字节

Java 的两大数据类型:

  • 内置数据类型

  • 引用数据类型

    1. 引用类型指向一个对象,指向对象的变量是引用变量。这些变量在声明时被指定为一个特定的类型,比如 Employee、Puppy 等。变量一旦声明后,类型就不能被改变了。

    2. 对象、数组都是引用数据类型。

    3. 所有引用类型的默认值都是null。

    4. 一个引用变量可以用来引用任何与之兼容的类型。

Java 常量

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

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

final double PI = 3.1415927;

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

自动类型转换

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

转换从低级到高级。

低  ------------------------------------>  

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

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

    1. 不能对boolean类型进行类型转换。

    1. 不能把对象类型转换成不相关类的对象。

    1. 在把容量大的类型转换为容量小的类型时必须使用强制类型转换。

    1. 转换过程中可能导致溢出或损失精度,例如:

int i =128;   
byte b = (byte)i;

因为 byte 类型是 8 位,最大值为127,所以当 int 强制转换为 byte 类型时,值 128 时候就会导致溢出

浮点数到整数的转换是通过舍弃小数得到,而不是四舍五入,例如:

(int)23.7 == 23;        
(int)-45.89f == -45

自动类型转换

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

强制类型转换

    1. 条件是转换的数据类型必须是兼容的。

    1. 格式:(type)value type是要强制类型转换后的数据类型 实例:

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

隐含强制类型转换

    1. 整数的默认类型是 int。

    1. 浮点型不存在这种情况,因为在定义 float 类型时必须在数字后面跟上 F 或者 f。

 

java修饰符

访问控制修饰符

default (即默认,什么也不写): 在同一包内可见,不使用任何修饰符。使用对象:类、接口、变量、方法。

private : 在同一类内可见。使用对象:变量、方法。 注意:不能修饰类(外部类)

public : 对所有类可见。使用对象:类、接口、变量、方法

protected : 对同一包内的类和所有子类可见。使用对象:变量、方法。 注意:不能修饰类(外部类)

修饰符当前类同一包内子孙类(同一包)子孙类(不同包)其他包
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 的方法在子类中也必须为 public。

  • 父类中声明为 protected 的方法在子类中要么声明为 protected,要么声明为 public,不能声明为 private。

  • 父类中声明为 private 的方法,不能够被继承。

非访问控制修饰符

static 修饰符,用来修饰类方法和类变量。

  • 静态变量:

    static 关键字用来声明独立于对象的静态变量,无论一个类实例化多少对象,它的静态变量只有一份拷贝。 静态变量也被称为类变量。局部变量不能被声明为 static 变量。

  • 静态方法:

    static 关键字用来声明独立于对象的静态方法。静态方法不能使用类的非静态变量。静态方法从参数列表得到数据,然后计算这些数据。

final 修饰符,用来修饰类、方法和变量,final 修饰的类不能够被继承,修饰的方法不能被继承类重新定义,修饰的变量为常量,是不可修改的。

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

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

  • 父类中的 final 方法可以被子类继承,但是不能被子类重写。

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

abstract 修饰符,用来创建抽象类和抽象方法。

  • 抽象类:

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

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

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

  • 抽象方法

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

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

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

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

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

synchronized 和 volatile 修饰符,主要用于线程的编程。

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

transient 修饰符

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

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

volatile 修饰符

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

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

 

java变量

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

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

 

面向对象

public class Dog {//dog类
   String breed;//属性
   int size;
   String colour;
   int age;

   void eat() {//方法
  }

   void run() {
  }

   void sleep(){
  }

   void name(){
  }
}
  • 局部变量

    在方法、构造方法或者语句块中定义的变量被称为局部变量。变量声明和初始化都是在方法中,方法结束后,变量就会自动销毁。

    是在栈上分配的。

    局部变量没有默认值,所以局部变量被声明后,必须经过初始化,才可以使用。

public class  ClassName{
   public void printNumber(){
       int a;
  }
   // 其他代码
}
  • 成员变量(实例变量)

    • 成员变量是定义在类中,方法体之外的变量。这种变量在创建对象的时候实例化。成员变量可以被类中方法、构造方法和特定类的语句块访问。

    • 访问修饰符可以修饰实例变量。

public class  ClassName{
   int a;
   public void printNumber(){
       // 其他代码
  }
}
  • 类变量(静态变量)

    • 类变量也声明在类中,方法体之外,但必须声明为 static 类型。

    • 无论一个类创建了多少个对象,类只拥有类变量的一份拷贝。

    • 属于类,该类不生产对象,通过类名就可以调用静态变量。

    public class  ClassName{
       static int a;
       public void printNumber(){
           // 其他代码
      }
    }
public class Variable{
   static int allClicks=0;    // 类变量

   String str="hello world";  // 实例变量

   public void method(){

       int i =0;  // 局部变量

  }
}
** 成员变量**局部变量静态变量 
定义位置 在类中,方法外 方法中,或者方法的形式参数 在类中,方法外
初始化值 有默认初始化值 无,先定义,赋值后才能使用 有默认初始化值
调用方式 对象调用 --- 对象调用,类名调用
存储位置 堆中 栈中 方法区
生命周期 与对象共存亡 与方法共存亡 与类共存亡
别名 实例变量 --- 类变量

 

构造方法

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

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

  • 构造方法的名字和类名相同,并且没有返回值。

  • 构造方法主要用于为类的对象定义初始化状态。

  • 我们不能直接调用构造方法,必须通过new关键字来自动调用,从而创建类的实例。

  • Java的类都要求有构造方法,如果没有定义构造方法,Java编译器会为我们提供一个缺省的构造方法,也就是不带参数的构造方法。

public class Puppy{
   public Puppy(){//无参构造方法,默认不显示
  }

   //有参构造方法
   public Puppy(String name){
       // 这个构造器仅有一个参数:name
  }
}

创建对象

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

  • 声明:声明一个对象,包括对象名称和对象类型。

  • 实例化:使用关键字 new 来创建一个对象。

  • 初始化:使用 new 创建对象时,会调用构造方法初始化对象。

new关键字的作用

1、为对象分配内存空间。

2、引起对象构造方法的调用。

3、为对象返回一个引用。

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

通过已创建的对象来访问成员变量和成员方法

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

如何访问实例变量和调用成员方法:

public class Puppy{
  int puppyAge;
  public Puppy(String name){
     // 这个构造器仅有一个参数:name
     System.out.println("小狗的名字是 : " + name );
  }

  public void setAge( int age ){
      puppyAge = age;
  }

  public int getAge( ){
      System.out.println("小狗的年龄为 : " + puppyAge );
      return puppyAge;
  }

  public static void main(String[] args){
     /* 创建对象 */
     Puppy myPuppy = new Puppy( "tommy" );
     /* 通过方法来设定age */
     myPuppy.setAge( 2 );
     /* 调用另一个方法获取age */
     myPuppy.getAge( );
     /*你也可以像下面这样访问成员变量 */
     System.out.println("变量值 : " + myPuppy.puppyAge );
  }
}

 

运算符

  • 算术运算符

  • 关系运算符

  • 位运算符

  • 逻辑运算符

  • 赋值运算符

  • 其他运算符

操作符描述例子
+ 加法 - 相加运算符两侧的值 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--): 先进行表达式运算,再进行自增或者自减运算 实例:

先赋值在运算

关系运算符

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

位运算符

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

位运算符作用在所有的位上,并且按位运算。

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

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

逻辑运算符

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

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

短路逻辑运算符

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

条件运算符(?:)

条件运算符也被称为三元运算符。该运算符有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 类型,所以返回真

Java运算符优先级

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

 

控制流程

if...else

一个 if 语句包含一个布尔表达式和一条或多条语句。

if(布尔表达式)
{
  //如果布尔表达式为true将执行的语句
}

如果布尔表达式的值为 true,则执行 if 语句中的代码块,否则执行 if 语句块后面的代码。

public class Test {

  public static void main(String args[]){
     int x = 10;

     if( x < 20 ){
        System.out.print("这是 if 语句");
    }
  }
}

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

if(布尔表达式){
  //如果布尔表达式的值为true
}else{
  //如果布尔表达式的值为false
}
public class Test {

  public static void main(String args[]){
     int x = 30;

     if( x < 20 ){
        System.out.print("这是 if 语句");
    }else{
        System.out.print("这是 else 语句");
    }
  }
}

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

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

  • if 语句至多有 1 个 else 语句,else 语句在所有的 else if 语句之后。

  • if 语句可以有若干个 else if 语句,它们必须在 else 语句之前。

  • 一旦其中一个 else if 语句检测为 true,其他的 else if 以及 else 语句都将跳过执行。

if(布尔表达式 1){
  //如果布尔表达式 1的值为true执行代码
}else if(布尔表达式 2){
  //如果布尔表达式 2的值为true执行代码
}else if(布尔表达式 3){
  //如果布尔表达式 3的值为true执行代码
}else {
  //如果以上布尔表达式都不为true执行代码
}
public class Test {
  public static void main(String args[]){
     int x = 30;

     if( x == 10 ){
        System.out.print("Value of X is 10");
    }else if( x == 20 ){
        System.out.print("Value of X is 20");
    }else if( x == 30 ){
        System.out.print("Value of X is 30");
    }else{
        System.out.print("这是 else 语句");
    }
  }
}

嵌套的 if…else 语句

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

  public static void main(String args[]){
     int x = 30;
     int y = 10;

     if( x == 30 ){
        if( y == 10 ){
            System.out.print("X = 30 and Y = 10");
        }
      }
  }
}

顺序结构的程序语句只能被执行一次。如果您想要同样的操作执行多次,,就需要使用循环结构。

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

  • while 循环

  • do…while 循环

  • for 循环

while 循环

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

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

public class Test {
  public static void main(String args[]) {
     int x = 10;
     while( x < 20 ) {
        System.out.print("value of x : " + x );
        x++;
        System.out.print("\n");
    }
  }
}

以上实例编译运行结果如下:

value of x : 10
value of x : 11
value of x : 12
value of x : 13
value of x : 14
value of x : 15
value of x : 16
value of x : 17
value of x : 18
value of x : 19

do…while 循环

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

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

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

注意:布尔表达式在循环体的后面,所以语句块在检测布尔表达式之前已经执行了。 如果布尔表达式的值为 true,则语句块一直执行,直到布尔表达式的值为 false。

public class Test {
  public static void main(String args[]){
     int x = 10;

     do{
        System.out.print("value of x : " + x );
        x++;
        System.out.print("\n");
    }while( x < 20 );
  }
}
value of x : 10
value of x : 11
value of x : 12
value of x : 13
value of x : 14
value of x : 15
value of x : 16
value of x : 17
value of x : 18
value of x : 19

for循环

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

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

for(初始化; 布尔表达式; 更新) {
   //代码语句
}
  • 最先执行初始化步骤。可以声明一种类型,但可初始化一个或多个循环控制变量,也可以是空语句。

  • 然后,检测布尔表达式的值。如果为 true,循环体被执行。如果为false,循环终止,开始执行循环体后面的语句。

  • 执行一次循环后,更新循环控制变量。

  • 再次检测布尔表达式。循环执行上面的过程。

public class Test {
  public static void main(String args[]) {

     for(int x = 10; x < 20; x = x+1) {
        System.out.print("value of x : " + x );
        System.out.print("\n");
    }
  }
}
value of x : 10
value of x : 11
value of x : 12
value of x : 13
value of x : 14
value of x : 15
value of x : 16
value of x : 17
value of x : 18
value of x : 19

Java 增强 for 循环

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

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

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

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

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

public class Test {
  public static void main(String args[]){
     int [] numbers = {10, 20, 30, 40, 50};

     for(int x : numbers ){
        System.out.print( x );
        System.out.print(",");
    }
     System.out.print("\n");
     String [] names ={"James", "Larry", "Tom", "Lacy"};
     for( String name : names ) {
        System.out.print( name );
        System.out.print(",");
    }
  }
}
10,20,30,40,50,
James,Larry,Tom,Lacy,

break 关键字

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

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

语法

break 的用法很简单,就是循环结构中的一条语句:

break;
public class Test {
  public static void main(String args[]) {
     int [] numbers = {10, 20, 30, 40, 50};

     for(int x : numbers ) {
        // x 等于 30 时跳出循环
        if( x == 30 ) {
           break;
        }
        System.out.print( x );
        System.out.print("\n");
    }
  }
}
10
20

continue 关键字

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

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

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

语法

continue 就是循环体中一条简单的语句:

continue;
public class Test {
  public static void main(String args[]) {
     int [] numbers = {10, 20, 30, 40, 50};

     for(int x : numbers ) {
        if( x == 30 ) {
       continue;
        }
        System.out.print( x );
        System.out.print("\n");
    }
  }
}
10
20
40
50

switch case 语句

switch case 语句判断一个变量与一系列值中某个值是否相等,每个值称为一个分支。

语法

switch case 语句语法格式如下:

switch(expression){
   case value :
      //语句
      break; //可选
   case value :
      //语句
      break; //可选
   //你可以有任意数量的case语句
   default : //可选
      //语句
}
  • switch 语句中的变量类型可以是: byte、short、int 或者 char。从 Java SE 7 开始,switch 支持字符串 String 类型了,同时 case 标签必须为字符串常量或字面量。

  • switch 语句可以拥有多个 case 语句。每个 case 后面跟一个要比较的值和冒号。

  • case 语句中的值的数据类型必须与变量的数据类型相同,而且只能是常量或者字面常量。

  • 当变量的值与 case 语句的值相等时,那么 case 语句之后的语句开始执行,直到 break 语句出现才会跳出 switch 语句。

  • 当遇到 break 语句时,switch 语句终止。程序跳转到 switch 语句后面的语句执行。case 语句不必须要包含 break 语句。如果没有 break 语句出现,程序会继续执行下一条 case 语句,直到出现 break 语句。

  • switch 语句可以包含一个 default 分支,该分支一般是 switch 语句的最后一个分支(可以在任何位置,但建议在最后一个)。default 在没有 case 语句的值和变量值相等的时候执行。default 分支不需要 break 语句。

switch case 执行时,一定会先进行匹配,匹配成功返回当前 case 的值,再根据是否有 break,判断是否继续输出,或是跳出判断.

public class Test {
  public static void main(String args[]){
     //char grade = args[0].charAt(0);
     char grade = 'C';

     switch(grade)
    {
        case 'A' :
           System.out.println("优秀");
           break;
        case 'B' :
        case 'C' :
           System.out.println("良好");
           break;
        case 'D' :
           System.out.println("及格");
           break;
        case 'F' :
           System.out.println("你需要再努力努力");
           break;
        default :
           System.out.println("未知等级");
    }
     System.out.println("你的等级是 " + grade);
  }
}
良好
你的等级是 C

如果 case 语句块中没有 break 语句时,JVM 并不会顺序输出每一个 case 对应的返回值,而是继续匹配,匹配不成功则返回默认 case。

public class Test {
  public static void main(String args[]){
     int i = 5;
     switch(i){
        case 0:
           System.out.println("0");
        case 1:
           System.out.println("1");
        case 2:
           System.out.println("2");
        default:
           System.out.println("default");
    }
  }
}
default

如果 case 语句块中没有 break 语句时,匹配成功后,从当前 case 开始,后续所有 case 的值都会输出。

public class Test {
  public static void main(String args[]){
     int i = 1;
     switch(i){
        case 0:
           System.out.println("0");
        case 1:
           System.out.println("1");
        case 2:
           System.out.println("2");
        default:
           System.out.println("default");
    }
  }
}
1
2
default

如果当前匹配成功的 case 语句块没有 break 语句,则从当前 case 开始,后续所有 case 的值都会输出,如果后续的 case 语句块有 break 语句则会跳出判断。

public class Test {
  public static void main(String args[]){
     int i = 1;
     switch(i){
        case 0:
           System.out.println("0");
        case 1:
           System.out.println("1");
        case 2:
           System.out.println("2");
        case 3:
           System.out.println("3"); break;
        default:
           System.out.println("default");
    }
  }
}
1
2
3

 

数组

枚举

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

继承

接口

多态

封装

抽象

重载

异常

throws 用来声明一个方法可能产生的所有异常,不做任何处理而是将异常往上传,谁调用我我就抛给谁。

throw 则是用来抛出一个具体的异常类型。

throws 在方法后边声明异常,其实就是自己不想对异常做出任何的处理,告诉别人自己可能出现的异常,交给别人处理,然别人处理。

throw 就是自己处理一个异常,有两种方式要么是自己捕获异常 try...catch 代码块,要么是抛出一个异常(throws 异常)。

 

posted @ 2021-03-10 12:51  莫困顿  阅读(60)  评论(0)    收藏  举报