继承
- 多态:对多种不同的数据输入提供统一的接口或方法,实现相同或者不同的目标功能
- 继承:使用关键词extends
class SubClass extends MainClass{}
子类继承的内容
几乎所有父类的内容,包括成员方法和属性,除private修饰的内容
子类对父类的调用
- 访问权限修饰符下
- public 整个工程内都可以调用
- private 类不可访问
- protected 子类和同包都可以使用
- 缺省 同包下
- 子类和子类对象可调用范围
- 同包中除private修饰的
- 不同包中,父类的public和protected,非父类的public
方法重写
- 子类中可以重写父类的方法,具体化实现自己的功能
- 一般来说,子类重写的方法结构必须与父类方法一致,方法的实现可以修改
- 使用@override可以使得编译器检查是否正确重写了父类的方法
@Override
public void method(int x) {
}
如果是重写了构造函数,那么会隐藏使用一个super()来调用父类的构造函数,在子类构造函数的第一行运行,显式写出super()的效果也是一样的,只能写在第一行。
- 访问权限修饰符
根据里氏代换原则任何基类出现的地方,子类一定可以出现,换言之子类可以替代父类的功能,子类方法的访问权限范围应该要大于等于父类。否则可能造成对抽象方法可以使用但对具体方法不能使用的反直觉问题。 - 返回值类型
1、对于普通的返回类型,重写方法返回类型需和父类方法一致
2、对于对象返回类型来说,重写的方法返回的必须是父类返回类型的子类类型(协同返回类型) - 参数必须一致
- final修饰
使用final修饰的成员方法不能被重写,private修饰时也不必使用final - 父类包含抽象方法,子类包含具体实现
符合开闭原则,对扩展开放,对修改关闭,如创建型模式
转型
-
基本数据类型的转型
-
强制类型转换(可能不安全)
高精度向低精度类型的转换可能导致精度丢失或者数据溢出
int x=(int)3.2f; byte b=(int) 100000;
-
自动类型转换(安全)
允许低精度数据向高精度转型,且可以自动转型
-
-
类转型
对于一个对象,其可以拥有的类型包括自己的类型以及所有父类的类型(Java不存在多继承问题,可以多层继承),也可以拥有自己的子类的类型
-
向上转型(安全,自动转型)
//A extends B A a = new A(); B b = a;
执行后,A独有的方法失效,重写的方法保留,此外仅可使用父类的方法(多层继承时,可以使用路径上的父类的方法)
-
向下转型(不安全)
-
编译器允许一个对象获得子类的类型,但是实际只应该允许兼容的向下转型或重新获得自己的类型,否则可能访问到不存在于自己内的方法等方法导致bug
-
安全的向下转型
先向上转型,再向下转型
-
-
强制转型
强制转型必须先进行类型判断,使用instanceof获得该类是否是需要转的类。
-
基础代码
package Inherit;
public class Visit {
public static void main(String[] args) {
SubClass subclass = new SubClass();
//子类重载父类函数
subclass.method(3);
OtherClass otherClass = new OtherClass();
//向上转型,隔代
MainClass main=otherClass;
otherClass.xx();
//向下转型,强制转型
OtherClass other;
if(main instanceof OtherClass)
other= (OtherClass) main;
}
}
class MainClass{
public int num;
private String S;
public MainClass() {
System.out.println("MainClass");
}
protected void method(int x){
System.out.println(x);
}
public MainClass covariant(){
return this;
}
}
class SubClass extends MainClass{
@Override
protected void method(int x) {
}
@Override
public SubClass covariant() {
return this;
}
public void xx(){};
SubClass(){
System.out.println("SubClass");
}
}
class OtherClass extends SubClass{
}