多态的概述
- 一:多态(polymorphic)
- 事物存在多种形态
- 二:多态前提
- 要有继承关系
- 要有方法重写
- 要由父类引用指向子类对象
多态中的成员访问特点 成员变量
* 成员变量
* 编译看左边(父类),运行看右边(父类)
编译是父类,运行结果也是父类
class Demo2_Polymorphic{
public static vodid main (String[] args){
Father f = new Son();
System.out.println(f.num);
}
}
class Father{
int num = 10;
}
class Son extends Father{
int num = 20;
}
上面代码输出结果为: 10
多态的成员访问特点 成员方法
- 成员方法
- 编译看左边(父类),运行看右边(子类)
注释: 编译是否通过看的是父类,运行结果是子类。
- 编译看左边(父类),运行看右边(子类)
class Demo2_Polymorphic{
public static vodid main (String[] args){
Father f = new Son();
f.print();
}
}
class Father{
int num = 10;
public void print{
System.out.println("Father");
}
}
class Son extends Father{
int num = 20;
public void print("Son");
}
多态的成员访问特点 静态成员方法
- 静态成员方法
编译看左边(父类),运行看的 是左边(父类)
静态和类相关,算不上重写,所以,访问还是左边的
只有非静态的成员方法,编译看左边,运行看右边
向上转型和向下转型
Person p = new Student();//向上转型
Student s = (Student)p;//向下转型
多态的利弊
- 多态 的 利:
- 提高代码的维护性(继承保证)
- 提高代码的扩展性 (由多态保证)
- 多态的 弊:
- 不能使用子类的特有属性和行为。
抽象类的概述和特点
- 抽象类特点
- 抽象类和抽象方法必须用abstract关键字修饰
- abstract class 类名{}
- public abstract void eat();
- 抽象类不一定由抽象方法,有抽象方法的类一定是抽象类(接口的方法都是抽象方法)
- 抽象类不能被实例化,所以可由多态的方式,由子类实例化。
- 抽象类的子类
- 要么是抽象类
- 要么重写抽象类中的抽象方法
- 抽象类和抽象方法必须用abstract关键字修饰
抽象类的成员特点
- 成员变量:既可以是变量,也可以是常量。abstract不可以修饰成员变量
- 构造方法: 抽象类是具有构造方法的(用于子类访问父类的数据初始化)
- 成员方法:既可以是抽象的,也可以是非抽象的。
抽象方法的成员特性
抽象方法 强制要求子类做的事情
非抽象方法 子类继承的事情 提高代码的复用性
接口
- 接口概述:
- 从侠义的角度讲就是指java中的interface
- 从广义上讲对外提供规则
- 接口特点
- 接口用关键字interface表示
interface 接口名 {} - 类实现接口用implements表示
class 类名 implements 接口名{} - 接口不能实践化
以多态的方式来实例化 - 接口的子类
可以是抽象类,但是意义不大
可以具体类。要重写接口中的所有抽象方法。
- 接口用关键字interface表示
接口的成员特点
- 接口成员特点
- 成员变量:只能是常量(而且是默认是常量)
* 默认修饰符:public static final
* 最好自己给出 - 构造方法:接口没有构造方法
- 成员方法:只能是抽象方法
* 默认修饰: public abstract
* 建议自己给出
- 成员变量:只能是常量(而且是默认是常量)
类与类 ,类与接口,接口和接口
- 类和类 : 继承关系,只有单继承,可以多层继承
- 类和接口:实现关系,可以单实现,也可以多实现。
- 接口和接口: 继承关系可单继承,也可多继承
抽象类和接口的区别
(成员之间区别)
- 抽象类:
- 成员变量:可以变量,也可以是常量
- 构造方法:有
- 成员方法: 可以抽象,也可非抽象
- 接口
- 成员变量:只可以是常量
- 成员方法:只可以是抽象的
(关系之间区别)
- 类和类:继承,单继承
- 类和接口: 实现,单继承,多实现
- 接口也接口:继承,单继承,多继承
(设计理念区别) - 抽象类 被继承体现的是:”is a”的关系。抽象类中定义的是该继承体系的共性功能。
- 接口 被实现体现的是:”like a”的关系。接口中定义的是该继承体系的扩展功能。