_09_面向对象之继承、多态

四. 继承

  1. 概念
    继承是从已有的类中派生出新的类,新的类能吸收已有类的属性和行为,并能扩展新的属性和行为。
    1.1 Java继承特点
    1)Java是单继承的,不支持多继承。这样使得Java的继承关系很简单,一个类只能有一个父类,易于管理程序。同时一个类可以实现多个接口,从而克服单继承的缺点。
    2)继承关系是传递的
    3)private修饰的成员变量或方法是不能被继承的
    1.2解决什么问题
    提高了代码的效率,避免了代码重写。

图例
在这里插入图片描述
2. 语法格式
[修饰符] class 子类 extends 父类 {
//类体
}
【示例】
实现一个继承,定义学生类为父类,定义一个大学生类作为子类。
3. super
this是指当前对象引用,super是指当前对象的父类对象的引用。由于继承子类可以访问父类的成员,所以this除了可以访问自己的成员还可以访问父类的成员,但是为了明确的指明访问的是父类的成员,则要用关键字super来指定。

【示例】
在大学生类中使用super调用父类的属性和方法。
4. final
final表示不可改变的含义
采用final修饰的类不能被继承
采用final修饰的方法不能被重写
采用final修饰的变量不能被修改
final修饰的变量必须显式初始化 如果修饰的引用,那么这个引用只能指向一个对象,该引用不能再次赋值,但对象本身内部可以修改
构造方法不能被final修饰
5. 方法重写
在Java中,子类可继承父类中的方法,而不需要重新编写相同的方法。但有时子类并不想原封不动地继承父类的方法,而是想作一定的修改,这就需要采用方法的重写。

方法重写的特性
1)发生方法重写的两个方法返回值、方法名、参数列表必须完全一致(子类重写父类的方法)
2)子类抛出的异常下不能超过父类相应方法抛出的异常(子类异常不能大于父类异常)
3)子类方法的访问级别不能低于父类相应方法的访问级别(子类访问级别不能低于父类访问级别)

【示例】
父亲类上班开车,儿子类上班骑自行车。
6. 父子对象间转换和instanceof
父类和子类拥有公共的属性和方法,那么能否通过父类来访问子类中的继承的公共的属性和方法呢?我们在上面了>解到,如果在子类内部肯定可以,而且通过this和super关>键字可以轻松的使用。
那么如果在类的外部怎么实现这个应用需求呢?Java提供了类对象间的转换来满足这个需求。我们回顾一下之前的>基本数据类型强制转换,父类和子类之间的转换与其类似。

隐式转换:小类转大类,也叫为向上转
强制转换:大类转小类,也为向下转,需要有 “()”作为强制转换。
如:Student student = new DaXueSheng();//隐式转换
DaXueShen daXueShen= (DaXueSheng)student;//强制转换

【总结】

  • 子类对象可以被视为其父类的一个对象,如一个大学生(子类)肯定是一个学生(父类)。
  • 父类对象不能被声明为某一个子类的对象,如一个学生不能完全表示一个大学生。
  • 父类引用可以指向子类对象,但不能访问子类对象新增的属性和方法。

instanceof运算符
Java提供了instanceof关键字,使我们在强制转换之前,判断前一个对象是否后一个对象的实例,是否可以成功的转换,以增强代码的健壮性。
【示例】
演示父子类转换的特性
五. 多态

  1. 概念
    龙生九子各不相同
    意为虽然是亲兄弟,但彼此之间的品性、爱好仍大有不同。
    多态性
    多态指允许不同类的对象对同一消息做出响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式。(发送消息就是函数调用)
    示例
    通过动物类引用调用它的子类——鸟类,猫类,狗类的call()方法,实现多态
    必要条件:继承、重写、向上转型。
    继承:在多态中必须存在有继承关系的子类和父类。
    重写:子类对父类中某些方法进行重写,在调用这些方法时就会调用子类的方法。
    向上转型:在多态中需要父类的引用指向子类的对象。
  2. 体现方式
    使用父类作为方法形参实现多态。
    使用父类作为方法返回值实现多态 。
  3. 好处
    把不同的子类对象都当作父类来看,可以屏蔽不同子类对象之间的差异,写出通用的代码,做出通用的编程,以适应需求的不断变化。
    //不使用多态,本来想拥有一条狗,后来想拥有一只猫,就需要改代码了
    public class Person{
    //Dog d;
    Cat c;
    //public void setAnimal(Dog d){
    // this.d = d;
    //}
    public void setAnimal(Cat c){
    this.c = c;
    }
    public static void main(String[] args) {
    Person p = new Person();
    //p.setAnimal(new Dog());
    p.setAnimal(new Cat());
    }
    }
    //使用多态,本来想拥有一条狗,后来想拥有一只猫,只需重新设置
    public class Person{
    Animal a;
    public void setAnimal(Animal a){
    this.a = a;
    }
    public static void main(String[] args) {
    Person p = new Person();
    //p.setAnimal(new Dog());
    p.setAnimal(new Cat());
    }
    }

//动物类及其子类
class Animal{
}
class Dog extends Animal{
}
class Cat extends Animal{
}

发布了24 篇原创文章 · 获赞 0 · 访问量 405

猜你喜欢

转载自blog.csdn.net/qq1317121361/article/details/103212616
今日推荐