今天的Java课上楼sir讲了这三个概念,但讲的不大清楚,特此来总结学习一下。
关键字extends和implement的区别
extends: 继承
implement:接口
在C++中一个子类可以有多个父类,称之为多层继承(multiple inheritance). 但是这个特性在JAVA中是被禁止的。作为补偿,Java有一个特性称之为接口(interface), 接口是一种与类相似的结构,只包含常量和抽象方法。接口在许多方面与抽象类相似,但是它的目的是指明多个对象共同的行为。
public interface Eat{
public abstract String EatWhat();
}
public interface Live {
public abstract String LiveWhere();
}
class life{
}
public class Animal extends life implements Eat,Live
{
public String LiveWhere(){
return "Earth";
};
public String EatWhat(){
return "meat";
}
}
关键字super
super的主要作用
1. 让子类调用父类的构造方法。语法是super( ) 或者 super( parameters )。
为什么需要这么做呢,我们来看一段代码并且理解构造方法链
class A{
A(int i){
i++;
}
}
class B extends A{
B(){
}
}// IntelliJ 警告在A类中没有默认构造函数
构造方法链:
在任何情况下,构造一个类的实例时,将会调用沿着继承链的所有父类的构造方法。当构造一个子类的对象时,子类的构造方法会在完成自己的任务前,首先调用父类的构造方法。如果父类继承其他的类,那么父类的构造方法又会在完成自己的任务前,调用父类的构造方法。这个过程持续到沿着继承体系结构的最后一个构造方法被调用为止。
我们知道,父类的构造方法是不被子类继承的。当我们new 一个B的时候,由于B类继承了A类,所以在new的过程中,先构造A再构造B,而A只有一个带参数的构造函数。所以B在构造A的时候需要给父类A的构造函数提供一个参数,这件事情由super函数来完成。需要注意的是,父类的构造方法只能在子类的构造函数中调用,并且,必须是子类构造函数的第一行!!!
如果恰巧父类中有无参数的构造函数,而子类构造函数没写super,其实默认是super().也就是说下面两段代码是等价的
class A{
A(){}
}
class B extends A{
B(){};
}
// 等价于
class A{
A(){}
}
class B extends A{
B(){
super();
};
}
2.让子类调用父类的函数
super关键字不仅可以引用父类的构造方法,也可以引用父类的方法。
class A{
A(){}
void print(){
System.out.println("123");
}
}
class B extends A{
B(){
super();
super.print();
}
}