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赋值了,但是 ![](http://images2015.cnblogs.com/blog/886876/201603/886876-20160325165007839-219874910.png)

解决方法:在询问助教后知道了其中的原因:因为在编译的时候并不知道调用的是有参还是无参的构造函数,如果调用的是无参的构造函数就会导致x没有赋初始值。
可以将无参构造方法去掉或者在无参构造函数里对x进行赋值。

public Some(){
    this.x=0;
}

其他(感悟、思考等,可选)

虽然对着书上敲代码显得枯燥无味,但是在这本厚厚的书又确实可以找到一些边边角角的语法盲点。之前如果遇到编译错误,尝试了,编译通过了就没有继续去寻找原因了,但这次我静下心,多问自己几个为什么,为什么那样定义编译不通过,这样就可以了呢。在寻找答案的过程中,再翻回到课本,收获了更多。 ![](http://images2015.cnblogs.com/blog/886876/201603/886876-20160326205925151-277948597.png)

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 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查看代码长度
![](http://images2015.cnblogs.com/blog/886876/201603/886876-20160326210027308-1680112428.png)