抽象类和接口--(语法和特性)

本文详细介绍了Java中的抽象类和接口的语法及特性。抽象类用于定义类的公共行为,不能直接实例化,其中抽象方法需由子类实现。接口则是一种完全抽象的类型,提供了一种多继承的机制,所有方法默认为public抽象方法。实现接口的类必须实现接口中所有的抽象方法。此外,还探讨了抽象类和接口在实际开发中的应用和选择。
摘要由CSDN通过智能技术生成

目录

  • 抽象类的语法和特性
  • 接口的语法和特性

1.抽象类的语法和特性

1.1.语法

1.在Java中,一个类如果被abstract 修饰称为抽象类,抽象类中被 abstract 修饰的方法称为抽象方法,抽象方法不用给出具体的实现体。

// 抽象类:被abstract修饰的类
public abstract class Shape { 
    // 抽象方法:被abstract修饰的方法,没有方法体 
    abstract public void draw(); 
    abstract void calcArea(); 

    // 抽象类也是类,也可以增加普通方法和属性,也可以包含构造方法
    public double getArea() { 
        return area; 
    }
    protected double area; // 面积 
}

1.2特性

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

Shape shape = new Shape(); 

// 编译出错 -> 抽象类不能被实例化

2. 抽象方法不能是 private 的

abstract class Shape { 
    abstract private void draw(); 
}

// 编译出错 -> 抽象方法不能用private修饰

注意:抽象方法没有加访问限定符时,默认是public.


3. 抽象方法不能被 final static 修饰,因为抽象方法就是用来被子类重写的,两者是”天敌“;
public abstract class Shape { 
    abstract final void methodA(); 
    abstract public static void methodB(); 
}

// 编译报错: final和static修饰抽象方法,会出问题,二者属于”天敌“

4. 抽象类必须被继承,并且继承后子类要重写父类中的抽象方法,否则子类也是抽象类,必须要        使用 abstract 修饰,,,
abstract class Shape {
    abstract void draw();
    abstract public void calcArea();
}

//1.实现抽象方法
class Cycle extends Shape {

    @Override
    void draw() {
        System.out.println("●");
    }

    @Override
    public void calcArea() {
        System.out.println("Π*r*r");
    }
}
//2.不实现抽象父类的抽象方法,但是将子类也定义为抽象类
abstract class Triangle extends Shape {
    
}
5. 抽象类中不一定包含抽象方法,但是有抽象方法的类一定是抽象类
6. 抽象类中可以有构造方法,供子类创建对象时,初始化父类的成员变量

2.接口的语法和使用

2.1语法

1.接口的定义格式与类的定义差不多,只要把class改成interface关键字即可。

public interface IOperation {
    public abstract void method1();
    
    public void method2();
    
    abstract void method3();
    
    void method4();
}

接口名的的注意事项:1.接口的命名一般以大写的 "I" 开头;2.接口的名字一般使用形容词性单词

 推荐:阿里编码规范中约定, 接口中的方法和属性不要加任何修饰符号, 保持代码的简洁性。


2.2特性

1.接口不能直接使用,必须要被一个类来 "实现",并且这个类要实现这个接口中的所有抽象方法 

public interface IOperation {
    public abstract void method1();

    abstract void method2();
}

class A implements IOperation {

    //如果不重写接口中的抽象方法,代码在编译期间就会报错
    //如果不想重写,那么这个类一定是抽象类

    @Override
    public void method1() {
        
    }

    @Override
    public void method2() {

    }
}

  2.接口与接口之间是继承(extends)关系,类与接口之间是实现关系(implements)关系

public interface IOperation {
    
}
class A implements IOperation {
    
}
interface Io extends IOperation {
    
}

3.接口类型是一种引用类型,不能实例化对象

4.接口中每一个方法都是public的抽象方法, 即接口中的方法会被隐式的指定为 public                 abstract(只能是public abstract,其他修饰符都会报错)

public interface IOperation {
    private void method() {

    }
    //编译报错
}

 5. 接口中的方法是不能在接口中实现的,只能由实现接口的类来实现

public interface IOperation {
   void method();

   //编译报错:接口中的方法不能自己实现
   public abstract void A() {
       
   }
}
6.   重写接口中方法时,不能使用 default 访问权限修饰
7. 接口中可以含有变量,但是接口中的变量会被隐式的指定为 public static final 变量,不能改变
interface IA{
    double a = 3.0; // 默认被:final public static修饰
}

public class TestDemo {
    public static void main(String[] args) {
        System.out.println(IA.a); // 可以直接通过接口名访问,说明是静态的
        
        //编译报错
        IA.a = 2.0; // 说明brand具有final属性
    }
}

8. 接口中不能有静态代码块和构造方法
interface USB {
    // 编译失败:接口中不能有构造方法
    public USB(){

    }

    {} // 编译失败:接口中不能有实例代码块
    void openDevice();
    void closeDevice();
}
/**
 * 本篇完!!!谢谢观看
 */
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Master_hl

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值