补充习题
1、尝试把Integer类型自动拆箱成boolean,尝试把boolean自动装箱成Integer
会产生不兼容类型报错
因为用了new Integer(1)
学到了一个编译指令
-Xlint:deprecation
自动拆箱也会报不兼容类型的错误
6、自己试着写一个抽象类,包含抽象方法的和不包含抽象方法的。再写一个包含抽象方法的普通类,并尝试创建他们的实例
抽象类不包含抽象方法:依然不能创建实例
包含抽象方法的普通类,连编译都过不了
8、尝试写一个类,包含一个非静态类,看看初始化的时候会不会和非静态类一起初始化。
非静态内部类,不能有静态声明
而经过试验静态内部类并不会跟随外部类第一次被创建而初始化,如果没有在构造器或者初始化块中显式声明的话
10、尝试创建对象的,软弱虚引用,结合强制垃圾回收进行测试,并说出他们的区别
StrongReference:就是我们正常使用的引用,只要有这个引用在,不论内存空间是否足够,都不会被垃圾回收器回收;
SoftReference是除了强引用以外,引用最强的,只要有这个引用在,只要系统内存足够,这个对象就不会被垃圾回收器回收
WeakReference:当垃圾回收机制启动的时候,就会被回收,不管有没有这个弱引用。
PhantomReference:虚引用,这个我猜测大概是引用都不能调用对象,所以比弱引用更弱,等会儿试一下,看看是不是这样。是的,连get()方法都返回null,只是在被回收以后,rq的poll()方法会返回这个引用的引用变量,get()依旧返回null
使用PhantomReference必须在构造器传入一个ReferenceQueue()对象,
11、尝试直接调用finalize方法,
调用起来,其实就像是一个普通方法一样,没啥区别。
就算是之后强制垃圾回收,也没有任何问题。
接口中的变量默认用public static修饰
接口不能继承类,
好像也不能实现接口,会报错

26、说出可变类和不可变类的区别,以及为什么要有不可变类。
可变类中至少有一个实例变量是可以修改的,而不可变类的所有实例变量都是不可修改的,也就是用final修饰了。
不可变类不仅仅是不可变,通过重写equals和hashCode可以实现按照内容判断两个对象是否相等。
java提供的八个包装类和String类都是不可变类,至于原因是什么,我不懂

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)当只有一条语句的时候,可以省略花括号,如果需要返回值,并且也只有一条语句的时候,省略花括号
强引用:可达状态,不可能被垃圾回收机制回收。作用,可以随时调用,不怕在堆区的对象被回收后,导致NullPointer错误。
软引用:内存空间足够的时候,和强引用相同。内存空间不足的时候,可能被垃圾回收机制回收。作用,通常用于对内存敏感的程序。但是什么是内存敏感的程序呢?
弱引用:垃圾回收机制运行的时候,就会被回收。它和失去引用的对象的区别是,它可以调用。
















