(一)请打印下列程序输出结果,并思考自动装箱和拆箱在java中的好处。
public class AutoPackingTest
{
public static void main(String[] args)
{
Integer A = 3;
int a = A;
System. out.println(a);
Integer A1 = 3;
System.out.println(A == A1);
A = 129;A1 =129;
System.out.println(A == A1);
}
}
其中a、A1与A是怎样的对应关系? A1=a=3;A2=3在-128~127时候都A和A1都从缓存中获得,地址是一样的;
当A=129,A1=129的时候就不会存到缓存池,而装箱后的对象对比的是内存地址。
对打印处理的结果加以说明? System.out.println(a):打印输出a的值为3; System.out.println(A == A1):打印输出A与A1的结果是否相同,A和A1都是从缓存中获取,地址相同, 会作为同一个对象,所以输出结果为true;
System.out.println(A == A1): A和A1的值超出-128~127,不会存到缓存池,装箱后的对象对比的就是内存地址,不是同一个对象,因此结果为false;
Java中有哪些基本数据类型以及其对应的包装类?
基本数据类型 | byte | short | int | long | float | double | char | boolean |
---|---|---|---|---|---|---|---|---|
对应的包装类 | Byte | Short | Integer | Long | Float | Double | Character | Boolean |
(二)观察下列程序的输出结果,掌握枚举的定义及使用。
enum Day {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}
public class EnumTest {
public static void main(String[] args) {
// 创建枚举数组
Day[] days = new Day[] { Day.MONDAY, Day.TUESDAY, Day.WEDNESDAY,
Day.THURSDAY, Day.FRIDAY, Day.SATURDAY, Day.SUNDAY };
// 打印枚举常量的序号以及枚举值
for (int i = 0; i < days.length; i++) {
System.out.println("day[" + days[i].ordinal() + "]:"
+ days[i].name());
}
// 通过compareTo方法比较,实际上其内部是通过ordinal()值比较的
System.out.println("day[1] VS day[2]:" + days[1].compareTo(days[2]));
}
}
枚举的本质是什么?
枚举的本质是一个类,可以定义属性、方法,可以构造函数、实现接口、继承类。(三) 编写枚举程序,其中有四种颜色(RED、GREEN、WHITE、YELLOW),每种颜色有自己的属性(名字和索引),需要实现构造方法、属性的get/set方法和通过索引获取名字的方法,以及重写toString()方法来打印索引加名字。之后编写一个测试类,测试这些方法,掌握枚举的定义及使用。
package case3;
enum Color {
// 枚举常量
RED("红色", 1), GREED("绿色", 2), WHITE("白色", 3), YELLOW("黄色", 4);
// 定义成员变量名字和索引
private String name;
private int index;
// 构造方法
private Color(String name, int index) {
this.name = name;
this.index = index;
}
// 通过索引获取名字
public static String getName(int index) {
for (Color c : Color.values()) {
if (c.getIndex() == index)
return c.name;
}
}
// get和set方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getIndex() {
return index;
}
public void setIndex(int index) {
this.index = index;
}
@Override
// 重写toString()方法来打印索引加名字
public String toString() {
return this.index + "-" + this.name;
}
}
public class Color_Enum_Test {
public static void main(String[] args) {
// 创建枚举数组
Color[] colors = new Color[] { Color.RED, Color.GREED, Color.WHITE, Color.YELLOW };
// 打印枚举常量的序号以及名字
for (int i = 0; i < colors.length; i++) {
System.out.println(colors[i].toString());
}
}
}
(四)请说明注释与注解的区别并举例说明?编写程序使用@override和@Deprecated注解。
①注释:用于解释代码的含义,或者别人方便阅读你的代码;如:// 创建枚举数组 /打印枚举常量的序号以及枚举值/
②注解:是程序中的标签,可以在编译、类加载、运行时被读取,并执行相应的处理;如: @AnnotationTest Public class
AnnoTest{ }
package case4;
public class OverrideTest {
String name;
@Override
//不报错,OverrideTest的父类Object有toString方法
public String toString()
{
return name;
}
@Override
//报错,OverrideTest的父类Object没有fromString方法
public String fromString()
{
return name;
}
}
package case4;
public class DeprecatedTest {
@Deprecated
// 表示hi方法被弃用
public void hi() {
System.out.println("say hi");
}
public void hello() {
System.out.println("say hello");
}
}
(五)运行下列代码并打印输出结果,理解Lambda表达式
package case5;
interface Addable {
int add(int a, int b);
}
public class LambdaExpressionExample3 {
public static void main(String[] args) {
// Multiple parameters in lambda expression
Addable ad1 = (a, b) -> (a + b);
System.out.println(ad1.add(10, 20));
// Multiple parameters with data type in lambda expression
Addable ad2 = (int a, int b) -> (a + b);
System.out.println(ad2.add(100, 200));
}
}
(六)使用Lambda表达式改写下列代码并打印输出结果。
interface Drawable {
public void draw();
}
public class LambdaExpressionExample {
public static void main(String[] args) {
int width = 10;
// without lambda, using anonymous class
Drawable d = new Drawable() {
public void draw() {
System.out.println("Drawing " + width);
}
};
d.draw();
}
}
package case6;
interface Drawable {
public void draw();
}
public class LambdaExpressionExample {
public static void main(String[] args) {
int width = 10;
Drawable d = () -> System.out.println("Drawing " + width);
d.draw();
}
}
(七)使用Lambda表达式编写一个函数式接口,内含唯一的抽象方法makeFood,且无参数,无返回值。分别使用内部类方法和Lambda的标准格式调用invokeCook方法,打印"享用美食!"字样。
package case7;
interface invokeCook {
// 抽象方法makeFood
abstract void makeFood();
}
public class LambdaDemo {
public static void main(String[] args) {
// 使用内部类方法调用invokeCook方法
invokeCook mf = new invokeCook() {
@Override
public void makeFood() {
System.out.println("享用美食!");
}
};
mf.makeFood();
// 使用Lambda的标准格式调用invokeCook方法
invokeCook mf1 = () -> System.out.println("享用美食!");
mf1.makeFood();
}
}
(八)思考题
(1) Integer A = 5; A = A+ 1; 经历了什么过程? 自动封装A;A自动拆箱+1;之后自动装箱。
(2) Enum是所有 Java 语言枚举类型的公共基本类(注意Enum是抽象类);它的常见方法有哪些?
Name(),toString和ordina
(3) 请描述Java提供的5个基本的注解及作用。
① @Override 重写父类函数;
② @Deprecated 忽略该函数;
③ @SuppressWarings 忽略特定的警告信息
④ @SafeVargs 提醒开发者不要用参数做一些不安全的操作;
⑤ @FunctionalLinterface 引入函数式接口。 (4) 什么是函数式接口?
函数接口是只能有一个抽象方法的接口。
(5)Lambda表达式由哪三部分组成? Lambda表达式由参数、箭头、主体三部分组成。