抽象类和接口

抽象类

抽象类的概念

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

抽象类语法

一个类被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. 抽象类接口都不能直接实例化对象,只能作为其他类的基类或实现类使用[^1]。 2. 抽象类接口都可以包含抽象方法,这些方法需要被子类或实现类覆写后才能使用[^4]。 3. 两者都位于继承结构的顶端,用于定义通用的行为或规范[^4]。 #### 区别 1. **继承关系** - 抽象类通过 `extends` 关键字进行继承,一个类只能继承一个抽象类。 - 接口通过 `implements` 关键字实现,一个类可以实现多个接口,这弥补了 Java 的单继承限制[^1]。 2. **实现细节** - 抽象类可以包含普通方法(即带有具体实现的方法)以及抽象方法,子类可以选择性地覆写这些方法。 - 接口在 JDK 8 之前只能包含抽象方法声明,在 JDK 8 及之后可以通过 `default` `static` 关键字提供默认实现或静态方法[^5]。 3. **成员变量** - 抽象类中可以有成员变量,并且其修饰符可以是任意类型(如 `private`、`protected` 等)。 - 接口中所有的变量默认是 `public static final` 类型,不能有普通的成员变量[^3]。 4. **多态性** - 由于 Java 的单继承限制,一个类只能继承一个抽象类,因此在设计灵活性上受到一定限制。 - 接口允许多个实现,一个类可以同时实现多个接口,从而提供更高的灵活性[^1]。 5. **设计目的** - 抽象类主要用于定义一种通用的类,其子类可以基于这个通用类进行扩展。 - 接口更多地用于定义一组规范,实现多种功能的类可以实现同一个接口。 6. **抽象类的特殊性** - 即使一个抽象类不包含任何抽象方法,也可以被定义为抽象类,目的是防止该类被直接实例化[^2]。 #### 示例代码 以下是一个简单的代码示例,展示抽象类接口的使用: ```java // 抽象类示例 abstract class Animal { // 普通方法 public void breathe() { System.out.println("Breathing..."); } // 抽象方法 public abstract void makeSound(); } // 接口示例 interface Swimmable { default void swim() { System.out.println("Swimming..."); } } // 子类实现 class Dog extends Animal implements Swimmable { @Override public void makeSound() { System.out.println("Barking..."); } } ```
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值