对于上次小结的补充

我又来啦!想我了没?这次继续上次多态的分享嗷!

一、多态的好处和弊端

好处:提高了程序的扩展性;

定义方法时,使用父类作为参数,由子类具体实现;

弊端:不能使用子类的特有功能;

举例:

//测试类
public class user
{
    public static void main(String[] args)
    {
        user u=new user();
        animal a=new animal();
        u.ss(a);
    }
}
//实用类
public class user
{
    user u=new user();
    public void ss(animal a)
    {
        a.show();
    }
}
//父类
public class animal
{
    public void show()
    {
        cat c=new cat();
        c.eat();
        dog d=new dog();
        d.eat();
        pig p=new pig();
        p.eat();
    }
}
//子类-猫
public class cat extends animal
{
    public void eat()
    {
        System.out.println("猫吃鱼");
    }
}
//子类-狗
public class dog extends animal
{
    public void eat()
    {
        System.out.println("狗吃骨头");
    }
}
//子类-猪
public class pig
{
    public void eat()
    {
        System.out.println("猪吃白菜");
    }
};

二、多态中的转型

分为:向上转型向下转型

animal a=new cat();//向上转型---不可以调用不输于animal中的成员方法
cat c=(cat)a;//强转为cat类,向下转型

举例:

//猫和狗案例
//测试类
public class test
{
    public static void main(String[] args)
    {
        //猫--向上转型
        animal a=new cat();
        a.setname("加菲猫");
        a.setage(5);
        System.out.println(a.getname()+","+a.getage());
        a.eat();
        //狗--向下转型
        animal b=new dog();
        b.setname("史努比");
        b.setage(3);
        System.out.println(b.getname()+","+b.getage());
        b.eat();
    }
}
//父类
public class animal
{
    private String name;
    private int age;
   public animal(){}
    public animal(String name,int age)
    {
        this.name=name;
        this.age=age;
    }
    public void setname(String name)
    {
        this.name=name;
    }
    public void setage(int age)
    {
        this.age=age;
    }
    public String getname()
    {
        return name;
    }
    public int getage()
    {
        return age;
    }
    public void eat()
    {
        System.out.println("动物吃东西");
    }
}
//猫类
public class cat extends animal
{
    public cat(){}
    public cat(String name,int age)
    {
         super(name,age);
    }
    public void eat()
    {
       System.out.println("猫吃鱼");
    }
}
//狗类
public class dog extends animal
{
    public dog(){}
    public dog(String name,int age)
    {
        super(name,age);
    }
    public void eat()
    {
        System.out.println("狗吃骨头");
    }
}

三、抽象类

关键词:abstract--定义抽象类

若是一个类中存在抽象成员方法,那么该类为抽象类(不能够实例化),需要加上abstract关键字;

若某抽象类被继承,那么,它的子类需要继承父类的抽象成员函数,否则会报错;

在测试类中,不能直接调用抽象父类,它需要通过子类多态进行调用;

举例:

//测试类
public class test
{
    public static void main(String[] args)
    {
        animal a=new cat();//向下转型
        a.eat();
        a.sleep();
    }
}
//抽象父类
public abstract class animal
{
    public abstract void eat();
    public void sleep()//抽象类中也可以有非抽象方法
    {
        System.out.println("睡觉");
    }
}
//子类
public class cat  extends animal
{
    public void eat()
    {
        System.out.println("猫吃鱼");
    }
}

四、接口--一种公共的规范准则

接口interface定义;需要用implements阐明它继承于一个接口;

而接口同样是一个抽象类,不能够直接调用,需要子类间接调用(接口不能实现实例化);

(多态包括:具体类多态、抽象类多态、接口多态);

举例:

//测试类
public class test
{
    public static void main(String[] args)
    {
        animal a=new cat();
        a.jump();
    }
}
//父类--动物类
public class interface animal
{
    public abstract void jump();
}
//子类--猫类
public class cat implements animal
{
    public void jump()
    {
        System.out.println("猫猫跳得很高!");
    }
}
注意:

接口中的成员变量,默认被finalstatic修饰(即public static final为默认修饰符)

若某个类没有父类,则默认继承自Object类

接口不能有构造方法;(public class cat implements animal<==>public class cat implements animal)

接口中,不能有非抽象方法(接口中的成员方法,默认带有public abstract的修饰符);

五、类与接口的关系

1类与类:继承关系-->单继承和多继承

2类与接口的关系:实现关系-->单实现和多实现,也可以在继承一个类时,使用多个接口;

public class test implements inter1,inter2,inter3{}//一个类对应多个接口
public class test extends Object implements inter1,inter2,inter3{}//一个类对应多个接口和类

3接口与接口的关系:继承关系-->单继承和多继承

public class interface inter1 extends inter2,inter3{}
注意:

抽象类是对于事物的抽象;

接口是对于行为的抽象;

举例:

已知有乒乓球运动员、篮球运动员、乒乓球教练和篮球教练,为了出国交流,与乒乓球有关的人员均需要学习英语,对此案例进行分析,并敲出相应的代码。

//测试类
public class test
{
    public static void main(String[] args)
    {
        //乒乓球运动员
        ppy p=new ppy();
        p.setname("lily");
        p.setage(19);
        System.out.println(p.getname()+","+p.getage());
        p.eat();
        p.learn();
        p.learne();
        //篮球运动员
        ly l=new ly();
        l.setname("wangwu");
        l.setage(21);
        System.out.println(l.getname()+","+l.getage());
        l.eat();
        l.learn();
        //篮球教练
        basj b=new basj();
        b.setname("lisi");
        b.setage(23);
        System.out.println(b.getname()+","+b.getage());
        b.eat();
        b.teach();
        //乒乓球教练
        pp a=new pp();
        a.setname("liuqing");
        a.setage(13);
        System.out.println(a.getname()+","+a.getage());
        a.eat();
        a.teach();
        a.learne();
    }
}
//总抽象类--人
public abstract class person
{
    private String name;
    private int age;
    person(){}
    person(String name,int age)
    {
        this.name=name;
        this.age=age;
    }
    public void setname(String name)
    {
        this.name=name;
    }
    public void setage(int age)
    {
        this.age=age;
    }
    public String getname()
    {
        return name;
    }
    public int getage()
    {
        return age;
    }
    public abstract void eat();
}
//次抽象类--运动员
public abstract class ydy extends person
{
    ydy(){}
    ydy(String name,int age)
    {
        super(name,age);
    }
    public abstract void learn();
}
//次抽象类--教练
public abstract class jl extends person
{
    jl(){}
    jl(String name,int age)
    {
        super(name,age);
    }
    public abstract void teach();
}
//接口
public interface studye
{
    public abstract void learne();
}
//篮球教练类
public class basj extends jl
{
    basj(){}
    basj(String name,int age)
    {
        super(name,age);
    }
    public void teach()
    {
        System.out.println("篮球教练教如何运球和投篮");
    }
    public void eat()
    {
        System.out.println("篮球教练吃羊肉,和羊奶");
    }
}
//乒乓球教练类
public class pp extends jl implements studye
{
    pp(){}
    pp(String name,int age)
    {
        super(name,age);
    }
    public void teach()
    {
        System.out.println("乒乓球教练教如何发球和接球");
    }
    public void eat()
    {
        System.out.println("乒乓球教练吃小白菜,和大米粥");
    }
    public void learne()
    {
        System.out.println("乒乓球教练学习英语");
    }
}
//篮球运动员类
public class ly extends ydy
{
    ly(){}
    ly(String name,int age)
    {
        super(name,age);
    }
    public void learn()
    {
        System.out.println("篮球运动员学习如何运球和投篮");
    }
    public void eat()
    {
        System.ot.println("篮球运动员吃牛肉,和牛奶");
    }
}
//乒乓球运动员类
public class py extends ydy implements studye
{
    py(){}
    py(String name,int age)
    {
        super(name,age);
    }
    public void learn()
    {
        System.out.println("乒乓球运动员学习如何发球和接球");
    }
    public void eat()
    {
        System.out.println("乒乓球运动员吃大白菜,和小米粥");
    }
    public void learne()
    {
        System.out.println("乒乓球运动员学习英语");
    }
}
posted @ 2022-04-27 20:48  yesyes1  阅读(15)  评论(0编辑  收藏  举报