补充习题
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修饰

接口不能继承类,

好像也不能实现接口,会报错

疯狂Java实战演习 疯狂java讲义最新版_内部类

 

26、说出可变类和不可变类的区别,以及为什么要有不可变类。

可变类中至少有一个实例变量是可以修改的,而不可变类的所有实例变量都是不可修改的,也就是用final修饰了。

不可变类不仅仅是不可变,通过重写equals和hashCode可以实现按照内容判断两个对象是否相等。

java提供的八个包装类和String类都是不可变类,至于原因是什么,我不懂

 

疯狂Java实战演习 疯狂java讲义最新版_疯狂Java实战演习_02

 

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错误。

软引用:内存空间足够的时候,和强引用相同。内存空间不足的时候,可能被垃圾回收机制回收。作用,通常用于对内存敏感的程序。但是什么是内存敏感的程序呢?

弱引用:垃圾回收机制运行的时候,就会被回收。它和失去引用的对象的区别是,它可以调用。