黑马程序员——Java基础——面向对象(继承、接口、多态)

来源:互联网 发布:端口 绑定ip 编辑:程序博客网 时间:2024/05/21 12:58

——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-

继承的特点:关键字是:extends
继承就是为了提高代码的复用性而产生的,它可以让代码变得更简洁。它主要是由父类跟子类组成的,一个父类可以有N多个子类,而父类里面的东西就是众多子类的共性,包括变量、方法。子类中可以建立自己特有的成员,也可以覆盖父类中的方法。

关于子父类构造函数:
当子类初始化时,父类也会运行,子类的构造函数的第一行默认有一个隐藏的语句super() , 但如果父类没有空参数的构造函数时,子类要手动加一个super语句调用父类的构造函数,如super(name)。

抽象类是在继承的基础上发展来,关键字是:abstract
如果一个类中有一个用abstract修饰的抽象方法,那么该类就肯定是一个抽象类,也要用abstract修饰。
当一个方法的具体内容是不确定的,因为不同子类的该方法的内容都不一样,那么可以把该方法定义为抽象方法,让抽象类的子类来重写该方法。

定义功能中有确定和不确定的元素时,可以用到模板方法设计模式,
譬如下面的 ‘代码运行计时程序’:

abstract class GetTime{        public final void getTime(){  //被final修饰的方法是不能被重写的        long start = System.currentTimeMillis(); //该方法是返回当前毫秒数        runcode(); //调用抽象方法,让子类重写的代码执行        long end = System.currentTimeMillis();        System.out.println("毫秒:"+(end-start));    }    abstract void runcode(); //因为代码不确定,所以把方法定义为抽象方法,让当前类的子类来重写}class SubTime extends GetTime{ //子类继承父类    public void runcode(){   //重写父类的抽象方法        for(int x=0;x<300;x++){            System.out.println(x);        }    }}public class Moban {    public static void main(String[] args){        SubTime s=new SubTime();        s.getTime();    }}

接口:全是抽象方法组成。 关键字是:interface
接口与类之间是实现关系:implements
接口与接口之间是继承关系:extends,比较特殊,可以是多继承
因为它权限是最大的,所以实现它的子类的方法权限也要是最大的(public)
它对扩展功能有很大重要性。

abstract class Student{             //因为类中有抽象方法,所以要定义成抽象类    abstract void study();          //学习是每个学生都要的,但是学习的方法具体不一样,这个不明确,所以可以抽象    void sleep(){        System.out.println("sleep");    //这里的睡觉是一样,普通方法    }}interface Smoking{      //抽烟为什么要用接口呢,因为抽烟不是每个学生都会抽烟,这个不一定的元素    void smoke();       //这里表现出接口的拓展功能,就是在需要的类中实现该接口就可以新增功能}                       //接口里面的方法默认是public abstract类型class ZhangSan extends Student implements Smoking{      void study(){   //张三重写‘学习’方法,定义自己的方法        System.out.println("我喜欢一个人静静学习");    }               public void smoke(){    //这里可以实现抽烟这个接口,说明张三抽烟,有抽烟功能        System.out.println("我会抽烟");    }   }class Lisi extends Student{     //因为李四不抽烟,所以不实现抽烟接口    void study(){        System.out.println("我喜欢一大堆人一起讨论学习");    }}public class interfaceTest {    public static void main(String[] args){        ZhangSan zs=new ZhangSan();        zs.study();        zs.smoke();        Lisi ls=new Lisi();        ls.study();    }}

多态:也是在继承的基础上才发生的。
具体体现是:父类的引用指向自己的子类对象。
子类一般会把父类中的方法覆盖掉,所以不同子类的方法内容会有所不同,通过父类的引用调用方法,具体会按照指向哪个子类对象去调用相应的子类方法。

下面是多态的例子:

abstract class Animal{    abstract void eat();}class Cat extends Animal{    public void eat(){                  //重写父类的方法        System.out.println("吃鱼");    }    public void catchMouse(){               //特定的技能        System.out.println("抓老鼠");    }}class Dog extends Animal{    public void eat(){        System.out.println("吃骨头");    }    public void kanJia(){        System.out.println("看家");    }}public class DuoTai {    public static void main(String[] args){        Animal a=new Cat(); //类型提升,向上转型        a.eat();        Cat c=(Cat)a;       //强制将父类的引用,转成子类类型,向下转型        c.catchMouse();         function(new Cat());        function(new Dog());    }    public static void function(Animal a){        a.eat();        if(a instanceof Cat){           //instanceof  看是否属于什么类            Cat c=(Cat)a;            c.catchMouse();        }else if(a instanceof Dog){            Dog d=(Dog)a;            d.kanJia();        }    }}
0 0
原创粉丝点击