extends - 继承
- 概念:
子类/衍生类/扩展类s
父类/基类 - 子类继承父类, 就继承了父类所有的成员变量和方法,不能继承构造方法,只能调用
- 所有的类, 都有唯一的父类
如果没有写父类, 说明父类就是 Object - 子类中还可以定义自己的独特的成员变量和方法
子类的功能一定比父类要强大
public static class A extends Object{
}
public static class B extends A {
}
public static class C extends A {
}
...
特殊情况
- 子类中的成员变量和父类同名
指自己定义的成员变量,不是继承过来的成员变量
结论: 父子类中的成员变量不要同名 - 子类中可以引用父类对象
super
创建子类对象之前, 会先创建父类对象
加载子类之前, 会先加载父类 - 构造方法
父类的构造方法不能被子类继承的
创建子类对象, 会先默认调用父类的无参构造器
原因: 子类构造方法中, 第一行默认 super()
可以手动调用父类其他构造方法
结论: 子类构造方法中, 一定会先调用父类的构造方法
父类中, 建议先写无参构造器,这样不容易出现编译错误 - 通过子类对象调用方法时
先看子类中有没有定义这个方法, 定义了, 调用子类方法
子类中没有这个方法, 调用父类继承的方法
接口
– JDK 1.8以前,接口中的方法默认,也必须是public的(只能用public)
– JDK 1.8时,接口中的方法默认public的,也可以是default的(可以是public和default)
– JDK 1.9时,接口中的方法可以是private的(可以是public和default和private)
特殊的抽象类(可能会存在抽象方法)
接口不是类,是一种引用类型
引用类型:数组、类、接口
public interface InterfaceDemo {
//公开的静态常量
public static final int i = 10;
//接口不是类,是一种引用类型
//引用类型:数组、类、接口
void f();
public void f1();
abstract void f2();
//公开的抽象方法
public abstract void f3();
//默认的
default void f4() {
}
//静态的
static void f5() {
}
//普通的私有方法 - 为了给default方法中的公共代码提取, 实现代码复用
private void f6() {
}
//静态的私有方法 - 给static方法中公共代码提取的
private static void f7() {
}
}
使用接口的步骤
- 定义接口
// 1.定义接口
public interface InterfaceAbstractA {
// 定义抽象方法
void abstractMethod();
// 再添加一个抽象方法
void abstractMethodB();
// 又添加了一个静态方法
static void staticMethodC() {
System.out.println("static MethodC");
}
}
- 接口不能直接new对象, 需要一个实现类来 实现接口
将接口中的所有抽象方法 覆盖重写(实现)
// 2.定义实现类, 实现接口
public class InterfaceAbstractAImpl implements InterfaceAbstractA {
@Override
public void abstractMethod()