抽象类和接口

抽象类

抽象类的概念

一个类没有包含足够多的信息来描述一个具体的对象

抽象类语法

一个类被abstract修饰成为抽象类,抽象类中被abstrsct修饰的成员方法成为抽象方法,抽象方法不能有具体的实现体。

eg.

//抽象类:被abstract修饰的类
public abstract class Shape{
   abstract public void draw();
   abstract void make();
//抽象类中也可以有普通的方法和属性
   publlic int getArea(){
      return  area;
  }
  
}

注意:抽象类也是类,抽象类内部也可以包含普通方法和属性。

抽象类特性

1.抽象类不能直接实例化对象

Shape shape = new Shape();
//编译错误

2.抽象方法不能是private的。

3.抽象方法不能被final和static修饰,因为抽象方法要被子类重写

4.抽象类必须被继承,并且继承后子类要重写父类中的抽象方法,不重写父类抽象方法的话子类也要是抽象类,要被abstract修饰,否则会报错

5.抽象类中不一定包含抽象方法,但是包含抽象方法的类一定是抽象类

6.抽象类中可以有构造方法,供子类创建对象时,初始化父类的成员变量

接口

接口的概念

在java中,接口可以看作是多个类的公共规范,是一种引用数据类型

语法规则

接口的定义格式

public interface IA{
//public abstract 是固定搭配默认就是这个可以省略不写
  public abstract void method();
  void method2();
}

创建接口时,接口的命名一般以I开头

接口的使用

使用接口时使用关键字implements实现

public class Shape implements IA{
  //.....
}

接口的特性

1.接口类型是一种引用类型,不能直接new一个接口对象。

public class TestUSB {
public static void main(String[] args) {
USB usb = new USB();
  }
}
//USB是抽象的,无法实例化

2.接口中的每一个方法都是public 的抽象方法,所以接口中的方法都会默认被public abstract 修饰

使用其他修饰符都会报错。

public interface USB {
// Error:(4, 18) java: 此处不允许使用修饰符private
private void openDevice();
void closeDevice();
}

3.接口中的方法不能再接口中实现,只能由实现接口的类来实现。

public interface USB {
void openDevice();
// 编译失败:因为接口中的方式默认为抽象方法
// Error:(5, 23) java: 接口抽象方法不能带有主体
void closeDevice(){
System.out.println("关闭USB设备");
  }
}

4.重写接口中的方法时,不能使用默认的访问权限

public interface USB {
void openDevice(); // 默认是public的
void closeDevice(); // 默认是public的
}
public class Mouse implements USB {
@Override
void openDevice() {
System.out.println("打开鼠标");
    }
// ...
}
// 编译报错,重写USB中openDevice方法时,不能使用默认修饰符
// 正在尝试分配更低的访问权限; 以前为public

5.接口中含有的变量默认是被public static final修饰

public interface USB {
double brand = 3.0; // 默认被:final public static修饰
void openDevice();
void closeDevice();
}
public class TestUSB {
public static void main(String[] args) {
System.out.println(USB.brand); // 可以直接通过接口名访问,说明是静态的
// 编译报错:Error:(12, 12) java: 无法为最终变量brand分配值
USB.brand = 2.0; // 说明brand具有final属性  不是变量而是一个常量
  }
}

6.接口中不能有静态代码块和构造方法。

7.如果类没有实现接口中的所有抽象方法,则类必须设置成抽象类

实现多个接口

在java中不能实现多继承,但是可以实现多个接口

注意:一个类在实现多个接口时,每个接口中的抽象方法都要重写,否则类必须设置成抽象类

class Animal {
protected String name;
public Animal(String name) {
this.name = name;
 }
}
interface IFlying {
void fly();
}
interface IRunning {
void run();
}
interface ISwimming {
void swim();
}
//猫是会跑的
class Cat extends Animal implements IRunning {
public Cat(String name) {
super(name);
}
@Override
public void run() {
System.out.println(this.name + "正在用四条腿跑");
}
}
//青蛙既能跑,又能游泳
class Frog extends Animal implements IRunning, ISwimming {
public Frog(String name) {
super(name);
}
@Override
public void run() {
System.out.println(this.name + "正在往前跳");
}
@Override
public void swim() {
System.out.println(this.name + "正在蹬腿游泳");
}
}

一个类继承一个父类,同时实现多种接口

继承表达的含义是is  a语义,而接口表达的含义是具有xxx特性

接口间的继承

在java中,类与类之间是单继承,一个类可以实现多个接口,接口与接口之间可以多继承

用接口可以达到多继承的目的。

接口继承一个接口达到复用的效果,用extends关键字实现。

interface IRunning {
void run();
}
interface ISwimming {
void swim();
}
// 两栖的动物, 既能跑, 也能游
interface IAmphibious extends IRunning, ISwimming {
}
class Frog implements IAmphibious {
...
}

接口使用的实例

给对象数组排序

class Student implements Comparable{
    public String name;
    public int score;
   //提供构造方法
    public Student(String name, int sore) {
        this.name = name;
        this.score = sore;
    }

    @Override
    public String toString() {
        return "[" + this.name + ":" + this.score + "]";
    }

    @Override
    public int compareTo(Object o) {
        Student s=(Student)o;
        if(this.score>s.score)
         return -1;
        else if(this.score<s.score)
            return  1;
        else
            return 0;
    }
}

public class Test {
    //给定一个学生对象数组
    Student[] students = new Student[]{
            new Student("张三",95),
            new Student("李四",80),
            new Student("王五",97),
            new Student("大婷",100)

    };
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值