面向对象---多态
多态:
可以理解为事物存在的多种体现形态。
比如:人:男人,女人
多态的体现:
父类的引用指向了自己的子类对象。
父类的引用也可以接受自己的对象。
public class Demo44 {
public static void main(String[] args){
// Cat1 cat=new Cat1();
// cat.eat();
function(new Cat1());
}
public static void function(Animal1 a){//Animal1 cat=new Cat();父类的引用指向了自己的子类对象。
a.eat();
}
}
abstract class Animal1{
abstract void eat();
}
class Cat1 extends Animal1{
public void eat(){
System.out.println("吃鱼");
}
}
class Dog1 extends Animal1{
public void eat(){
System.out.println("吃骨头");
}
}
//如果想要调用猫的特有方法,如何操作?
//强制将父类的引用,转成子类类型。
public class Demo44 {
public static void main(String[] args){
Animal1 cat=new Cat1();//类型提升,向上转型
function(new Cat1());
//如果想要调用猫的特有方法,如何操作?
//强制将父类的引用,转成子类类型。
Cat1 cat1=(Cat1) cat;
cat1.catchMouse();
}
public static void function(Animal1 a){//Animal1 cat=new Cat();
a.eat();
}
}
abstract class Animal1{
abstract void eat();
}
class Cat1 extends Animal1{
public void eat(){
System.out.println("吃鱼");
}
public void catchMouse(){
System.out.println("捉老鼠");
}
}
下面的操作是错误的,就是经父类对象转成子类类型。
我们能转换的是父类应用指向了自己的子类对象时,该应用可以被提升,也可以被转换。
Animal1 a=new Animal1();
Cat1 c=(cat1)a;
注意:自始至终多态都是子类对象在做着变化。
public class Demo44 {
public static void main(String[] args){
function(new Cat1());
}
public static void function(Animal1 a){//Animal1 cat=new Cat();
a.eat();
if(a instanceof Cat1){//判断a 是否是Cat1 类型的
Cat1 c=(Cat1) a;
c.catchMouse();
}else if(a instanceof Dog1){//判断a 是否是Dog1 类型的
Dog1 d=(Dog1) a;
d.kanjia();
}
}
}
abstract class Animal1{
abstract void eat();
}
class Cat1 extends Animal1{
public void eat(){
System.out.println("吃鱼");
}
public void catchMouse(){
System.out.println("捉老鼠");
}
}
class Dog1 extends Animal1{
public void eat(){
System.out.println("吃骨头");
}
public void kanjia(){
System.out.println("看家");
}
}
输出结果为:
吃鱼
捉老鼠
多态的前提
必须是类与类之间有关系,要么继承,要么实现。
通常还有一个前提,存在覆盖。
多态的好处
多态的出现大大的提高了代码的扩展性。
多态的弊端
提高了扩展性,但是只能使用父类的引用访问父类中的成员。
多态的应用
需求:
1、基础班学生:
学习、睡觉
2、高级版学生
学习、睡觉
可以将这两类事物进行抽取。
public class Demo45 {
public static void main(String[] args) {
// BaseStudent bs=new BaseStudent();
// bs.study();
// bs.sleep();
// AdvStudent ad=new AdvStudent();
// ad.study();
// ad.sleep();
doSomething(new BaseStudent());
doSomething(new AdvStudent());
}
public static void doSomething(Student3 s){
s.study();
if(s instanceof BaseStudent){
BaseStudent b=(BaseStudent) s;
s.sleep();
}else if(s instanceof AdvStudent){
AdvStudent ad=(AdvStudent) s;
s.sleep();
}
}
}
abstract class Student3{
public abstract void study();
public abstract void sleep();
}
class BaseStudent extends Student3{
public void study(){
System.out.println("base study");
}
public void sleep(){
System.out.println("lying sleeep");
}
}
class AdvStudent extends Student3{
public void study(){
System.out.println("adv study");
}
public void sleep(){
System.out.println("siting study");
}
}
运行结果如下:
base study
lying sleeep
adv study
siting study改进的另一种方法:
public class Demo45 {
public static void main(String[] args) {
// BaseStudent bs=new BaseStudent();
// bs.study();
// bs.sleep();
// AdvStudent ad=new AdvStudent();
// ad.study();
// ad.sleep();
DoStudent ds=new DoStudent();
ds.dosome(new BaseStudent());
ds.dosome(new AdvStudent());
}
// public static void doSomething(Student3 s){
// s.study();
// if(s instanceof BaseStudent){
// BaseStudent b=(BaseStudent) s;
// s.sleep();
// }else if(s instanceof AdvStudent){
// AdvStudent ad=(AdvStudent) s;
// s.sleep();
// }
// }
}
class DoStudent{
public void dosome(Student3 stu){
stu.study();
stu.sleep();
}
}
abstract class Student3{
public abstract void study();
public abstract void sleep();
}
class BaseStudent extends Student3{
public void study(){
System.out.println("base study");
}
public void sleep(){
System.out.println("lying sleeep");
}
}
class AdvStudent extends Student3{
public void study(){
System.out.println("adv study");
}
public void sleep(){
System.out.println("siting study");
}
}
多态的出现代码中的特点(多态使用的注意事项)
还没有评论,来说两句吧...