1.通过抽象类定义车类的模板,然后通过抽象的车类来派生拖拉机、卡车、小轿车。
疯狂java讲义第六章课后第1题答案
2.定义一个接口,并使用匿名内部类方式创建接口的实例。
3.定义一个函数式接口,并使用Lambda表达式创建函数式接口的实例。
疯狂java讲义第六章课后第3题答案
4.定义一个类,该类用于封装一桌梭哈游戏,这个类应该包含桌上剩下的牌的信息,并包含5个玩家的状态信息:他们各自的位置、游戏状态(正在游戏或已放弃)、手上已有的牌等信息。如果有可能,这个类还应该实现发牌方法,这个方法需要控制从谁开始发牌,不要发牌给放弃的人,并修改桌上剩下的牌。
补充习题
1、尝试把Integer类型自动拆箱成boolean,尝试把boolean自动装箱成Integer
会产生不兼容类型报错
因为用了new Integer(1)
学到了一个编译指令
-Xlint:deprecation
自动拆箱也会报不兼容类型的错误
2、操作书171页提供的方法。
在后面有操作
3、重写dog和person的equals方法,让他们相等。
疯狂java讲义第六章补充习题第3题答案
4、创建一个单例类,并调用它创建多个对象,进行 = =比较,查看输出结果。
疯狂java讲义第六章补充习题第4题答案
5、精确的使用final修饰类或实例变量。
疯狂java讲义第六章补充习题第5题答案
6、自己试着写一个抽象类,包含抽象方法的和不包含抽象方法的。再写一个包含抽象方法的普通类,并尝试创建他们的实例
抽象类不包含抽象方法:依然不能创建实例
包含抽象方法的普通类,连编译都过不了
7、尝试使用中介模式来组合类。这里说的中介模式,其实就是工厂模式,但是中介更形象,更容易理解
疯狂java讲义第六章补充习题第7题答案
8、尝试写一个类,包含一个非静态类,看看初始化的时候会不会和非静态类一起初始化。
非静态内部类,不能有静态声明
而经过试验静态内部类并不会跟随外部类第一次被创建而初始化,如果没有在构造器或者初始化块中显式声明的话
9、使用jar命令。
疯狂java讲义第六章补充习题第9题答案
10、尝试创建对象的,软弱虚引用,结合强制垃圾回收进行测试,并说出他们的区别
StrongReference:就是我们正常使用的引用,只要有这个引用在,不论内存空间是否足够,都不会被垃圾回收器回收;
SoftReference是除了强引用以外,引用最强的,只要有这个引用在,只要系统内存足够,这个对象就不会被垃圾回收器回收
WeakReference:当垃圾回收机制启动的时候,就会被回收,不管有没有这个弱引用。
PhantomReference:虚引用,这个我猜测大概是引用都不能调用对象,所以比弱引用更弱,等会儿试一下,看看是不是这样。是的,连get()方法都返回null,只是在被回收以后,rq的poll()方法会返回这个引用的引用变量,get()依旧返回null
使用PhantomReference必须在构造器传入一个ReferenceQueue()对象,
11、尝试直接调用finalize方法,
调用起来,其实就像是一个普通方法一样,没啥区别。
就算是之后强制垃圾回收,也没有任何问题。
12、尝试强制垃圾回收。并测试结果。
疯狂java讲义第六章补充习题第12题答案
13、创建包含抽象方法的枚举类
其实,在枚举值后的花括号,是类似匿名类的实现,设不设置成抽象方法都一样,只是设置了抽象方法就要求,匿名类一定要重写,不然不能用。
疯狂java讲义第六章补充习题第13题答案
14、创建实现接口的枚举类。并结合switch语句
和普通类实现接口是一样的的实现方式
疯狂java讲义第六章补充习题第14题答案
15、创建普通枚举类,并使用
就算把构造器设置成public都不能用new Gender()的方法来创建一个实例,构造器甚至不能用public修饰
16、使用lambda表达式+arrays类
疯狂java讲义第六章补充习题第16题答案
17、说出lambda表达式和匿名内部类的联系和区别,
疯狂java讲义第六章补充习题第17题答案
18、使用lambda表达式的升级版,方法引用和构造器引用
19、创建匿名内部类并使用。
疯狂java讲义第六章补充习题第19题答案
20、创建内部类并在外部类内部使用内部类还有在外部类以外的地方使用内部类。(包括静态和非静态)并尝试使用内部类访问外部类的变量,使用外部类访问内部类的变量
疯狂java讲义第六章补充习题第20题答案
21、创建非静态内部类和静态内部类。
22、尝试命令模式,以及命令模式和抽象类的区别。p203
模仿书上的案例,同样对数组进行命令模式的处理
23、使用接口,并且尝试接口继承接口,接口继承类,接口实现接口。
接口中的变量默认用public static修饰
接口不能继承类,
好像也不能实现接口,会报错
24、说出abstract不能和哪几个关键字使用,和为什么?
疯狂java讲义第六章补充习题第24题答案
25、尝试缓存实例的不可变类。
疯狂java讲义第六章补充习题第25题答案
26、说出可变类和不可变类的区别,以及为什么要有不可变类。
可变类中至少有一个实例变量是可以修改的,而不可变类的所有实例变量都是不可修改的,也就是用final修饰了。
不可变类不仅仅是不可变,通过重写equals和hashCode可以实现按照内容判断两个对象是否相等。
java提供的八个包装类和String类都是不可变类,至于原因是什么,我不懂
看了一篇文章,不可变类,是线程安全的。让并发编程变得更简单深入理解Java中的不可变对象
27、创建final类,并尝试继承它
28、创建final方法,并尝试重写它
疯狂java讲义第六章补充习题第28题答案
30、尝试创建宏变量。
import java.util.*;
import java.util.stream.*;
import javax.swing.*;
public class Test
{
public static void main(String[] args)
{
String one = "疯狂Java讲义";
final String two1 = "疯狂";
final String two2 = "Java讲义";
String three = two1 + two2;
System.out.println(one == three);
}
}
31、说出final修饰基本类型变量和引用类型变量的联系和区别。
联系:二者都不能重新赋值
区别:引用类型变量不能重新赋值,并不代表他的实例变量或者类变量不能重新赋值。
32、创建final局部变量。
(卧槽)我感觉倒着来有点奇怪的感觉。是啊,我练题也感觉很奇怪,。。。
class One
{
public void info()
{
final String test = "我是大玩家";
final String test2;
//test2 = "你也是";
}
}
final局部变量,可以不赋值,但是final修饰的类变量和实例变量不行
33、按照书上说的地方模仿着自己实现一个枚举类。
其实有几个要点,
(1)把构造器设置为private
(2)提前声明静态变量,也就是要成为枚举值的那些变量,需要用public static final 进行修饰
(3)提供一个get枚举类的方法,和getprivate变量的方法。
34、创建局部内部类。
import java.util.*;
import java.util.stream.*;
import javax.swing.*;
public class Test
{
public static void main(String[] args)
{
//局部内部类
One one = new One()
{
public void info()
{
System.out.println("我是One的Info");
}
};
one.info();
}
}
class One
{
public void info()
{
}
}
35、使用parsexxx方法和valueOf方法,并说出他们的区别。
Character、String没有parse,有valueOf()
Byte、Short、Integer、Long、Float、Double、Boolean都有
区别是。parseXXX()返回基本数据类型而valueOf()返回包装类
36、使用包装类的基本方法
和39题一样,
37、使用Character的各种工具方法
和39题重复
38、熟悉lambda表达式的几种简化写法。
(1)当只有一个参数的时候可以省略括号,但没有参数的时候必须有一个空括号
(2)当只有一条语句的时候,可以省略花括号,如果需要返回值,并且也只有一条语句的时候,省略花括号还可以省略return,把这唯一一条语句当成返回值
39、使用八个基本数据类型的一些方法和变量
详细使用java八个包装类的方法和打印类变量
42、使用八个基本类型的xxxSequence,我猜测,这个大概是数组的包装类,因为疯狂中没有提到。猜的很好,根本不是,下次不要再猜了,不会的就百度,不要说不会。八个基本类型只有CharSequence。
43、使用String、StringBuilder和StringBuffer
测试一下StringBuffer的线程安全性
使用String、StringBuilder和StringBuffer
44、疑惑232,final和abstract不能同时使用,所以抽象枚举类可以创建子类,而非抽象枚举类,自动用final修饰,不能创建子类。从自己制作的枚举类可以看出,枚举类是不能new的,只能在类内部new
疯狂java讲义第六章补充习题第44题答案
45、为什么,数据库连接和网络IO会被说成物理资源,和堆内存中的对象有什么区别吗?
这个问题,先放着。
46、使用Charset类,
疯狂java讲义第六章补充习题第46题答案
47、说出强软弱虚引用的区别和作用。
强引用:可达状态,不可能被垃圾回收机制回收。作用,可以随时调用,不怕在堆区的对象被回收后,导致NullPointer错误。
软引用:内存空间足够的时候,和强引用相同。内存空间不足的时候,可能被垃圾回收机制回收。作用,通常用于对内存敏感的程序。但是什么是内存敏感的程序呢?
弱引用:垃圾回收机制运行的时候,就会被回收。它和失去引用的对象的区别是,它可以调用。
虚引用:完全类似于没有引用,也就是不能调用的弱引用。主要用于跟踪对象被垃圾回收的状态。虚引用不能单独使用,必须和引用队列联合使用。
因为书上的练习,肯定写过了,所以先放着。