第八周总结
所用代码
package NewDay.niu;
public class N
{
public String name;
public int age;
public N(){}
public N(String name,int age)
{
this.name = name;
this.age = age;
}
public void eat ()
{
System.out.println("吃东西");
}
}
package NewDay.ma;
import NewDay.niu.N;
public class M extends N
{
public M(){}
public M(String a,int age)
{
this.name = name;
this.age = age;
}
public void eat()
{
System.out.println("狗吃骨头!");
}
}
package NewDay;
import NewDay.niu.N;
import NewDay.ma.M;
public class Run
{
public static void main(String[] args)
{
N a1 = new M();
a1.eat();
}
}
静态绑定
N a1 = new M();
a1.eat();
在编译过程中,编译器只看N父类中有没有eat方法,有则通过,无则编译错误
对于语句 N a1 = new M();来言,a1是N类型的,所以在编译过程中会自动绑定到父类的eat方法,即静态绑定
假如 a1是M类型的,那么静态绑定就会自动绑定到M类型的eat方法。
动态绑定
同样的对于上述代码而言,在运行时,会看子类中有没有eat方法,如果有则调用子类的eat方法,没有就会自动调用父类的方法
对于上面的代码而言,编译时绑定父类的eat方法即静态绑定,运行时绑定子类的方法并绑定即动态绑定。多态指的是这样的一个方法有这两种形态
方法的重写
对于继承来说,重写方法的返回值最好不要修改
1.对于基本数据类型来说,方法名相同,返回值不同,数据类型覆盖不了(重写失败)
2.对于引用数据类型来说,方法名相同,在子类中重写的方法返回值类型必须和父类中的返回值类型有继承关系
将父类的eat方法返回值改成double型,子类改为int型
将父类返回值类型改为N型,子类改为M型
构造方法
1.如果类中有些有参构造,那么系统将不会自动分配一个无参构造,所以一定还要养成自写无参构造的习惯,以免报出不必要的错误
2.子类继承了父类的某些特征,所以会先构造父类再构造子类
package NewDay;
import NewDay.niu.N;
import NewDay.ma.M;
public class Run
{
public static void main(String[] args)
{
N a1 = new M();//父类子类中有修改无参构造方法方法体,即打印图中对应语句。
}
}
super
1.指代的是父类的构造构造方法,一般地,子类的构造方法中,第一行都会自动调用super()调用父类的无参构造,如果父类中没有自写无参构造且写了有参构造(即系统未自动分配有参构造),那么系统将会报错。当然也可以用super()调用有参构造,super语句中写入对应的参数。
2.super(),只能出现再子类构造方法中的第一行,很好理解,即父类的特征还没构造出来的时候,子类是无法继承特征形成的。
3.super()不代表父类对象的地址。
4.super()也不能出现在static修饰的代码中。
5.创建子类时,会将父类的特征刻画在子类对象中,没有创建父类的对象,所以super()不指代内存地址,指父类的特征(子类创建对象的时候都会在栈里面先调用父类的构造方法形成特征,所以Object的无参构造最后被调用入栈,最先被执行出栈!)