一.枚举
在JDK1.5 之前,我们定义常量都是: public static final.... 。现在好了,有了枚举,可以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法。
public class Season { public static final Season SPRING=new Season("春天","穿暖花开"); public static final Season SUMMER=new Season("夏天","烈日炎炎"); public static final Season AUTUMN=new Season("秋天","天高云阔"); public static final Season WINTER=new Season("冬天","白雪皑皑"); private String name; private String des; private Season(){}; private Season(String name, String des) { this.name = name; this.des = des; } @Override public String toString() { return "Season{"+ "des='"+des+'\''+ ", name='"+name+'\''+ '}'; } }
版本迭代以后
1.构造器默认私有
2.枚举中属性必须位于枚举元素下面
3.所有的自定义枚举默认继承自Enum类
4.枚举类不能再继承其他的类
5.枚举类可以实现一个接口
6.枚举对象可以根据自身的需求,灵活判断是否需要自定义接口内的方法
public enum Season { SPRING("春天","穿暖花开"), SUMMER("夏天","烈日炎炎"), AUTUMN("秋天","天高云阔"), WINTER("冬天","白雪皑皑"); private String name; private String des; Season(){}; Season(String name, String des) { this.name = name; this.des = des; } }
也可以直接建立一个Enum类型
public enum Gender { MAN,WOMAN }
main
public class EnumTest { public static void main(String[] args) { Gender gender=Gender.MAN; switch (gender){ case MAN: System.out.println("just man"); break; case WOMAN: System.out.println("just woman"); break; default: throw new IllegalStateException("Unexpected value: " + gender); } } }
即可
实现接口的代码:
package com.atguigu.day10; public enum Gender implements Run{ MAN{ @Override public void run(){ System.out.println("昂首挺胸"); } },WOMAN{ @Override public void run(){ System.out.println("婀娜多姿"); } } } interface Run{ void run(); }
main
package com.atguigu.day10; public class EnumTest { public static void main(String[] args) { Gender gender=Gender.MAN; gender.run(); } }
输出
昂首挺胸
二.包类型
1.Java是面向对象的,万事万物皆对象
如何判断一个变量是不是对象,让此变量 .出现一些列的方法,则是对象
常见的包类型有:
byte short int long float double char boolean
Byte Short Integer Long Float Double Character Boolean
Integer就是int的包装类
package com.atguigu.day10; public class Test2 { public static void main(String[] args) { System.out.println(Integer.MAX_VALUE); System.out.println(Integer.MIN_VALUE); //将一个十进制的数转换为2进制 String s1= Integer.toBinaryString(2); System.out.println(s1); //将一个十进制的数转换为8进制 String s2 =Integer.toOctalString(9); System.out.println(s2); /* 基本数据类型与包装类之间的转换 1.基本数据转换为包装类型 老方法: 方式一:通过构造器 Integer 标识符 = new Integer(基本数据类型); 方式二: Integer 标识符 = Integer.valueOf(基本数据类型); 新方法: Inteter 标识符=基本数据类型 */ int a=10; Integer i1=new Integer(a); Integer i2 = Integer.valueOf(a); Integer i3=23; /* 2.包装类型转换为基本数据类型 方法一:调用包装类的intValue(); 方法二:自动拆箱 直接将引用数据类型变为基本数据类型 基本数据类型 标识符 = 包装对象 */ Integer i4=new Integer(20); int i44=i4.intValue(); int i5=i4; } }
字符串与基本数据类型/包装类型的转换
package com.atguigu.day10; public class Test3 { /* 1.字符串-----》基本数据类型/包装类 方法1: Integer.parseInt("字符串纯数字"); 如果不是纯数字,会报异常 方法2: Integer ix = new Integer("字符串纯数字"); 其他包装类依次类推: Double.parseDouble("字符串小数"); Boolean.parseBoolean("true"); Long.parseLong("123.3"); 注意: char中没有此方法 2.基本类型数据转换为字符串 方法1:""+基本数据类型 方法2:String.valueOf(); */ public static void main(String[] args) { //以Double为例 String ages= "25.5"; Double v =Double.parseDouble(ages); System.out.println(v); Double v2= new Double("34.2"); System.out.println(v2); //转为字符串 String s1=""+100; String s2 = String.valueOf(100); System.out.println(s1); System.out.println(s2); } }
2.包装类型数据只能接受对应的包装类型,其他类型不能再采用类型自动提升
比如
Byte b =20; Integer i=b; 这样就会报错
3.包装类的缓存问题:
包装类 缓存对象
Byte -128-127
Short -128-127
Integer -128-127
Long -128-127
Float 没有
Double 没有
Character 0-127
Boolean true/false
代码:
package com.atguigu.day10; public class BaoTest { public static void main(String[] args) { Integer i=1; Integer j=1; System.out.println("i==j:"+(i==j));//true Integer i1=128; Integer j1=128; System.out.println("i1==j1:"+(i1==j1));//false Integer i2=new Integer(1);//新NEW的在堆中 Integer j2=1;//这个用的是缓冲区的常量对象,在方法区 System.out.println("i2==j2:"+(i2==j2));//false Integer i3=new Integer(1);//新NEW的在堆中 Integer j3=new Integer(1);//另一个新NEW的堆中 System.out.println("i3==j3:"+(i3==j3));//false Double d1 = new Double(1.0); Double d2 = new Double(1.0); System.out.println("d1==d2:"+(d1==d2)); //没有缓存对象,每个都是新new的,false } }
常见面试题
package com.atguigu.day10; public class BaoTest { public static void main(String[] args) { Integer i=1; Integer j=1; System.out.println("i==j:"+(i==j));//true Integer i1=128; Integer j1=128; System.out.println("i1==j1:"+(i1==j1));//false Integer i2=new Integer(1);//新NEW的在堆中 Integer j2=1;//这个用的是缓冲区的常量对象,在方法区 System.out.println("i2==j2:"+(i2==j2));//false Integer i3=new Integer(1);//新NEW的在堆中 Integer j3=new Integer(1);//另一个新NEW的堆中 System.out.println("i3==j3:"+(i3==j3));//false Double d1 = new Double(1.0); Double d2 = new Double(1.0); System.out.println("d1==d2:"+(d1==d2)); //没有缓存对象,每个都是新new的,false Double d3 =1.0; double d4 =1.0; //true,和基本数据类型比较会自动拆箱,比较数值 System.out.println(d3==d4); Integer i4=1000; double d5=1000; //true,会先将i4自动拆箱为int,然后根据基本数据类型“自动类型转换”规则,转为double比较 System.out.println(i4==d5); Integer i5=1000; int i6 =1000; //true,会将i5自动拆箱为int System.out.println(i5==i6); Integer i7=30; System.out.println("before change:"+i7); changeValue(i7); System.out.println("after change:"+i7); /* 输出 before change:30 changing:60 after change:30*/ } private static void changeValue(Integer i7) { i7=60; System.out.println("changing:"+i7); } }