继承:
继承性是面向对象的第二大主要特征。
现实世界中:通过分析多种类型,然后发现有一些共同特征和共同行为再将这些种类,归纳为一种新类型
如: 黄色皮肤的人
白色皮肤的人
黑色皮肤的人
|
人
计算机语言中:
先编写父类类型,在编写子类型,然后再有对象。
如: 先编写Animal类型,再编写 Dog类或Cat类型,继承父类的成员变量和方法 ,再使用数据时,要么创建Dog对象/Cat对象
子类可以继承父类中一些成员变量,和方法。子类还可以添加自己的独有成员变量和方法。
子类:也叫派生类
父类:也叫超类,基类
关键字extends,用于继承语法
格式:
public class subClass extends SuperClass{
}
继承中的构造器:
子类不能继承父类的构造器,但是,子类中的构造器可以调用父类的构造器
语法:super(有参传参);
作用:可以更好的给继承过来的成员变量赋值
子类中的构造器一定会有一个调用了父类的构造器,父类中如果没有无参构造器,子类需要显式调用父类构造器,如果父类中有无参构造器,子类中的构造器可能隐式调用了父类的无参构造器,即:隐藏了super()
super()与this()的区别:
相同点:都是调用构造器,而且必须放在首行首句。
不同点:super()是调用父类的构造器,this()是调用本类中其他构造器
继承的传递性:
继承特征有传递特性,B类型继承了A类型的特征,C类型继承了B类型的特征。C类型也间接继承了A类型的特征
继承的另外一个特点:
单继承: 一个子类只能继承一个父类。但是一个父类可以有多个子类
方法的重写(override)
子类可以继承父类的方法,在继承时,我们可以在子类中编写与父类中的方法名相同,参数列表也相同的方法。这就是重写。
(1)父子类关系,方法名相同,参数列表相同
(2)返回值类型可以相同,也可以不同【子类方法的返回值类型必须是父类方法的返回值类型的子类】
父类型的变量可以引用子类型的对象
如:
Animal a = new GoldFish();
Animal类型的变量a引用了子类型GoldFish的对象
符合人类的思维: 这条金鱼是动物
编译期绑定:
在编译过程中,变量只能调出本类型中的方法在编译期间,方法静态绑定到变量上
运行期绑定:
在运行过程中,真正执行的方法的逻辑与对象的类型有关系。
简单说成:方法在运行期间,动态绑定到对象上。
成员变量的调用与变量的类型有关系(与编译期和运行期无关)
也就是说运行过程中执行的方法是子类中重写后的方法,而不是父类中的
Object:是所有引用类型的顶级父类,
系统都会默认使引用类型extends Object.
参考代码:
public class Test {
public static void main(String[] args) {
Car car = new Car("保时捷", "白色", 4);
System.out.println(car.showCar());
Truck t = new Truck("奔驰", "黑色", 30);
System.out.println(t.showTruck());
}
}
class Vehicles {
String brand;
String color;
public Vehicles(String brand, String color) {
this.brand = brand;
this.color = color;
}
public void run() {
System.out.println("我已经开动了");
}
public String showInfo() {
return brand + "," + color;
}
}
/**小汽车类*/
class Car extends Vehicles {
int seats;
public Car(String brand, String color, int seats) {
super(brand, color);
this.seats = seats;
}
public String showCar() {
return brand + "," + color + "," + seats;
}
}
/**卡车类*/
class Truck extends Vehicles{
float load;
public Truck(String brand, String color ,float load) {
super(brand, color);
this.load = load;
}
public String showTruck() {
return brand + "," + color + "," + load;
}
}
接口
有时我们需要从多个不相关的类中设计出一个子类型,而java继承是单继承的,无法满足我们的需求,所以,我们可以使用接口来达到多继承的目的。
接口实际上就是一种规范制度。 (规范与规则的理解)
接口的特点:
(1)接口使用interface关键字,而不是class,但是我们可以理解成接口是特殊的抽象类
(2)接口里只能有抽象方法和常量
方法:默认使用public abstract (因为是默认调用的所以在写抽象方法是可直接写 类型 方法名())
常量:默认使用修饰词为public static final
(3)接口不能实例化,没有任何意义
(4)接口不能提供构造方法
(5)接口与接口之间可以使用继承。子接口继承了父接口的抽象方法
(6)支持多继承
public class MiDoor extends Door implements InterA,InterB{
public void waterproof() {
System.out.println("可以防水");
}
public void theftproof() {
System.out.println("可以防盗");
}
public void openDoor() {
System.out.println("正在用小米钥匙开门");
}
public static void main(String[] args) {
MiDoor door = new MiDoor();
door.waterproof();
}
}
================================================
public interface InterA {
public void theftproof();
}
interface InterB{
public void waterproof();
}
interface InterC{
public void bulletproof();
}