什么叫做继承
继承是Java中实现代码重要的重要手段之一。Java中只支持单根继承,即一个类只能有一个直接父类。简单点来说就是继承是类和类之间的关系。
为什么要使用继承
提升代码的复用性
减少代码的冗余
继承的创建
class 子类 extends 父类
extends关键字实现类的继承
super关键字
(1)使用super关键字,super代表父类对象
(2)在子类构造方法中调用且必须是第一句
(3)不可以访问父类中定义为private的属性和方法
继承条件下构造方法的调用规则
- 子类构造方法没有通过super显式调用父类的有参构造方法,也没通过this显式调用自身其他构造方法系统默认调用父类的无参构造方法
- 子类构造方法通过super显式调用父类的有参构造方法,执行父类相应构造方法,而不执行父类无参构造方法
- 子类构造方法通过this显式调用自身的其他构造方法,在相应构造方法中应用以上两条规则
private String varieties;//品种 public Dog(String name, int health, int love,String varieties) { super(name, health, love);//显示调用父类构造 放在第一位 this.varieties=varieties; }
子类与父类的关系
子类可以继承父类的任何非私有成员(变量 方法 构造)
子类永远比父类拥有更多的成员 子>父
方法重写规则
- 参数列表相同
- 方法名相同
- 返回值类型相同或者是其子类
- 访问权限不能严于父类
- 父类的静态方法不能被子类覆盖为非静态方法,父类的非静态方法不能被子类覆盖为静态方法
- 子类可以定义与父类同名的静态方法,以便在子类中隐藏父类的静态方法(注:静态方法中无法使用super)
- 父类的私有方法不能被子类覆盖
- 不能抛出比父类方法更多的异常
方法重写vs方法重载
方法重写原则
除了方法体不同以外,其余所有(返回类型,返回值,参数)完全一致
abstract抽象类
有抽象方法的类一定是抽象类
抽象类不一定有抽象方法
抽象类不能被实例化 例如 Pen pen=new Pen();不能实例化
抽象类的子类可以是普通类,该普通类要实现抽象类中的抽象方法
抽象类的子类也可以是抽象类,此时,父类中的抽象方法可以在子类中不被实现
封装中get和set使用
get:获取字段的值 函数返回值类型===>字段的类型
set:给字段设置值 函数的参数===>字段的类型
//获取数据 public String getName() { return name; } //添加数据 public void setName(String name) { this.name = name; }
Object类被子类经常重写的方法
构造函数
一个类在没有编写构造函数的情况下默认存在一个无参构造 如果用户编写了 默认存在的就消失了
构造函数是没有返回值类型的
构造函数的执行时机:是在类的实例化的过程中,会自动调用构造函数
作用:完成类的成员变量的初始化
public Person() { }//这就是系统默认的构造函数即使不创建也会存在
什么是多态
同一个引用类型,使用不同的实例而执行不同操作
发生在具有继承关系的实体中,不同实体为了完成同一操作(函数名)所采取的不同方式(方法体)。
里氏替换原则(Liskov Substitution Principle)
在出现超类的位置上,可以使用其子类对象 解释一下:
(由于,子类比父类更优秀,出现父类的任何位置,子类都可以使用)
现实多态的三种方式
- 父类类型接收子类对象实现的多态
- 父类类型作为方法形参
- 父类类型作为方法返回值
向上向下转型
向上转型:子类对象--->父类做的转换 无需强转(没有异常)
Pet pet=new Dog("小白", 50, 89, "阿拉斯加"); pet.showInFo();//向上转型自动转换
向下转型:父类类型--->子类类型转换 需要强转,使用instanceof比较两个类型避免发生(ClassCastException)异常
Pet pen=new Penguin("小红", 50, 90, "Q妹"); if(pen instanceof Penguin){//用 instanceof比较避免出现异常 Penguin peng=(Penguin)pen;//需要强制转换 peng.eat(); }else { System.out.println("您输入的不准确"); }
值类型和引用类型
值类型:八种基本数据类型
引用数据类型:Object
值传递
将栈上的数据Copy一份
引用类型的值传递会改变
值类型的值传递不会改变
Java中只支持值传递