1.编写一个学生类,提供name、age、gender、phone、address、cmail成员变量,且为每个成员变量提供 seter.geter方法。为学生类提供默认的构造器和带所有成员变量的构造器。为学生类提供方法,用于描绘吃、喝、玩、睡等行为。
疯狂java讲义第五章课后习题第1题答案
2.利用第1题定义的Student类,定义一个Studen]数组保存多个Student对象作为通讯录数据。程序可通过name、email、address查询,如果找不到数据,则进行友好提示。
疯狂java讲义第五章课后习题第2题答案
3.定义普通人、老师、班主任、学生、学校这些类,提供适当的成员变量、方法用于描述其内部数据和行为特征,并提供主类使之运行。要求有良好的封装性,将不同类放在不同的包下面,增加文档注释,生成API文档。
人类,用来继承的抽象类,不能创造实例
发现重写了OrdinaryPerson的equals后,他的子类其实就不用再重写equals了。
疯狂java讲义第五章课后习题第3题答案
4.改写第1题的程序,利用组合来实现类复用。
组合方式有点不好的就是,需要在组合的类中使用被组合的类的时候需要写一个空架子方法,里面再调用被组合类的方法,而继承方式就不需要这样子。总之,组合会稍微麻烦一点,但是has - a的时候还是要使用组合的方式
5.定义交通工具、汽车、火车、飞机这些类,注意它们的继承关系,为这些类提供超过3个不同的构造器,并通过实例初始化块提取构造器中的通用代码。
补充习题
1、显式使用this调用当前对象的成员变量和方法。
可不可以在子类用this调用父类的方法或者变量:和super的效果完全相同,目前知道的区别是super.方法调用的是父类被重写的原本的方法。其他的区别还不知道
2、在static修饰的方法中新建对象,调用非static成员变量和方法。
其实补充的第一题也包含了相同的概念。
3、试着声明一个static int类型的类变量,并创建两个对象,两个对象先打印这个类变量进行查看,然后用类名将类变量增加10,最后两个对象再次打印查看。
这里的答案和题目有一点区别,但是神似。
疯狂java讲义第五章补充习题第2题答案
4、在构造器中使用this,理解在构造器中this.代表正在初始化的变量。
5、创建一个类,提供一个return this;方法,多次调用这个方法。
对上面的One进行扩展完成这题
6、创建一个对象提供swap方法,和test方法,test传入两个基本数据类型参数和一个引用类型参数,分别对它们进行swap,并查看结果。
7、尝试使用String…name这种不定数量的参数,并使用数组,直接传入,不传入参数进行调用。尝试不将String…name作为方法的最后一个参数,查看会报什么错误。
传入数组的话,不能直接用静态的方法,也就是不能{}只是两个花括号,要以这种格式,new int[] {} ,这里说的格式是直接传入的方式,变量的话就没这样的要求了。
不放在最后一个位置的话,会直接和你说
疯狂java讲义第五章补充习题第7题答案
8、(1)创建一个类,在类中声明类初始化块,并在其中打印字符串,再在实例初始化块和构造器中做相同操作,进行new多个实例,看看输出如何。比如做出四代继承,然后只是创造最小的那个辈分的类的实例,看看输出,都包括静态初始化块,实例初始化块,和构造器;
(2)强化:创建这个类的子类,同样操作,并new多个实例,这个子类有多个构造器,有参数构造器通过this()调用这个子类的无参数构造器。
当我想要既通过super调用父类的有参数构造器,又想要看看this()调用本类的无参数构造器,看看是不是也会调用到父类构造器的时候,发现,就遇到了super和this的冲突,所幸结果是确定的,调用本类的无参数构造器,也会调用父类的无参数构造器。只有在方法中调用了super才会调用对应的有参数构造器
疯狂java讲义第五章补充习题第8题答案
9、创建一个类,将this()不放在构造器的第一行,查看报错,将super()不放在第一行查看报错。
是编译错误
11、当你想让一个子类同时继承两个父类时,尝试采取间接继承方案,并使用查看效果。
第一种方案,间接继承
疯狂java讲义第五章补充习题第11题答案
12、子类覆盖父类的方法,尝试让子类方法的返回值类型大于父类,同样的操作用于抛出异常、方法访问权限上。
疯狂java讲义第五章补充习题第12题答案
13、子类用类方法覆盖父类的实例方法,也操作一下,子类用实例方法覆盖父类的类方法和子类实例方法覆盖父类实例方法,子类类方法覆盖父类类方法。
疯狂java讲义第五章补充习题第13题答案
14、使用子类重载父类的方法。
疯狂java讲义第五章补充习题第14题答案
15、使用多态的类的方法和变量,查看是父类还是子类的方法和变量。在调用子类的扩展方法。使用instanceof+强制类型转换后再试试查看结果。
疯狂java讲义第五章补充习题第15题答案
16、使用子类尝试越过父类的setAge方法的检查,将年龄设置为10000。
由于为了具有良好的封装,那么age只能用private修饰,所以报错也只能如下情况
17、定义一个抽象类,再把他的子类实例赋给用抽象类声明的变量,看看能不能调用子类重写的抽象方法,并且看看效果,
疯狂java讲义第五章补充习题第17题答案
18、尝试给一个方法多个不定数量的参数
报错如下
然后经过测试,声明这种不定数量的参数,只需要 type … name,就是按照顺序包含这三个东西就好了,空格不影响
19、尝试用void声明构造器,
创建对象的时候,没有反应,但是可以当成方法调用
public class Test
{
public void Test()
{
System.out.println("你好,旅行者!");
}
public static void main(String[] args)
{
Test test = new Test();
test.Test();
}
}
所以这么写的话,其实就是写了一个方法。
20、尝试在实例内部用实例名称.方法,或者.变量,来看看能不能调用
不能,
21、尝试写一个递归方法,就拿斐波那契数列来吧
public class Test
{
public int fib(int a)
{
if(a == 1 || a == 2)
return 1;
if(a==0)
return 0;
return fib(a-1)+fib(a-2);
}
public static void main(String[] args)
{
Test test = new Test();
System.out.println(test.fib(7));
}
}
22、尝试重载一个方法。
public class Test
{
public static void main(String[] args)
{
One one = new One();
one.fly();
one.fly("变身");
}
}
class One
{
public void fly()
{
System.out.println("我在飞,飞的很慢");
}
public String fly(String name)
{
System.out.println("我变成了老鹰,飞的非常快!");
return "老鹰的速度";
}
}
返回值根本不影响
23、声明一个Person的引用变量但不创建,,看看会不会调用类初始化块。或者初始化类变量
不会,只是声明引用变量并不会触发类的初始化,所以只有第一次创建一个对象才会触发,需要创建,而不能只是声明一个引用变量。
24、尝试声明一个局部变量,但不显式初始化,然后打印,
结果
给基础变量类型设置为null试一试
public class Test
{
public static void main(String[] args)
{
One one = new One();
}
}
class One
{
public void fly()
{
int a;
a = 1;
System.out.println(a+"");
}
}
25、在方法中写一个和实例变量名字相同的局部变量,这个实例变量的名称和一个类变量相同,然后尝试用this调用,和类名.调用
一个类中并不能声明同名的实例变量和类变量
public class Test
{
public static void main(String[] args)
{
One one = new One();
one.fly();
}
}
class One
{
public static String name = "哈哈";
public String name2 = "卧槽";
public void fly()
{
String name2 = "super~!!";
System.out.println(this.name2);
}
}
26、尝试写一个封装的比较好的get和set方法
这里写一个Person类,有一个年龄实例变量,和它的set和get方法,
其实主要是set方法需要限制
public class Test
{
public static void main(String[] args)
{
Person person = new Person();
person.setAge(13);
System.out.println("person的年龄:"+person.getAge());
person.setAge(1999);
}
}
class Person
{
private int age;
public void setAge(int age)
{
if(age >=0 && age <=100)
this.age =age;
else
System.out.println("你输入的年龄太离谱,不能设置!");
}
public int getAge()
{
return age;
}
}
27、使用import static导入静态方法和静态变量,并使用System和Math
我懂了,import只能导入类,而import static 可以导入类方法和类变量。
如果是import的话,只能通过创建对象,或者类名的方式来调用类方法和类变量
import static 则完全可以直接使用,就好像是在自己的类中一样。
28、尝试private父类实例方法,子类重写为类方法。然后public父类实例方法,再看看会报什么错。
在private父类方法的情况下,子类可以将父类方法重写为类方法,这样说其实不对,应该说,子类能写一个和父类private方法名称相同的类方法,不会受到父类影响。
29、创建子类,打印子类变量,再向上转型为父类,再打印一下子类变量