枚举类(Enum)

Enum看起来很象是特殊的class,它也可以有自己的变量,可以定义自己的方法,可以实现一个或者多个接口。当我们在声明一个enum类型时,我们应该注意到enum类型有如下的一些特征:

  1. 它不能有public的构造函数,这样做可以保证客户代码没有办法新建一个enum的实例。
  1. 所有枚举值都是public , static , final的。注意这一点只是针对于枚举值,我们可以和在普通类里面定义变量一样定义其它任何类型的非枚举变量,这些变量可以用任何你想用的修饰符。
  2. Enum默认实现了java.lang.Comparable接口。
  3. Enum覆载了了toString方法,因此我们如果调用Color.Blue.toString()默认返回字符串”Blue”.
  4. Enum提供了一个valueOf方法,这个方法和toString方法是相对应的。调用valueOf(“Blue”)将返回 Color.Blue.因此我们在自己重写toString方法的时候就要注意到这一点,一把来说应该相对应地重写valueOf方法。
  5. Enum还提供了values方法,这个方法使你能够方便的遍历所有的枚举值。
  6. Enum还有一个ordinal的方法,这个方法返回枚举值在枚举类种的顺序,这个顺序根据枚举值声明的顺序而定,这里Color.Red.ordinal()返回0。

引用enum的目的:
规范输入的类型,防止非法输入。


包装类

Object ----> Boolean,Number,Character
Number ----> Byte,Short,Integer,Float,Double,Long
对于Boolean类来说,进行创建对象的时候,传入的字符串如果是"true",则返回的值就是true,传入其他的字符串全部为false。
对于其他的就是既可以传入一个对应的基本数据类型,也可以传入一个字符串。

XXX.ParseXXX() //把字符串解析成对应的基本数据类型
short ss = Short.parseShort("123");  

//自动拆装箱 JDK1.5以后支持的
//对应的装箱函数是Short.valueOf(short s);
//对应的拆箱函数是Short.shortValue();

Short s = 12;
Short s2 = new Short((short)23);
short sS = s2;   

关于Integer的面试题

//面试问题
    Integer ii = 122;
    Integer iii = 122;
    System.out.println(ii==iii);//输出为true
    ii = 128;
    iii = 128;
    System.out.println(ii==iii);//输出为false 

关于这个问题首先要明确:

关于这个问题首先要明确:

  1. == 在比较引用对象时,比较的就是引用对象的地址

  2. 而对于Integer类来说,当赋的值小于byte的取值范围时,类里面有一个常量数组,就直接引用了,所以在比较较小的值的时候,会得到true,因为他们是同一个对象,也就是那个常量数组。

  3. 而对于比较大的值的Integer类,就不能直接引用常量数组了,就需要重新创建新的对象,两个对象的地址不同,自然就不相等了。

生成随机数的两个方法:

  1. Math.random() 生成的是[0,1)的随机数

  2. Random类,创建实例对象,调用nextXXX(border)返回[0,border)范围的对应的随机数。在创建实例对象的时候,可以传入种子,而对于种子相同的两个实例对象,生成的随机数是相同的,故生成的是伪随机数。

String的三个重要类

String 类

replace(oldStr,newStr):不支持正则表达式
replaceAll(str,replacement):支持正则表达式
String类在进行字符串的拼接过程中是创建多个实例的

String str1 = "abc";//创建了一个"abc"的对象
str1 += "def";//重新创建了一个"abcdef"对象,用str1来指向

StringBuffer 类

对于字符串的拼接来说,无论怎么拼接使用的就是同一个实例对象。
StringBuffer是线程安全的可变长字符序列

StringBuilder 类

对于字符串的拼接来说,无论怎么拼接使用的就是同一个实例对象。
创建的默认容量是16个字符
StringBuffer是非线程安全的可变长字符序列

内部类

  • 概念:在一个类的内部再定义一个完整的类。

  • 特点:

    • 编译之后可生成独立的字节码文件,命名格式是 “外部类$内部类.class”
    • 可为外部类提供必要的内部功能组件。
    • 内部类可以访问外部类的私有成员属性,而不破坏封装。
    • 成员内部类依赖于外部类的实例对象,不能脱离外部类独立存在。
    • 成员内部类不能够有静态的属性或方法。
  • 静态内部类:

    • 就相当于外部类的静态属性,不依赖外部实例对象。

    • 静态内部类中可以有静态属性,实例属性,其访问方法是一样的。

  • 局部内部类

    • 定义在方法内部的类,可以看作是一个局部变量,类比C语言中定义在函数中的结构体。
  • 静态内部类

    相当于静态成员变量

  • 匿名内部类

    没有名字的类

内部类访问局部变量的方法:

  • 变成常量,为什么需要变成常量?

  • 因为无法保障变量的生命周期与自身相同,所以变量必须修饰为final。