Java学习——面向对象(多态)

多态

一、基本概念

1、定义

多种状态;同一对象在不同情况下表现出的不同状态或行为

2、优缺点

优点:
可维护性:基于继承关系,只需要维护父类代码,提高了代码 的复用性,大大降低了维护程序的工作量。
可扩展性:把不同的子类对象都当做父类看待,屏蔽了不同子类对象间的差异,做出通用代码,以适应不 同的需求,实现了向后兼容。

弊端:父类不能使用子类特有成员。(需类型转换)

类型转换:
1、向上转型(自动类型转换,子类转换成父类)

Animal animal = new Dog();

2、向下转型(强制类型转换,父类转换成子类)

Dog dog = (Dog)animal;

注意:(详细介绍另转
只能在继承层次内进行转换,否则报类型转换异常(ClassCastException)
将父类对象转换成子类前,使用instanceof检查

if(animal instanceof Dog) {
    Dog dog = (Dog)animal;
}

3、应用场景
① 父类类型引用作为方法的形参,实现多态,使方法参数的类型更为宽泛 (该父类的任何一个子类均可作为实参传入)
场景
② 使用父类类型作为方法返回值,实现多态,使方法可以可以返回不同的子类对象
4、多态关系中成员变量的使用

需求:子父类中定义了同名的成员变量的调用

结论:多态关系中,成员变量是不涉及重写的,使用成员变量遵循"编译看左,运行看右",

Animal animal = new Dog()

二、实现方式(抽象类和接口)

Java中实现多态的步骤(条件):
要有继承(或实现)的关系(继承 类与类,实现 类与接口);
要有方法重写;
要有父类引用指向子类对象(is a的关系)。

public class Test {
    public static void main(String[] args) {
        //父类引用指向子类对象
        Animal dog = new Dog();
    }
}

1、抽象类

抽象类概念:包含抽象方法的类叫做抽象类,用abstract修饰。
抽象方法概念:只有方法声明没有方法体的方法,用abstract修饰。
抽象方法的由来:当需要定义一个方法,但又不明确方法的具体实现时,可以将方法定义为abstract,具体实现延迟到子类即在子类中再具体实现(子类必须重写父类的抽象方法,如果子类也是抽象类则可以不写)。

a) 抽象类的特点和成员特点

抽象类的特点
1、修饰符:abstract(修饰符 abstract class 类名{};修饰符 abstract 返回类型 方法名{})
2、抽象类不能实例化,只能创建子类对象(new)
3、抽象类的子类的两个选择:重写父类的所有方法;子类定义成抽象类

抽象类成员特点:
1、成员变量:可以有普通的成员变量,也可以有成员常量(final)
2、成员方法:可以有普通方法也可以有抽象方法。抽象类不一定有抽象方法,有抽象方法一定是抽象类(或接口)
3、构造方法:有构造方法且可以重载(用final修饰的方法不可以被重载)

总结:抽象类中的成员比普通类多一种—抽象方法,其他和普通类一样。

2、接口(比抽象类更加抽象)

概述:接口用于描述类具有什么功能,但并不给出具体实现,类要遵循接口描述的统一规则进行定义,所以,接口是对外提供的一组规则标准。

定义接口关键字interface;类和接口实现用implements(可以理解接口的实现类就是接口的子类)

接口创建对象的特点:

接口不能实例化,通过多态的方式实例化子类;

接口的子类(实现类),可以是抽象类(不用重写接口的抽象方法)也可以是普通类(必须重写接口的抽象方法)。

接口继承关系的特点:

类与接口间是实现的关系,接口接口之间是继承关系,可以单继承也可以多继承;

继承和实现的区别:继承是 is a 关系,父类中定义共性内容;实现是like a 关系,接口中定义扩展内容。

a) 接口成员特点

1.接口中的所有属性默认为:public static final ,即接口只有静态的共有的,只有常量;

2.JDK7 以前接口中的所有方法默认为:public abstract;JDK8 以后,可以有静态方法也可以有默认方法(public default 返回值类型 方法名(){});JDK9 以后可以有私有方法(private 返回值类型 方法名(){});

3.接口中没有构造方法,因为接口不能实例化,也没有需要初始化的成员。

b) final关键字

最终的,最后的。用来修饰类、方法和变量

1.被final修饰的类不可以被继承,但可以继承其他类
2.被final修饰的方法不可以被重写(即final和abstract不能共存)
3.被final修饰的变量不可以被改变 final num = 10;final 修饰引用类型的变量,是地址值不能改变,但其属性值可以改变。final A a = new A(); 不能再new A();

c) static关键字

静态的。用来修饰类的成员(成员变量,成员方法),被static修饰后叫做类变量(静态变量),类方法。

1、被static修饰的成员变量(类变量,静态变量)的特点:被本类所有对象共享

注意:随意修改静态变量是有风险的,为了降低风险,可以同时使用final关键字修饰,即共有静态常量(常量命名都大写)

2、被static修饰的成员方法(静态方法,类方法)

静态方法没有this关键字,所以不能访问非静态成员;

静态方法使用场景:

a)、只需要访问静态成员的时候;

b)、不需要访问对象状态,所需参数都由参数列表显示提供(当你调用一个方法的时候想通过 类名.方法名 ,而不是对象名.类名 时就可以使用 )

3、抽象类和接口的区别

1.抽象类是类,接口不是类。

2.抽象类的关键字是abstract修饰,接口的关键字是interface修饰。

3.抽象类有构造方法,接口没有构造方法。(但两者均不能被实例化,用我自己的话来概括就是,两者都是抽象派,没有具体的实际行为,所以不允许它们实例化!)

4.抽象类的成员变量修饰随便(public,private,protected等等),接口的成员变量必须是public,static,final修饰(默认)(可以用来做定义常量的类)

5.抽象类的方法可以是普通方法,也可以是抽象方法。接口的方法必须是public,abstract修饰(默认)(1.8以后方法可以加static关键字,但必须有方法体)

6.抽象类的所有方法需要被子类全部实现(有一种情况例外,除非子类也是抽象类,其实就是把实现的责任又传递了下去);
接口的所有方法必须被它的实现类全部实现(没有例外);

7.最重要的一点,抽象类是单继承,接口是多实现。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值