JavaWeb程序员

面向对象-抽象类与接口

2018-11-14  本文已影响4人  我叫吴智斌

抽象类-求图形面积
多个类,有相同的方法,可以抽出一个父类出来,把相同的方法放到父类当中

1.每一个圆形都有面积
不同图形求面积的算法不一样
每一个图形子类,都必须覆盖这个方法,在每个里面写上自己的方法体

2.在这个图形类当中,定义了getArea方法,因为不同的图形的算法是不一样的
父类不知道方法体里面该怎么写,本来不需要方法体的

子类必须得要覆盖此方法
在定义的时候,不要方法体了{...}
class Graph {
    Double getArea() {
        return 0.0;
    }
}

// 圆形
class Circle extends Graph {

    private Integer r;

    Circle(Integer r) {
        this.r = r;
    }

    // 求面积
    Double getArea() {
        return 3.14 * r * r;
    }
}

// 矩形
class Rectangle extends Graph {
    private Double width;
    private Double height;

    Rectangle(Double width, Double height) {
        this.width = width;
        this.height = height;
    }

    Double getArea() {

        return this.width * this.height;

    }

}

// 三角形
class Triangle extends Graph {
    private Integer a;
    private Integer b;
    private Integer c;

    Triangle(Integer a, Integer b, Integer c) {
        this.a = a;
        this.b = b;
        this.c = c;
    }
    

}

public class Test {

    // 求圆,矩形,三角形面积

    public static void main(String[] args) {

        Circle cir = new Circle(233);
        System.out.println(cir.getArea());

        Rectangle r = new Rectangle(12.5, 123.3);
        System.out.println(r.getArea());

        
        Triangle t = new Triangle(12, 22, 33);
        System.out.println(t.getArea());//0.0
    }

}

抽象方法
在方法前面添加了一个关键字abstract
特点:
1.抽象方法是没有方法体的
2.抽象方法要定义在抽象当中 或 接口 (在类前面添加上一个abstract 就成为了抽象类)
3.抽象方法不能是私有的private,不能使用final修饰,不能同时使用static

只要使用了抽象方法,子类必须要覆盖此方法,抽象方法没有方法体

abstract class Graph {
    abstract Double getArea();//抽象方法
}

抽象类
其实是一个不完整的类,需要作为一个父类,子类才能完成对应的功能
抽象类必须得要有子类才行(抽象类一般都当作父类来继承 )
抽象类当中的注意点:
1.抽象类是不能直接创建对象的,但是抽象类有构造器
2.抽象类中可以有抽象方法,也可以有非抽象方法(普通方法)
3.子类没有去覆盖抽象方法 把子类也变成抽象类
4.构造方法不能定义为私有的(抽象方法必须得要让子类继承之后,才能实现内部的方法体
子类继承的话,先去调用父类的构造方法
)
5.抽象类不能使用final来去修饰

命名:抽象类命名时,都喜欢在前面加上一个Abstract

抽象类与普通类有什么区别?
普通的类你有的(方法,字段,构造器),抽象类都有
抽象类不能创建对象,抽象类可以包含抽象方法,也可以包含非抽象方法

抽象类必须得有子类才有意义






接口概念
什么是接口?
硬件接口:指的是两个硬件设备之间的连接方式.硬件接口既包括物理上的接口,比如我们所说的usb接口
在java中,接口表示一种规范/约束/要求实现者必须遵守该规范:用来约束使用者应该怎么做


接口是一种规范

在java中接口也是表示一种规范,使用抽象方法来定义一组功能
必须要实现者给提供方法的实现(谁遵守谁提供方法)

接口的定义 命名规范:在名字前面添加I 在后面添加able

 例如:IUsbable
interface    接口名称{

} //像类一样定义,接口也会生成对应的字节码

接口是一个特殊的抽象类 内部的abstract 可以省略不写
如果没有在方法面前添加abstract 会在编译时自动添加上

interface IUsbable{
    //接口
     String name = "wzb";  //默认是  public static final 常量
     void trans();
     //public abstract void trans();
}

接口注意点
1.接口是没有构造器的,接口是不能创建对象的
2.接口当中定义变量,都是全局的静态常量
String name = "myxq";
通过反编译工具之后查看
public static final String name;
3.接口当中定义的方法都是公共的抽象的方法

void trans();
//public abstract void trans();

4.接口当中可以定义内部类,内部类也是public abstract
5.接口是可以继承的,他是可以多继承的
interface 接口名称 extends 继承的接口名,继承的接口名
类是不能多继承的
接口继承的时候,不会去覆盖父接口的方法

//爬行动物
interface IWorkable {
    // 接口
    void walk();

}

// 水生动物
interface ISwimable {
    void swim();
}

// 两栖动物
interface Iamphibiousable extends ISwimable, IWorkable {

}

接口的实现
类名 extends 其他的类(只能继承一个类) implements 接口(可以多个接口)

class Cat extends Animal implements IWorkable,ISwimable {}
猫类继承了动物类实现了 IWorkable ,ISwimable  多个接口

在是实现类当中必须得要去覆盖接口当中定义的方法
实现类的方法必须是public

        Cat cat= new Cat();
        cat.walk();
        
        interface IWolkable 接口也可以称为它的父类   父接口

        多态写法,把子类对象赋值给父类类型
        IWorkable cat1 = new Cat();//面向接口编程
        cat1.walk();         多态运行时表现出来的还是子类的特征  (编译时,看左边,运行时,看右边)

接口流程
1.创建接口规范
2.定义接口实现类
3.创建对象

接口与抽象类的区别
相同点:
1.都是被其他类实现或者被继承的(不然没有存在的意义)
2.都不能实例化
3.都可以定义抽象方法,定义的抽象方法必须得要覆盖.

不同点:
1.接口是没有构造器的,抽象类当中是有构造器的(有也不能实例化对象)
2.抽象类当中可以包含普通方法和抽象方法,接口当中只能有抽象方法,不能有普通方法(带有方法体)
3.接口当中默认成员变量,public static final 变量;静态常量 抽象类当中 默认是包访问权限
4.方法:接口当中默认方法 public abstract 方法名; 抽象类当中 默认权限

接口当中成员变量
interface IWalkable{
    String name ="wzb";
    void walk();
}
反编译之后
interface IWalkable
{
    public static final String name = "wzb";

    public abstract void walk();
}

面向接口编程
面向接口编程:把实现类对象赋值给接口类型的变量
多态的好处:屏蔽了不同类之间实现的差异,从而达到通用编程

//主板插入各种usb设备
interface Iusb {

    (public abstract ) void swpData();

}

class MotherBoard {

    void puluginIn(Iusb usb) {
        usb.swpData();
    }

}

class Mouse implements Iusb {
    public void swpData() {
        System.out.println("鼠标移动");
    }
}

class KeyBoard implements Iusb {
    public void swpData() {
        System.out.println("打字");
    }
}

public class Test {

    public static void main(String[] args) {

        Iusb k = new KeyBoard();

        Iusb m = new Mouse();

        MotherBoard b = new MotherBoard();
        b.puluginIn(m);
        b.puluginIn(k);
    }

}
上一篇下一篇

猜你喜欢

热点阅读