继承
继承就是子类继承父类的特征和行为,使得子类对象具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。
class Student{
// 父类
}
class UnStudent extends Student{
// 子类
}
- 一个类只能直系继承一个父类,所有的父系类都算作这个类的父类。
- 限制一个类不能有子类:final 修饰。
继承到的内容
- 内容:
- 对象成员部分:
- 属性: 继承
- 方法: 继承
- 构造方法:向上调用,子类创建对象时也会调用父类的构造方法。
- 代码块: 向上包含调用
- 静态资源部分: 共用父类的
- 静态属性
- 静态方法
- 静态代码块:只会执行一次
- 对象成员部分:
- 访问权限:
- public: 公开的,任何地方都可以访问。
- protected: 受保护的,只有子类和同包的类可以访问。
- package-default: 默认的,只有同包的类可以访问。
- private: 私有的,只有本类可以访问。
- 访问权限修饰符,只限制是否可以调用,不限制是否继承 ,依然可以通过封装方法调用。
方法重写
- 子类重写父类的方法。方法名,参数列表相同。
- 子类中,以及子类对象在方法被重写后,优先调用重写的方法。
- 子类可以升级改造父类的方法。
- 返回值类型,访问权限修饰符可以不同,重写后的方法访问权限不能比父类中被重写的方法的访问权限更低。
- final,static,private修饰的方法不能被重写,子类依然可以调用。
- 在子类中,如果依然需要调用父类的方法,子类又重写了,可以使用super调用。
- 方法重载:同一个类中存在方法名相同,参数列表不同的方法。
类型转型
- 自动转型: 向上转型,安全转型 ,子类对象可以向上转型为父类类型。
A a = new A(); B b = a;// 此行代码编译通过的前提是:A 是 B 的子类
- 转型的优点: 适配度更广。
- 将父类类型作为需要类型,所有子类对象都可以匹配。
- 转型之后,依然调用子类重写的方法,但是不能调用子类中独有的内容。
- 强制转型: 向下转型,不安全。
A a = new A(); B b1 = a; // A 是 B 的子类,M 也是 B 的子类`
A a1 =(A)b1;// 成立,编译以及运行没问题。`
M m = new M(); B b2 = m;`
A a2 = (A)b2;// 不成立,编译没问题,运行报错 ClassCastException。
- 强制转型时,需要验证对象的类型
- 通过对象名调用类名来验证。
- 通过 intanceof 比较
if(b2 instanceof A){ A a2 = (A)b2; }
。
- 不安全的来源:
- 父类类型变量中存储的对象引用不一定是需要强转的这个类型 。
接口:interface
- 语法: interface 接口名 { }
- 属性:只能是 public static final 修饰的属性 。
- 方法:默认也只能是 public abstract 修饰的方法 。
- 接口中的方法不能有方法体,即接口中的方法不能由接口进行实现。
- 接口中可以包含三类方法:抽象方法、默认方法、静态方法。静态方法可以通过“ 接口名.方法名 ”的形式来调用。抽象方法和默认方法只能通过接口实现类的实例对象来调用。
- 使用: 类名 implements 接口名{ }
- 接口看作父类 。
- 实现类看作子类 。
- 实现类中必须重写接口中所有的抽象方法 。
- 支持多继承。
public interface Basketball{
public void hit();
}
public interface Football{
public void kick();
}
class Player implements Basketball, Football{
public void hit(){
...
}
public void kick(){
...
}
}