面向对象--多态、instanceof

实现步骤:

1.创建factory包,创建StudentDaoFactory(工厂类)

2.提供static修改的getStudentDao方法,该方法用于创建StudentDao对象并返回

public class StudentDaoFactory{

public static StudentDao(OtherStudentDao) getStudentDao(){

return new StudentDao()

// return new OtherStudentDao()

}}

可以将StudentDao(OtherStudentDao)改为父类BaseStudentDao,但改完之后StudentDaoFactory又与返回的对象产生耦合,后续课程会学到

public class StudentSerivce{

private StudentDao s = StudentDaoFactory.getStudentDao();

等式左边:将StudentDao改为父类BaseStudentDao,无论等式右边传回什么子类父类都能接住

等式右边:工厂类调用静态方法,返回的是两个new对象(都是BaseStudentDao的子类)

}

多态:

同一个对象,在不同时刻表现出来的不同形态

对象:具体的事物

多态的前提和体现:

1.有继承/实现关系

2.有方法重写

3.有父类引用指向子类对象

没重写会怎么样呢

没重写,多态的格式还是可以调用,返回的是父类的方法,但这样失去了多态的意义,多态的目的是调用  “任意”  子类的重写方法

父 Fu a();

子 Z1 a(){sout("zi11")};(重写父类的方法)

子 Z2 a(){sout("zi22")};(重写父类的方法)

Fu s = new Z1();

s.a();→zi11

Fu s = new Z2();

s.a();→zi22

必须调用重写方法吗--------可调用子类特有方法,下面有讲

多态中成员访问特点:

构造方法:同继承一样,子类会通过super访问父类构造方法

成员变量:编译看左边(父类),执行看左边(父类)

成员方法:编译看左边(父类),执行看右边(子类)

(但如果出现多层继承或多层实现,在调用方法时,只能看左边有什么方法,不能跨层去调用

例:

F1 { f1() }

F2 extends F1{ f2() }

Zi extends F2{ 重写f1();重写f2()}

F1 s = new Zi();

s.f1();

//s.f2()------------调用不了

F2 ss = new Zi();

ss.f1();

ss.f2();

正常调用

以上原理是什么??(需要学完后面的反射再来看)

Java多态的底层实现原理http://t.csdn.cn/nzXTG

为什么成员变量和成员方法的访问特点不一样呢

因为成员方法有重写,成员变量没有

多态的好处和弊端:

好处:

提高程序的扩展性

定义方法时,将方法中的参数设为父类的类型,该方法就可以接收父类的任意子类对象

public class Test{

psvm{  useDog(new Dog());

useCat(new Cat());}

public static void useDog(Dog dog){ dog.eat(); }----------↓↓↓↓↓↓↓

public static void useCat(Cat cat){ cat.eat(); }-------------↓↓↓↓↓↓↓

//两个都是同一个父类Animal,且子类和子类之间,子类和父类之间都是同一个方法eat()

//此时,可以使用多态的方式

//public static void A(Animal a){ a.eat() ; }

}

父类:

abstract class Animal{ public abstract void eat(); }

弊端:

不能用子类特有的方法

(多态一般使用是在调用子父类共有方法,且子类之间调用相同的方法,不会调用子类特有方法)

弊端解决方式:

1.向下转型

2.直接创建子类对象去调用(一般用此类方法多)

多态的转型:

向上转型:

父类引用指向子类对象(就是多态)

Fu f = new Zi();

向下转型:

父类引用转为子类对象

Zi z = (Zi)f;

转型问题:

如果被转的引用类型变量,对应得实际类型和目标类型不一致,在运行时会报ClassCastException

(下面有解决案例)

转型问题得解决方案:(关键字instanceof)

变量名 instanceof 类型,返回得是boolean类型

判断变量名类型是否和右边一致

public class Test{psvm{

a(new Dog());------将子类对象赋值到方法a,而方法a的参数刚好又是父类引用

a(new Cat());}

public static void a(Animal b){------Animal b = new Dog();父类引用指向子类对象

b.animal();----------成员方法:编译看左,运行看右   (得出“狗的重写”)

if(b.instanceof Dog){-----------将狗的对象赋值给b,返回true,将猫的对象赋值给b,返回false

Dog d = (Dog)b;

d.dog();}

}}

class Animal{

public void animal(){sout("动物吃肉")}}

class Dog extends Animal{

public void dog(){sout("狗吃肉")}

@Override:

public void animal(){sout("狗的重写")}

}

class Cat extends Animal{

public void cat(){sout("猫吃肉")}

@Override:

public void animal(){sout("猫的重写")}

}

补充:

1.类中成员变量、构造方法、成员方法的执行流程是:

构造方法(内部有super(),所以优先执行父类(默认继承Object))

成员变量(当构造方法带有参数,是赋值给成员变量的,所以成员变量是第二个初始化的)

成员方法

Java类加载执行顺序http://t.csdn.cn/wvHQ7

2.构造方法是否有局部成员:无,最多为成员变量,构造方法里的变量是参数,用于赋值给成员变量的。局部成员只存在于成员方法

3.

public void test(){}

大括号里就是方法体

如果没有{},就没有方法体

有{} 但是里面没内容说明方法体为空,但是有方法体

test是方法名

方法体就是方法的内容

java1.8以后支持方法体里有内容

没有语句体

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值