Super and This
Super常常用来调用父类中的成员变量和成员方法。
This则代表了指向本类中的信息。
在继承关系中,子类的需要继承父类的成员变量和成员方法,就需要提前调用父类对象再对这个对象的信息进行提取,
那么在JVM中,其实子类在调用构造方法调用父类构造方法时,会在创建在堆中的对象空间中调用父类的构造方法在内部创建出父类的调用,也就是为什么子类在调用子类的构造方法时,会先调用父类的构造方法,并且还一定要放在第一行,否则会编译错误,因为不放在第一行没有创建父类对象根本调取不到父类的信息,
Super
子类如果要调用父类的构造方法,不写也会有一个由系统自动生成的父类无参构造,如果我们写了父类构造,则运行我们写的构造(毕竟有重载的父类构造),我们如果要特殊的调用父类的方法,而我们直接写会触发就近原则(继承得来的方法和父类的方法名字是一样的),所谓我们需要使用Super关键字来特指向在子类对象的父类对象空间中的同名方法,Super是一次特殊的指向关键字动作。
This
特指向在本类中的信息动作,指向动作,重载构造方法的时候,可以选择使用this()还是super(),如果是继承关系,则自动会在给与子类的空参构造的第一行提供一个super()指向父类的空参构造,当然,因为指向构造的信息必须第一行,所以只能使用一种,后果相差不大,毕竟在同一个空间,但是我们初始化的是哪个类,调用时要多注意Super
当这两个关键字Super和this在构造方法里被调用时,要注意无法在构造方法中自己调自己,但是子类的空参构造会自动在第一行使用一个Super()调用父类的对象
类中的无参构造和多参构造可以互相调用,但不能同时指向对方,也就是闭环。这种指向动作不会常用,因为这种方法指向动作只会在构造方法被封装。
抽象类
抽象类(abstract)是因为抽取了各个类的相同属性方法,但是因为各个类都会对这些方法进行重新定义,所以这些类都是只声明了方法,其他的都没有意思,方法体都没有如:
public abstract void run();
声明了此类时抽象类:
public abstract class Man{}
抽象类可以使用普通方法,并且他是以继承的方式被实现,所以他的限制更少一些,一个被声明为抽象类的类不一定要有抽象方法(当然没人这么干)但是有抽象方法的类必须被声明为抽象类。
抽象方法不能被创建对象,但是他不是没有构造方法,是他的构造方法只能被继承他即实现他的实现类使用,用来在子类内部创建抽象类引用抽象类。
抽象类的抽象方法必须要被子类(实现类)重写,否则编译都无法通过(当然子类是抽象类的时候能够通过),
重写就是抽出abstract添加方法体。
接口(Interface)
接口类也是一种引用类型,但是他的定义和类的定义很相似,但是使用Interface关键字,他会被编译并且生成class文件,但是他并不是类,而是另一种引用数据类型(接口引用数据类型),所以我们现在所致的引用数据类型是 类、数组、接口。
接口也和抽象类一样不能被创建对象,并且他更进一步甚至连构造方法都没有,他只能等待被Implements关键字被子类实现,接口类比抽象类要更加严格,他的内部方法有好几种: 抽象方法
默认方法default 被default修饰的普通方法,代表了要实现接口类的子类可以调用这个方法,并且他可以被有选择的被子类调用或重写,
常量 可以定义常量,不可以定义成员变量,因为值不可变,默认在前面增加修饰符public static final
静态方法 和平常的静态方法定义一样,他被定义在了接口类则专属于接口类,使用接口类中的静态方法要使用接口类名来调用
私有方法 被封装的方法,private修饰,值可以在本类中使用
众所周知,java的类只接受单继承的方式,但是!接口可以被一个实现类实现多个不同的接口比如:
public class ClassName extends 父类 implements 接口名1,接口2,...{
并且 接口之间也可以使用这种多继承方式
public Interface A{
public interface B{
public interface C extendsA,B{
其中,如果接口继承的多个接口中默认方法的名字有相同的,一旦冲突,就要在子接口中重写,不管在哪,一旦冲突就要重写。
比如不光接口中冲突,万一继承的父类中也有和接口的默认方法的方法名冲突,会默认使用父类的方法,接口的就找不到了。
接口最主要的作用就是扩展原有类的功能,降低了类与类中的耦合性。