程序员

接口和抽象类

2018-12-15  本文已影响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.接口与接口之间关系: 继承关系。

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

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

上一篇 下一篇

猜你喜欢

热点阅读