多态概述
多种状态,同一对象在不同情况下表现出不同的状态或行为
水在不同的温度下有不同的形态:
液态水
水蒸气
固态冰
Java
中实现多态的步骤
要有继承(或实现)关系
要有方法重写
父类引用指向子类对象.
多态关系中成员变量的使用
需求:子父类中定义了同名的成员变量,如何调用?
分析:
A
:子父类中定义同名属性
name
并分别初始化值:
String name;
B
:在测试类中以多态的方式创建对象并打印
name
属性值:
Animal
animal = new Dog();
C
:在测试类中以普通方式创建对象并打印
name
属性值:
Dog dog
= new Dog();
结论:
成员变量不能重写
成员变量的使用,取决于调用该变量的类型,成员变量不能重写
父类
package com.bigdata.demo2;
public class Parent {
String name = "父类中的name";
public void introduction() {
System.out.println("父类的自我介绍方法...");
}
}
子类
package com.bigdata.demo2;
public class Child extends Parent {
String name = "子类中的name";
@Override
public void introduction() {
System.out.println("子类 中的自我介绍方法...");
}
}
测试类
package com.bigdata.demo2;
public class Test {
public static void main(String[] args) {
// 父类引用 指向 子类对象
Parent parent = new Child();
// 通过父类引用 调用 成员变量, 取的是父类的变量值
System.out.println(parent.name);
// 通过父类引用调用成员方法, 具体调用的是什么方法要看右边 new 的是什么类型的对象
parent.introduction();
Child child = new Child();
System.out.println(child.name);
}
}
多态的好处和弊端
多态的好处
可维护性:
基于继承关系,只需要维护父类代码,提高了代码的复用性,大大降低了维护程序的工作量
为什么要学习多态:
从程序的模块化和复用性来解释
封装:让数据的操作模块化,提高代码复用性
继承:复用方法,从对象的行为这个层面,提高代码的复用性
多态:复用对象,程序运行时同一个对象表现出不同的行为
可扩展性:
把不同的子类对象都当作父类看待,屏蔽了不同子类对象间的差异,做出通用的代码,以适应不同的需
求,实现了向后兼容
多态的弊端
不能使用子类特有成员
解决办法:
向下转型(前提:必须准确知道该父类引用指向的子类类型)
向上转型(自动类型转换)
// 子类型转换成父类型
Animal animal = new Dog();
向下转型(强制类型转换)
// 父类型转换成子类型
Dog dog = (Dog)animal;
注意事项
只能在继承层次内进行转换,否则可能造成异常(
ClassCastException
) 将父类对象转换成子类之
前,使用 instanceof
进行检查
final
关键字
final
的概念
最终的、最后的
final
的作用
用于修饰类、方法和变量
修饰类:
该类不能被继承
String, System
修饰方法:
该方法不能被重写 不能与
abstract
共存
修饰变量:
最终变量,即常量,只能赋值一次
static
关键字
static
的作用
用于修饰类的成员 :
成员变量:类变量
成员方法:类方法
调用方式
类名
.
变量名
;
类名
.
方法名
(
参数
);
static
修饰成员变量
特点:
被本类所有对象共享
注意事项
随意修改静态变量的值是有风险的,为了降低风险,可以同时用
final
关键字修饰,即公有静态常量(注
意命名的变化)
静态方法:
静态方法中没有对象
this
,所以不能访问非静态成员
静态方法的使用场景
只需要访问静态成员 不需要访问对象状态,所需参数都由参数列表显示提供
接口
概念
接口技术用于描述类具有什么功能,但并不给出具体实现,类要遵从接口描述的统一规则进行定义,所
以,接口是对外提供的一组规则、标准。
接口的定义
定义接口使用关键字
interface
interface 接口名 {}
类和接口是实现关系,用
implements
表示
class 类名 implements 接口名 {}
注意
:
接口不能实例化
,
通过多态的方式实例化子类对象
接口继承关系的特点
接口与接口之间的关系
继承关系,可以多继承,格式:
接口 extends 接口1,接口2,接口3
接口成员的特点
接口成员变量的特点
接口没有成员变量,只有公有的、静态的常量:
public static final 常量名 = 常量值;
接口成员方法的特点
JDK7
及以前,公有的、抽象方法:
public abstract 返回值类型 方法名();
JDK8
以后,可以有默认方法和静态方法:
public default 返回值类型 方法名() {}
static 返回值类型 方法名() {}
JDK9
以后,可以有私有方法:
private 返回值类型 方法名() {}
接口构造方法的特点
接口不能够实例化,也没有需要初始化的成员,所以接口没有构造方法