Java面向对象高级语法实验2

(一)请打印下列程序输出结果,并思考自动装箱和拆箱在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中有哪些基本数据类型以及其对应的包装类?

基本数据类型byteshortintlongfloatdoublecharboolean
对应的包装类ByteShortIntegerLongFloatDoubleCharacterBoolean
(二)观察下列程序的输出结果,掌握枚举的定义及使用。
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表达式由参数、箭头、主体三部分组成。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值