java基础-温故而知新(02)
基本数据的自动拆装箱及享元设计模式
1.1 自动装箱
-128~127 之间的整数,装在一个内存区域。
超过这个范围的整数,装在不同的内存区域。
1.2 自动拆箱
Integer i1=12;
System.out.println(i1 + 5);//17
1.3 享元模式 flyweight
如果很多很小的对象,他们有很多相同的东西,那就可以把它们变成一个东西;还有不一样的东西就变成外部属性,作为方法的参数传入。
package com.itcast.day1;
public class AutoBox {
public static void main(String[] args) {
//-128~127之间
Integer i1=12;
Integer i2=12;
System.out.println(i1==i2);//true i1,i2被放置在同一内存区域
System.out.println(i1 + 5);//17 //大于127
Integer i3=134;
Integer i4=134;
System.out.println(i3 == i4);//false i3,i4被放置在不同的内存区域 //这不是自动装箱,而是手工调用valueOf这个静态方法,
//把一个基本类型整数变成了一个包装类型对象。
Integer i5=Integer.valueOf(15);
Integer i6=Integer.valueOf(15);
System.out.println(i5 == i6);//true Integer i7=Integer.valueOf(156);
Integer i8=Integer.valueOf(156);
System.out.println(i7 == i8);//false /**
* 在 包装类型内部,使用了享元模式,即:
*
* 如果很多很小的对象,他们有很多相同的东西,
* 那就可以把它们变成一个东西;
* 还有不一样的东西就变成外部属性,作为方法的参数传入。
*/
}
}
2. java枚举
2.1 枚举是什么? 为什么要用枚举?
要定义星期几或者性别的变量,该怎么定义?
假设用1-7分别表示星期一到星期天,但有人有可能会写成 int weekDay=0;
枚举就是要让某个类型的变量的取值只能为若干个固定的值中的一个,否则,编译器就会报错。
枚举可以让编译器在编译时就可以控制源程序中填写的非法值,普通变量的方式在开发阶段无法实现这一目标。
2.2 用普通类如何实现枚举功能,定义一个Weekday的类来模拟枚举功能。
私有的构造方法
每个元素分别用一个共有的静态成员表示 static final
可以有若干共有方法或抽象方法,例如,要提供nextDay方法必须是抽象的。
采用抽象方法定义nextDay就是将大量的if,else语句转换成一个一个独立的类。
//模拟枚举package com.itcast.day1;
public abstract class WeekDay { //私有化构造
private WeekDay(){} //抽象方法,放在子类去实现
public abstract WeekDay nextDay(); public final static WeekDay SU=new WeekDay(){
@Override
public WeekDay nextDay() {
return MO;
} @Override
public String toString(){
return "SU";
}
}; public final static WeekDay MO=new WeekDay(){ @Override
public WeekDay nextDay() {
return TU;
} @Override
public String toString(){
return "MO";
}
}; public final static WeekDay TU=new WeekDay(){ @Override
public WeekDay nextDay() {
return WE;
} @Override
public String toString(){
return "TU";
}
}; public final static WeekDay WE=new WeekDay(){ @Override
public WeekDay nextDay() {
return TH;
} @Override
public String toString(){
return "WE";
} }; public final static WeekDay TH=new WeekDay(){ @Override
public WeekDay nextDay() {
return FR;
} @Override
public String toString(){
return "TH";
}
}; public final static WeekDay FR=new WeekDay(){
@Override
public WeekDay nextDay() {
return SA;
} @Override
public String toString(){
return "FR";
}
}; public final static WeekDay SA=new WeekDay(){
@Override
public WeekDay nextDay() {
return SU;
} @Override
public String toString(){
return "SA";
}
}; }
package com.itcast.day1;
//测试
public class EnumTest {
public static void main(String[] args) {
WeekDay weekDay=WeekDay.MO;
System.out.println(weekDay);
System.out.println(weekDay.nextDay());
}
}
2.3 枚举的基本应用
package com.itcast.day1; public enum WeekDay2 {
SUN,MON,TUS,WEN,THI,FRI,STA;
} package com.itcast.day1; public class SunEnumTest {
public static void main(String[] args) {
WeekDay2 weekDay=WeekDay2.MON;
System.out.println(weekDay);//MON
System.out.println(weekDay.name());//MON
System.out.println(weekDay.ordinal());//1
System.out.println(weekDay.valueOf("MON"));//MON
System.out.println(weekDay.values());// 枚举元素的数组 [Lcom.itcast.day1.WeekDay2;@133c5982
System.out.println(weekDay.values().length);//元素个数 7
}
}
2.4 实现带有构造方法的枚举
//枚举package com.itcast.day1; public enum WeekDay2 {
SUN(2),MON(),TUS,WEN,THI,FRI,STA;//保证写在最前面
//构造需要私有,不被外人所知
private WeekDay2(){System.out.println("first");}//不带参数的构造方法
private WeekDay2(int day){System.out.println("second");}//带参数的构造方法
}
//测试package com.itcast.day1; public class SunEnumTest {
public static void main(String[] args) {
WeekDay2 weekDay=WeekDay2.MON;
}
}结果打印:second
firstfirst
first
first
first
first
- 枚举就相当于一个类,其中也可以定义构造方法、成员变量、普通方法和抽象方法。
- 枚举元素必须位于枚举体中的最开始部分,枚举元素列表的后要用;与其他成员分隔。
- 如果把枚举中的成员方法或变量等放在枚举元素的前面,编译器报错。
构造方法的枚举
- 构造方法必须定义为私有的。
- 如果有多个构造方法,该如何选择哪个构造方法?
- 枚举元素MON和MON()的效果一样,都是调用默认的构造方法。
带方法的枚举
- 定义枚举TrafficLamp
- 实现普通的next方法
- 实现抽象的next方法:每个元素分别是由枚举类的之类来生成的实例对象,这些子类采用类似内部类的方法进行定义。
- 增加上表示时间的构造方法
- 枚举只有一个成员时,就可以作为一种单例的实现方式。
- 构造方法不用自己写了,默认的是私有的不带参数的。
- newInstance也不用自己写了,枚举初始化时自己就创建了。
package com.itcast.day1;
public class EnumTest {
public static void main(String[] args)throws Exception { TrafficLamp tfl=TrafficLamp.RED;
System.out.println(tfl);
System.out.println(tfl.nextLamp()); for(String arg:args){
System.out.println(arg);
} System.out.println("*************************"); /* 枚举自动生成一些方法,如 values()方法
* The compiler automatically adds some special methods when it creates an enum.
* For example, they have a static values method that returns an array containing
* all of the values of the enum in the order they are declared.
*/
for(TrafficLamp tf:TrafficLamp.values()){
System.out.println(tf);
} /* 所有的枚举,都继承自java.lang.Enum
* Note: All enums implicitly extend java.lang.Enum. Because a class can only extend one parent (see Declaring Classes),
* the Java language does not support multiple inheritance of state and therefore an enum cannot extend anything else.
*/
Class clazz=TrafficLamp.class;//得到字节码
String supClassName=clazz.getSuperclass().getName();
System.out.println(supClassName);//java.lang.Enum clazz=Class.forName(supClassName);
supClassName=clazz.getSuperclass().getName();
System.out.println(supClassName);//java.lang.Object
} public enum TrafficLamp{ //RED,GREEN,YELLOW这些元素都是枚举TrafficLame的子类的实例
RED(30){//内部类
@Override
public TrafficLamp nextLamp() {//实现抽象方法
return GREEN;
}
},
GREEN(45){
@Override
public TrafficLamp nextLamp() {
return YELLOW;
}
},
YELLOW(5)/*调用YELLOW子类有参数构造,子类.super(5)调用了父类TrafficLamp的有参构造*/{
@Override
public TrafficLamp nextLamp() {
return RED;
}
};
private int time;
public abstract TrafficLamp nextLamp();//抽象方法
private TrafficLamp(int time){this.time=time;}//构造方法要私有化 @Override
public String toString() {
return this==RED?"RED : "+this.time:this==GREEN?"GREEN : "+this.time:"YELLOW : "+this.time;
}
}
}
/*** 运行结果:
RED : 30
GREEN : 45
*************************
RED : 30
GREEN : 45
YELLOW : 5
java.lang.Enum
java.lang.Object */
java基础-温故而知新(02)的更多相关文章
- 020 01 Android 零基础入门 01 Java基础语法 02 Java常量与变量 14 变量与常量 知识总结
020 01 Android 零基础入门 01 Java基础语法 02 Java常量与变量 14 变量与常量 知识总结 本文知识点:变量与常量 知识总结 Java中的标识符 Java中的关键字 目前常 ...
- 019 01 Android 零基础入门 01 Java基础语法 02 Java常量与变量 13 数据类型转换的代码示例
019 01 Android 零基础入门 01 Java基础语法 02 Java常量与变量 13 数据类型转换的代码示例 本文知识点:Java中的数据类型转换案例 学习视频有误,导致没法写文,文章内容 ...
- 018 01 Android 零基础入门 01 Java基础语法 02 Java常量与变量 12 数据类型转换的基本概念
018 01 Android 零基础入门 01 Java基础语法 02 Java常量与变量 12 数据类型转换的基本概念 本文知识点:Java中的数据类型转换 类型转换 类型转换分类 2类,分别是: ...
- 017 01 Android 零基础入门 01 Java基础语法 02 Java常量与变量 11 变量综合案例
017 01 Android 零基础入门 01 Java基础语法 02 Java常量与变量 11 变量综合案例 本文知识点:变量 相同类型的变量可以一次同时定义多个 例:可以一行代码同时定义2个变量x ...
- 016 01 Android 零基础入门 01 Java基础语法 02 Java常量与变量 10 布尔类型和字符串的字面值
016 01 Android 零基础入门 01 Java基础语法 02 Java常量与变量 10 布尔类型和字符串的字面值 本文知识点:字面值 关于字面值的概念,需要注意:很多地方,我们可能就把字面值 ...
- 015 01 Android 零基础入门 01 Java基础语法 02 Java常量与变量 09 Unicode编码
015 01 Android 零基础入门 01 Java基础语法 02 Java常量与变量 09 Unicode编码 本文知识点:Unicode编码以及字符如何表示? ASCII码是美国提出的标准信息 ...
- 014 01 Android 零基础入门 01 Java基础语法 02 Java常量与变量 08 “字符型”字面值
014 01 Android 零基础入门 01 Java基础语法 02 Java常量与变量 08 "字符型"字面值 字符型 字面值如何表示? 两个关键:单引号(必须是英文单引号). ...
- 013 01 Android 零基础入门 01 Java基础语法 02 Java常量与变量 07 基本数据类型变量的存储
013 01 Android 零基础入门 01 Java基础语法 02 Java常量与变量 07 基本数据类型变量的存储 变量和它的值如何在内存中进行存储的? 前面学习过:Java中的数据类型分为基本 ...
- 012 01 Android 零基础入门 01 Java基础语法 02 Java常量与变量 06 浮点型“字面值”
012 01 Android 零基础入门 01 Java基础语法 02 Java常量与变量 06 浮点型"字面值" 浮点型字面值 首先要知道一点:在整型部分中,默认情况下,即整型数 ...
随机推荐
- SQOOP安装部署
1.环境准备 1.1软件版本 sqoop-1.4.5 下载地址 2.配置 sqoop的配置比较简单,下面给出需要配置的文件 2.1环境变量 sudo vi /etc/profile SQOOP_HOM ...
- 从字节码层面看“HelloWorld”
一.HelloWorld 字节码生成 众所周知,Java 程序是在 JVM 上运行的,不过 JVM 运行的其实不是 Java 语言本身,而是 Java 程序编译成的字节码文件.可能一开始 JVM 是为 ...
- Mysql 5.7 基于组复制(MySQL Group Replication) - 运维小结
之前介绍了Mysq主从同步的异步复制(默认模式).半同步复制.基于GTID复制.基于组提交和并行复制 (解决同步延迟),下面简单说下Mysql基于组复制(MySQL Group Replication ...
- 【图文详细教程】maven3安装配置+eclipse离线安装maven3插件《《唯一成功的教程~~~2018-01-09》》
环境搭建前提: 1.电脑上已经安装了1.7以及以上版本的JDK(因为我提供的maven版本是最新的3.3.9的,要求最低JDK1.7) 2.配置好了ecplise并且能正常启动 第一步:下载maven ...
- Python和Java编程题(三)
1.题目:判断101到200之间有多少个素数,并输出所有素数 题目分析:判断一个数是否为素数,只需要判断这个数有没有除1和它自身外的其他因数.因此,判断这个数能否被2-它的平方根中的任意一个数整除即可 ...
- [Codeforces 1016F]Road Projects
Description 题库链接 给你一棵 \(n\) 个节点的树,定义 \(1\) 到 \(n\) 的代价是 \(1\) 到 \(n\) 节点间的最短路径的长度.现在给你 \(m\) 组询问,让你添 ...
- Java 使用 happen-before 规则实现共享变量的同步操作
前言 熟悉 Java 并发编程的都知道,JMM(Java 内存模型) 中的 happen-before(简称 hb)规则,该规则定义了 Java 多线程操作的有序性和可见性,防止了编译器重排序对程序结 ...
- Vim——回顾整理
一.命令练习(一) hjkl(左下上右) 保存到某路径 :saveas 路径 w 到下一个单词的开头 e 到下一个单词的结尾 % 括号匹配移动(),{},[] 0 到行头 $ 到行头 gU字母变大写 ...
- XCode - App installation failed (A valid provisioning profile for this executable was not found)
OSX:10.14 XCode:10.1 iPhone:iPhone 4S IOS9.3.5 我不得不骂那些SB们,不懂就别TMD乱写文章,误导别人!!我今天看了很多关于这个错误的中文文章,结果都没能 ...
- Umbraco 资源推荐
Umbraco 社区 Umbraco 官方社区.找到人们谈论当前的 Umbraco 主题的最好方法是通过 Twitter.Umbraco 也知道他们很多的聚会和节日在世界各地举行.Umbraco 的开 ...