美文网首页程序员
接口和抽象类

接口和抽象类

作者: 我可能是个假开发 | 来源:发表于2018-12-15 17:30 被阅读9次

    接口和抽象类

    一、抽象类

    抽象类的应用场景:

    我们在描述一类事物的时候,发现该种事物确实存在着某种行为,但是这种行为目前是不具体的,那么我们可以抽取这种行为 的声明,但是不去实现该种行为,这时候这种行为我们称作为抽象的行为,我们就需要使用抽象类。

    抽象类的好处: 强制要求子类一定要实现指定的方法。

    抽象类要注意的细节:

    1. 如果一个函数没有方法体,那么该函数必须要使用abstract修饰,把该函数修饰成抽象的函数。
    2. 如果一个类出现了抽象的函数,那么该类也必须使用abstract修饰。
    3. 如果一个非抽象类继承了抽象类,那么必须要把抽象类的所有抽象方法全部实现。
    4. 抽象类可以存在非抽象方法,也可以存在抽象的方法.
    5. 抽象类可以不存在抽象方法的。
    6. 抽象类是不能创建对象的。
    7. 抽象类是存在构造函数的,其构造函数是提供给子类创建对象的时候初始化父类的属性的。

    抽象类不能创建对象的原因:
    因为抽象类是存在抽象方法的,如果能让抽象类创建对象的话,那么使用抽象的对象调用抽象方法是没有任何意义的。

    //动物类--->抽象类
    abstract class Animal{
        
        String name;
        String  color;
    
        public Animal(String  name,String color){
            this.name = name;
            this.color = color;
        }
        
        //非抽象的方法
        public void eat(){
            System.out.println(name+"吃粮食");
        }
        //移动...
        public abstract void run();
    }
    
    //狗 是属于动物中一种 
    class Dog extends Animal{
    
        public Dog(String name,String color){
            super(name,color);
        }
        public void run(){
            System.out.println(name+"吃肉");
        }
    }
    
    //鱼是属于动物中一种
    class Fish extends Animal{
        public Fish(String name,String color){
            super(name,color);
        }
        public void run(){
            System.out.println(name+"吃饲料");
        }
    }
    
    class Demo{
    
        public static void main(String[] args) 
        {
            /*
            Dog d = new Dog("贵宾","棕色");
            d.run();
    
            //创建一个鱼对象
            Fish f  = new Fish("锦鲤","金黄色");
            f.run();
            */
            Animal a = new Animal();
        }
    }
    

    abstract不能与以下关键字共同修饰一个方法:

    1. abstract不能与private共同修饰一个方法。
      private修饰的只能在本类中使用,
      abstract方法是用来被子类进行重写的,有矛盾
      所有不能共存.

    2. abstract不能与static共同修饰一个方法。
      对于abstract修饰的方法没有具体的方法实现,所有不能直接调用,
      也就是说不可以与static共存。

    3. abstract不能与final共同修饰一个方法。
      final:它的作用 修饰类代表不可以继承 修饰方法不可重写
      abstract修饰类就是用来被继承的,修饰方法就是用来被重写的。

    描述一个图形、圆形、 矩形三个类。不管哪种图形都会具备计算面积与周长的行为,但是每种图形计算的方式不一致。

    //图形类
    abstract class MyShape{ 
    
        String name;
    
        public MyShape(String name){
            this.name = name;
        }
    
        public  abstract void getArea();
        public abstract void getLength();
    }
    
    //圆形 是属于图形类的一种
    class Circle extends MyShape{
        
        double r;
        public static final double PI = 3.14;
    
        public Circle(String name,double r){
            super(name);
            this.r =r;
        }
    
        public  void getArea(){
            System.out.println(name+"的面积是:"+PI*r*r);
        }
        
        public  void getLength(){
            System.out.println(name+"的周长是:"+2*PI*r);
        }
    }
    
    class Circle extends MyShape(){
        
        double r;
        public static final double PI=3.14;
        
        public Circle(String name,double r){
            super(name);
            this.r=r;
        }
        public void getArea(){
            System.out.println(name+"的面积是:"+PI*r*r);
        }
        public void getLength(){
            System.out.println(name+"的周长是:"+2*PI*r);
        }
    }
    
    //矩形属于图形中的一种
    class Rect extends MyShape{
    
        int width;
        int height;
    
        public Rect(String name,int width, int height){
            super(name);
            this.width = width;
            this.height = height;
        }
    
        public  void getArea(){
            System.out.println(name+"的面积是:"+width*height);
        }
        
        public  void getLength(){
            System.out.println(name+"的周长是:"+2*(width+height));
        }
    }
    
    class Demo4 
    {
        public static void main(String[] args) 
        {
            //System.out.println("Hello World!");
        
            Circle c = new Circle("圆形",4.0);
            c.getArea();
            c.getLength();
    
            //矩形
            Rect r = new Rect("矩形",3,4);
            r.getArea();
            r.getLength();
        
        }
    }
    

    注意:一个类最多只能有一个直接的父类,但是可以有多个间接的父类。

    class Grandpa{
        String name;
    }
    
    class Father extends Grandpa{
    
    }
    
    class  Child extends Father{
    
    }
    
    class Demo
    {
        public static void main(String[] args) 
        {
            Child child =new Child();
            child.name = "小红";
            System.out.println(child.name);
        }
    }
    

    二、接口

    1.接口的作用

    1. 程序的解耦。(低耦合)
    2. 定义约束规范。
    3. 拓展功能。

    2.接口的定义格式

    interface 接口名{
    
    }
    

    3.接口要注意的事项

    1. 接口是一个特殊的类。
    2. 接口的成员变量默认的修饰符为: public static final 。那么也就是说接口中的成员变量都是常量。
    3. 接口中的方法都是抽象的方法,默认的修饰符为: public abstract。
    4. 接口不能创建对象。
    5. 接口是没有构造方法的。
    6. 接口是给类去实现使用的,非抽象类实现一个接口的时候,必须要把接口中所有方法全部实现。

    4.实现接口的格式

    class  类名 implements 接口名{
    
    }
    

    Demo:

    interface A{
    
        //成员变量
        public static final int i=10;
        //成员函数
        public void print();
    }
    
    class Demo implements A{ // Demo就实现了A接口
    
        public static void main(String[] args) 
        {
            Demo d = new Demo();
            d.print();
        }
    
        //实现接口中的方法
        public void print(){
            System.out.println("这个是接口中的print方法...");
        }
    }
    

    Demo:

    //普通的铅笔类
    class Pencil{
        
        String name;
    
        public Pencil(String name){
            this.name = name;
        }
    
        public void write(){
            System.out.println(name+"写");
        }
    }
    
    
    //橡皮接口
    interface Eraser{
        public void remove();
    }
    
    //带橡皮的铅笔
    class PencilWithEraser extends Pencil implements Eraser {
    
        public PencilWithEraser(String name){
            super(name);
        }
    
        public void remove(){
            System.out.println("涂改");
        }
    }
    
    class Demo
    {
        public static void main(String[] args) 
        {
            PencilWithEraser p = new PencilWithEraser("2B铅笔");
            p.write();
            p.remove();
        }
    }
    

    三、类与接口之间的关系

    1.类与接口之间的关系:实现关系。

    类与接口要注意的事项:

    1. 非抽象类实现一个接口时,必须要把接口中所有方法全部实现。
    2. 抽象类实现一个接口时,可以实现也可以不实现接口中的方法。
    3. 一个类可以实现多个接口 。

    2.接口与接口之间关系: 继承关系。

    接口与接口之间要注意事项:

    一个接口是可以继承多个接口的。

    相关文章

      网友评论

        本文标题:接口和抽象类

        本文链接:https://www.haomeiwen.com/subject/azvahqtx.html