本帖最后由 MartinYu 于 2016-7-1 22:15 编辑
day09课堂笔记
一.多态
1.事物的多种形态
特点:
1)有继承关系
2)子类重写父类的方法
3)父类引用指向子类对象
多态举例:
class Father {}
class Son extends Father{}
class Test {
public static void main(String[] args){
//原来
Son s = new Son();
//多态
Father fa = new Son();
}
}
2.多态的故事
花木兰替父从军
花爹 爹 = new 花木兰();
成员变量 : 编译看左边(父类),运行看左边(父类);
军队点名:
报花爹 (他爹的名字) ---- 88 (他爹年龄)
成员方法: 编译看左边(父类)看他父亲有没有这个方法,有编译成功,没有编译失败,运行看右边(子类)运行花木兰的方法;
打仗:
打仗的时候(方法) ----- > 花木兰去打仗(他爹必须有打仗的方法)
注释:
父类中必须要有这个方法编译才能通过,运行的时候执行的是子类的这个方法(子类重写父类方法);
问题:子类特点有方法,父类引用能不能调用?
他两都有打仗的方法fly();
花木兰打仗 ---- 匕首
花木兰他爹 ---- 长矛
花木兰特点有方法: 跳舞 dance();
FlowerDady dady = new FlowerTreeGirl();
dady.fly(); ---- 打仗用匕首
dady.dance() ---- 这个编译报错. 父类引用不能调用子类特有的方法
静态方法:
编译看左边,运行还看左边(静态绑定)
花木兰(引用的名字是花爹)-----> 打赢了-----> 皇上知道了-----> 昭告天下(封了花爹为大元帅)--->把照片贴到城墙上
这时候花木兰就永远变成了花爹.
调用方法的时候, 永远看花爹跟花木兰绑定的人-----> 运行看左边
多态的好处和弊端:
好处:1)提高代码的维护性 (多态的前提是继承)
2) 提高代码的扩展性
//Animal DOg Cat 共同的eat dog---lookHome cat---catchMouse
class Test {
public static void main(String[] args){
Animal an = new Dog();
Animal an2 = new Cat();
Cat c = new Cat();
test(c); //可以传递子类对象
test(new Dog())
}
//问题: 接受的是父类,能不在调用的时候传递Animal的子类
public static void test(Animal an){
an.eat(); //调用Animal中的方法
//加一个判断
if( an instanceof Cat){ //判断an是不是cat,如果是返回true
Cat c = (Cat)an;
c.catchMouse();
}
if (an instanceof Dog){ //判断an是不是dog,如果是返回true
Dog d = (Dog)an;
d.lookHome();
}
}
}
弊端: 必能使用子类的特有属性和方法.
二.抽象类
抽象类是什么? 有什么作用
抽象类也是描述一个类事物,但是自己本身不实现,让子类去继承并且重写. (抽象类设定了方法签名--- 规则)
规则强制子类重写父类的抽象方法,防止子类设计的随意化.
特点:
1)被Abstract修饰的类
2)抽象类不一定有抽象方法(抽象类可以有非抽象的方法也可以有抽象方法), 有抽象方法的一定是抽象类或者即接口
3)抽象类不能实例化(创建该类对象),但是可以按照多态方式,创建子类对象,指向该父类(可以是抽象类)引用.
4)抽象类的子类要么就是抽象类,要么就不是抽象类,如果不是抽象类,就必须重写父类中的所有抽象方法.
格式:
abstract 类名 {
int a = 10; //变量不用Abstract修饰
//方法可以用Abstract修饰
public abstract void print(); //抽象方法没有方法体
也可以不用Abstract修饰
public void method(){}
}
抽象类成员特点:
1) 抽象类中成员变量可以是变量,也可以是常量。变量不能用abstract修饰。
2)抽象类有构造方法。用于子类访问父类数据的初始化。
3)成员方法:既可以是抽象的,也可以是非抽象的。
4)抽象方法强制要求子类做的事情;非抽象方法子类继承的事情,提高代码复用
|
|