20145113第四周学习总结
教材学习内容总结
1.多态:使用单一接口操作多种类型的对象。通过书上的例子,实际动手通过了Role类型操作了Swordman与Magician对象。
2.抽象方法、抽象类:使用abstract定义
public abstract class Role
public abstract void fight();
定义成抽象类的Role就不能再实例化了,并且如果子类继承了抽象类,对于父类的抽象方法:一是继续标识方法为抽象方法,二是操作抽象方法。如果两个都没实施则会报错。
这就避免了子类重写父类的方法时手误。
3.可以通过super关键字来获取父类中的方法,但该方法不能是private。
"Swordman"+super.toString();
4.构造函数:执行new Other()是先执行Other中的流程。而Other中调用父类的无参构造方法。
Other other=new Other();
子类相当于:
public class Other extends Some {
Other()
{
super();
System.out.println("调用了子类的构造方法!\n");
}
}
若子类:
public class Other extends Some {
Other()
{
super(10);
System.out.println("调用了子类的构造方法!\n");
}
}
在子类的构造函数中调用了父类的有参构造函数,如果再使用
Other other=new Other();
则不会再调用父类的无参的构造方法。
5.java.lang.Object:java中所有的对象都是一种Object,所以如果想要用数组来搜集各种对象 可以:
static Object[]objs={"hello",67,6+7==4,4.5};
6.接口:继承“是一种”关系,操作接口则表示“拥有行为”。类要操作接口使用implements关键字,同时使用多个接口则接口间用逗号隔开。
public class Swimplayer extends Human implements Swim,Fly
接口使用易错点:
public interface Swim {
void swimm();//默认是public abstract
}
如果现在有个类使用这个接口
public class Shark implements Swim{
void swimm(){
System.out.println("shark can swim\n");}
}
则会出现变异错误因为swimm在接口中默认是public abstract,但在使用的时候没有申明public则默认是protected,范围缩小了,出现编译错误。
在接口中定义枚举常熟可以写成
int STOP=0
默认省略了public static final。
7.内部类:
class Some{
clss Other{}
}
很少用,但是如果要取用Other时
要先建立Some实例
Some s=new Some();
Some.Other=s.new Other();
如果如果是操作某个接口,Some接口定义了do()方法,要建立匿名类实例:
Some some=new Some(){
public void do(){
System.out.println("...");
}
简化写法:
Some some=()->{
out.println("...");
}
教材学习中的问题和解决过程
1.
Role man2=new Magician();
man2.good();
如果用man2来调用 Magician中Role中没有的方法,则会报错,但是如果通
Role boy=new Magician();
Magician swordman=(Magician)boy;
swordman.cure();
((Magician) boy).cure();
虽然boy是Role申明的但是加上了(Magician)则可以调用Magician中Role中没有的方法。
2.对匿名内部类的理解上还存在一些问题。 ##代码调试过程中的问题和解决过程
class Some{
private final int x;
public Some(){
}
public Some(int x)
{
this.x=x;
}
public int getX() {
return x;
}
}
public class Test7 {
public static void main(String[] args) {
Some so=new Some(8);
System.out.println(so.getX());
}
}
private final int x;
在给x定义为final时候虽然在有参的构造方法里面给x赋值了,但是 
解决方法:在询问助教后知道了其中的原因:因为在编译的时候并不知道调用的是有参还是无参的构造函数,如果调用的是无参的构造函数就会导致x没有赋初始值。
可以将无参构造方法去掉或者在无参构造函数里对x进行赋值。
public Some(){
this.x=0;
}
其他(感悟、思考等,可选)
虽然对着书上敲代码显得枯燥无味,但是在这本厚厚的书又确实可以找到一些边边角角的语法盲点。之前如果遇到编译错误,尝试了,编译通过了就没有继续去寻找原因了,但这次我静下心,多问自己几个为什么,为什么那样定义编译不通过,这样就可以了呢。在寻找答案的过程中,再翻回到课本,收获了更多。 
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000 | 25 | 100 | |
第一周 | 100/200 | 1/2 | 3/5 | |
第二周 | 300/400 | 2/3 | 4/9 | 使用everything与PowerCmd |
第三周 | 200/600 | 3/3 | 8/17 | 安装了idea,并将代码上传到gitosc上 |
第四周 | 1200/1800 | 4/4 | 6/15 | 会使用wc查看代码长度 |