Java中所有的类都是Object的子类。
子类继承超类中所有可以被子类访问的成员(变量和方法)。
子类不能继承超类的构造方法。
子类除了可以继承超类中的变量及方法,还可以增加自己的成员。当一个超类成员不适合该子类时,子类会以恰当的方式重新定义它,就是隐藏超类的成员。
子类不能继承超类的构造方法,但在子类构造方法中可以使用super(参数列表)调用超类的构造方法。
如果子类的构造方法中没有显式的调用超类构造方法,也没有用this关键字调用重载的其他构造方法,则在产生子类的实例对象时,系统默认调用超类无参构造方法。
如果子类构造方法中没有显式地调用超类构造方法,而超类中又没有无参数的构造方法,则编译出错。所以,我们在定义类时,只要定义了有参数的构造方法,通常还需要定义一个无参数的构造方法。
创建子类对象时,系统会隐式先为其各自创建对应的父类对象。
extends和implements的关系
extends是继承,类只能继承类,接口只能继承接口。如接口A可以继承接口B,那么接口A就会得到接口B声明的变量和方法。
implements是实现,只能实现接口,不能实现抽象类。如类A可以实现接口A,那么类A必须实现接口A的所有方法,不然A就是抽象类。
注意继承和实现的区别。
接口Interface
1. 接口中的成员变量默认都是public、static、final类型的,必须被显式初始化。
2. 接口中的方法默认都是public、abstract类型的。
3. 接口中只能包含public、static、final类型的成员变量和public、abstract类型的成员方法。(可以省略其中一个或多个修饰符)
4. 接口没有构造方法,不能被实例化,在接口中定义构造方法是非法的。
5. 一个接口不能实现另一个接口,但它可以继承多个其他接口。interface C extends A, B{} // A和B都是接口
6. 当类实现某个接口时,它必须实现接口中所有的抽象方法,否则这个类必须被定义为抽象类。
7. 接口中没有方法体
在类的继承中,只能做单重继承,而实现接口时,一次则可以实现多个接口,每个接口间使用逗号“,”分隔。
这时就可能出现常量或方法名冲突的情况,解决该问题时,如果常量冲突,则需要明确指定常量的接口,这可以通过“接口名.常量”实现。如果出现方法冲突时,则只要实现一个方法就可以了。
如下例子:
package com.ez;
/**
* 机器
* @author 窗外赏雪(EZ编程网)
*/
public interface Machine {
/**
* 功率
*/
int power=10;
/**
* 机器都会转动
*/
void turn() throws RuntimeException;
}
package com.ez;
/**
* 交通工具
* @author 窗外赏雪(EZ编程网)
*/
public interface Vehicle {
/**
* 速度
*/
int speed=10;
/**
* 功率
*/
int power=20;
/**
* 交通工具都会滴滴叫
*/
void didi();
/**
* 转动
*/
void turn();
}
package com.ez.impl;
import com.ez.Machine;
import com.ez.Vehicle;
public class Corolla2 implements Machine,Vehicle{
@Override
public void didi() {
System.out.println(Machine.power);
}
@Override
public void turn() throws RuntimeException {
System.out.println(Vehicle.power);
}
}
抽象类:任何包含抽象方法的类必须被声明为抽象类。
抽象类和抽象方法都必须用abstract关键字来修饰
抽象类不能实例化,即不能用new关键字去产生对象。
抽象方法只需声明,不需实现。
含有抽象方法的类必须被声明为抽象类,抽象类的子类必须覆盖所有的抽象方法后,才能被实例化,否则这个子类还是个抽象类。
最终类:是指不能被继承的类,即最终类不能有它的子类。
如:final class C1
最终方法不能被子类重写。
如:final void m1();
final变量只能赋值一次(只能在声明的同时或在该类的构造方法中赋值)。
静态final变量只能赋值一次,并且只能在声明的时候赋值。