接口与多态

#### 1.接口定义的是一种行为,相当与动作的父类。比如游泳,飞行,这些动作不一定属于某个具体的类。(理解为拥有行为)

2.程序架构图,虚线空心箭头表示运用接口,实心空箭头表示继承。

3.行为的多态

public interface Swimmer{

}
public class Fish implements Swinmmer{

}

public class Shark extend Fish {

}

public class human iimplements Swinmmer{

}


Swimmer swimmer =new Shark();
Shark shark=swimmer; //出错,因为swimmer的行为对象不一定是shark

Swimmer swimmer =new Shark();
Shark shark=(shark)swimmer;//正确,w因为让swimmer扮演了shark

Swimmer swimmer =new Human();
Shark shark=(shark)swimmer;//编译出错,因为swimmer无法扮演shark进行swinmming


static void doSwim(Swinmmer swinmmer){//参数多态
    //do some thing
}

4.接口注意点,在接口中的方法都是公开方法,如果没有加public abstract 那么编译程序会自动加上。使用在对方法进行操作的时候,方法前面不能默认为空(default),这样权限就缩小了,在继承中是不允许的。

接口中定义的常数叫枚举,并且需要时final类型,不能再次赋值。

import static java.lang.System.out;
public interface Action{
    public static final int STOP=0;
    //iinterface里只能定义public static final的枚举所以可以直接写int STOP=0;
    public static final int RIGHT=1;
}

public class Game{
    public static void main (String [] args){
        play(Action.RIGHT);
    }

    pubic static void play(int action){
        switch(action){
            case Action.STOP:
                out.print("停止播放动画");
                break;
            case Action.RIGHT:
                out.print("播放向右动画");
                break;
            default:
                out.println("不支持此动作");
        }
    }
}

#### 5.如果继承的两个接口里有相同的方法,就应该思考相同的方法里操作是否相同,如果相同那么就应该定义一个父类接口,让接口继承父类,如果不同那么名字应该不同。

6.匿名内部类

interface Fly{
    void fly();
}

class Bird implements Fly{
        @Override
    public void setName() {
        // TODO Auto-generated method stub
        System.out.println("起飞");
    }
}


public class Test {
    public static void main(String[] args){
        /*多态写法
        Fly f=new Bird();
        f.fly();
        */

        /*实例化对象写法
        Bird b=new Bird();
        b.fly();
        */

        //匿名内部类写法,也就是说把Bird那个k类定义到下面这片代码里
        Fly f=new Fly(){
            @Override
            public void fly() {
                // TODO Auto-generated method stub
                System.out.println("起飞");
            }
        };
        f.fly();//内部类调用内部方法
    }
}
匿名内部类只能取得final局部变量

5.类是如何被加载的

https://blog.csdn.net/world6/article/details/52041857

6.继承接口的抽象类就相当于接口,需要实现所有的未实现的方法,包括接口的方法。即使抽象方法以及在抽象类实现,在使用抽象类的时候也要使用匿名的方式。

package perfectlist;
interface Some{
    void doSome();
}

abstract class AbstractSome implements Some{
    public abstract void doSome();
    public void doService() {
        System.out.println("做一些服务");
    }
}

public class Test{
    public Test() {
        // TODO Auto-generated constructor stub
        AbstractSome s=new AbstractSome() {
            //如果抽象类以及实现了都Some方法,那么这里{}未空
            @Override
            public void doSome() {
                // TODO Auto-generated method stub
                System.out.println("做一些事");
            }
            /*如果重写doService,那么将执行重写的方法
            public void doService() {
                System.out.println("ddd");
            }
            */
        };
        s.doService();
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_39841821/article/details/79903727
今日推荐