【JAVA300】46-50 笔记

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jvao_q7/article/details/77160948
46_面向对象_19_多态_内存分析.wmv


47_面向对象_20_多态_内存分析深化(模拟servlet中方法的调用).wmv
构造可以为:父类 a = 子类();
调用继承,未重写,或重写的直接调用
调用继承,父类没有的,子类有的方法需要强制转换
调用时,因为this指向整个对象,所以会调子类

48_面向对象_21_抽象类_抽象方法.wmv
模板模式。抽象类为所有子类提供一个通用模板,子类可以在这个模板基础上进行扩展。
通过抽象类,可以避免子类设计的随意性。通过抽象类,我们就可以做大到严格限制子类的设计,使子类之间更加通用。

要点:
有抽象方法的类只能定义能抽象类
抽象类不能实例化,及不能用new来实例化抽象类。
抽象类可以包含属性,方法,构造方法。但是构造方法不能用来new实例,只能用来被子类调用。
抽象类只能用来继承。
抽象方法必须被子类实现。

抽象方法必须重写,抽象类不能直接调用
将方法的设计和方法的实现分离了

49_面向对象_22_接口详解.wmv
为什么需要接口?接口和抽象类的区别?
-接口就是比“抽象类”还“抽象”的”抽象类“,可以更加规范的对子类进行约束。全面地实现了:规范和具体实现的分离
-接口就是规范,定义的是一组规则,体现了现实世界中“如果你是。。则必须能。。”的思想。如果你是天使,则必须能飞。如果你是汽车,则必须能跑、如果你好冷,则必须干掉坏人;,如果你是坏人,则必须欺负好冷
-接口的本质是契约,就像我们人间的法律一样。制定好后大家都遵守。
-项目的具体需求是多边的,我们必须以不变应万变才能从容开发,此处“不变”就是“规范”。因此,我们开发项目往往都是面向接口编程!

【访问修饰符】interface 接口名 【extends 父接口1,父接口2.。。】{
_常量定义,总是public static final
_方法定义    总是public abstract

子类通过implements来实现接口中的规范
接口不能创建实例,但是可用于声明引用变量类型
一个类实现了接口,必须实现接口中所有的方法,并且这些方法只能是public的
一个类实现多个接口

50_面向对象_23_回调的实现_模板方法模式.wmv
callback(hook)回调,钩子,模板

把不太知道如何实现的,交给别人来写

写死一个方法,传入一个子类

对callback,暂时的理解是: A对象调用B接口的b方法,b方法又反过来调用A对象中的c方法。 
A调用B接口时把自身给B接口,至于怎么处理,由B的实现类去做,不关A的事。  

写了个例子,BadBoy,这类坏孩子喜欢打人,有个方法叫hit,hit只能对实现了Hitable的对象执行。这时候,BadBoy已经做完了自己的事,也就是已经打完人了,然后挨打的人肯定知道是谁打了自己,至于挨打的人是什么反应,BadBoy是无法控制的。挨打的人有可能哭有可能跑有可能报警。 

BadBoy: 
class BadBoy {
    String name;

    public BadBoy(String name) {
        this.setName(name);
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
        //打人
    public void hit(Hitable hitable) {
        System.out.println("----------------BEGIN----------------");
        System.out.println("badboy " + this.getName() + "打了"
                + hitable.getName() + "一拳");
         hitable.beHit(this);
        System.out.println("-----------------END----------------");
    }

}

挨打的人的接口,他们有一个共同的方法,就是beHit(BadBoy boy),既然挨打了,肯定知道是谁打的自己,所以打人者BadBoy被作为参数传进来
interface Hitable {
    public void beHit(BadBoy boy);

    public String getName();

    public void setName(String name);
}


Child:这个类实现了Hitable,小孩挨打了,反应是哭。。
class Child implements Hitable {
    String name;

    public Child(String name) {
        this.setName(name);
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public void beHit(BadBoy boy) {
        System.out.println("child " + this.getName() + "被" + boy.getName()
                + "打哭了");
    }

}

BigMan也实现了Hitable接口,这类人比较猛,挨打后的反应,是把打人者杀了。。 
class BigMan implements Hitable {
    String name;

    public BigMan(String name) {
        this.setName(name);
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public void beHit(BadBoy boy) {
        System.out.println("bigman " + this.getName() + "把" + boy.getName()
                + "杀死了");
    }

}


test类: 
public class CallBackTest {
    public static void main(String[] args) {
        BadBoy badboy = new BadBoy("Tom");
        Hitable child = new Child("Cat");
        Hitable bigman = new BigMan("Boris");
        badboy.hit(child);
        badboy.hit(bigman);
    }
}

执行结果:
----------------BEGIN----------------
badboy Tom打了Cat一拳
child Cat被Tom打哭了
-----------------END----------------
----------------BEGIN----------------
badboy Tom打了Boris一拳
bigman Boris把Tom杀死了
-----------------END----------------


这个例子可以看出,坏孩子在打了挨打者以后,把自己作为参数给了挨打者,等于是告诉挨打者,
“我打了你,你爱怎么着怎么着吧”,接下来挨打者调用方法beHit,不同类型的挨打者会对坏孩子做出不同的反应。 
这个例子类似一个通知,在做取值传值的时候会很有用。 

例子2: 
根据上边例子再联想一个例子,A取数据要给B,A是一个不断在polling数据的对象,B是一个接口,
A取到数据后调用B接口的b方法,并且把自己的引用传给B,告诉B,我已经取到了你要的数据,
你自己来拿吧,到这里,A已经完成了任务。B的实现类会根据自己的不同实现,在从A取来数据后进行处理,
可能是排序,可能是输出到文件,也可能是打印。 

猜你喜欢

转载自blog.csdn.net/jvao_q7/article/details/77160948
今日推荐