面向对象-抽象类与接口
抽象类-求图形面积
多个类,有相同的方法,可以抽出一个父类出来,把相同的方法放到父类当中
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);
}
}