Java:抽象类、接口

抽象类

语法规则

     没有实际工作的方法, 我们可以把它设计成一个 抽象方法(abstract method), 包含抽象方法的类我们称为 抽象类(abstract class)。

//示例1
abstract class Shape{
    public abstract void draw();
}
  • 在 Shape 方法前加上 abstract 关键字, 表示这是一个抽象方法,同时抽象方法没有方法体  (没有 { }, 不能执行具体 代码)。
  • 对于包含抽象方法的类, 必须加上 abstract 关键字表示这是一个抽象类。

注意事项

1) 抽象类不能直接实例化【Shape s=new Shape( );此时这种写法错误】

2) 抽象方法不能是 private 的,因为抽象类存在的最大意义就是为了被继承;抽象方法要被子类重写。(abstract private void draw();这种写法错误)

3) 抽象类中可以包含其他的非抽象方法, 也可以包含字段,这个非抽象方法和普通方法的规则都是一样的, 可以被重写, 也可以被子类直接调用。

//示例2:对于示例1类中以下定义都是可以的
abstract class Shape{
    public int age;//普通实例成员变量
    public static int count;//静态成员变量

    public abstract void draw();//抽象方法

    public void func(){//普通成员方法
        
    }
}

4)抽象类是可以被继承的,可以发生向上转型的;

//示例3:对于示例1,如下操作均可(继承、向上转型)
abstract class Shape{
    public abstract void draw();
}
class Rect extends Shape{
    @Override
    public void draw() {
        System.out.println("♦");
    }
}
public class TestDemo {
    public static void drawMap(Shape s){
        s.draw();
    }

    public static void main(String[] args) {
        drawMap(new Rect());
    }
}
//♦

5)当一个普通类继承了一个抽象类,那么注意,当前这个普通类一定要重弄写抽象类中的抽象方法;(但要注意重写的注意事项)

重写的注意事项:

权限大小:private <  default < protected < public

  • 子类的访问权限一定要大于等于父类的访问权限
  • 要重写的方法一定不可以是static方法
  • 要重写的方法一定不可以被final修饰

6)当普通类(Rect类)继承了抽象类(Shape类),但不想实现抽象类中的抽象方法时,这个普通类可被修改为抽象类,此时就可以不用实现当然也可以实现。

7. 对于  6)追加且与 5)对应,如果一个普通类 又 继承了刚才修改为抽象类的类(上述的Rect类),此时就必须要实现这个抽象方法了。(典型的,出来混总要还的......普通类来还)

8)抽象类存在的最大意义就是为了被继承。

接口

  •     接口是抽象类的更进一步,抽象类中还可以包含非抽象方法和字段.而接口中包含的方法都是抽象方法, 字段只能包含 静态常量。
  •    接口的存在解决了Java多继承的问题;
  •    继承表达的含义是 is - a 语义, 而接口表达的含义是 具有 xxx 特性

注:

  • 使用 interface 定义一个接口
  • 接口中的方法没有方法体  ( 没有 { }, 不能执行具体 代码 )。
  • 接口当中的方法,默认是:public abstract   ;
public abstract void draw();  可直接写为   void draw();
  • 接口当中的成员变量,默认是  public static final ,定义时必须初始化;
public static final int age=10; 可直接写为 int age=10;
  • JDK1.8引入新的特性。default 修饰的方法即默认方法,可以有具体实现。
//示例1
interface IShape{
    void draw();
    int age=10;
    
    //默认方法
    default void func(){
        System.out.println("❀");
    }
}
  • 接口不能单独被实例化。(   IShape ishape=new IShape();  这时是错误的 )
  • 使用 implements 继承接口,此时表达的含义不再是 "扩展",而是 "实现" 在调用的时候同样可以创建一个接口的引用, 对应到一个子类的实例。
//示例2:创建一个接口的引用ishape
//调用方法drawMap联系到向上转型发生动态绑定等
interface IShape{
    void draw();

}
class Rect implements IShape{

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

public class TestDemo {
    public static void drawMap(IShape s){
        s.draw();
    }
    public static void main(String[] args) {
        IShape ishape=new Rect();//向上转型
        drawMap(ishape);
     }
}
//♦
  • 有的时候我们需要让一个类同时继承自多个父类. 这件事情在有些编程语言通过 多继承 的方式来实现的. 然而 Java 中只支持单继承, 一个类只能 extends 一个父类,但是可以同时实现多个接口, 也能达到多继承类似的效果
  • 一个类可以实现多个接口;如:
    class Test implements A,B,C//这个普通类每次引入一个接口都要重写接口里的方法

  • 一个类可以继承一个类同时实现多个接口。如:
    class Test extends TestAbstract implements A,B//这个普通类每引入一个接口都要重写接口里的方法,Test类在继承抽象类TestAbstract同时实现了两个接口A,B(当然这个类不一定要是抽象类,普通类也可,但是注意只能继承一个类)。
interface A{
    void A();
}
interface B{
    void B();
}
abstract class TestAbstract{//这是一个抽象类
    public abstract void funcAbstract();
}
//Test类在继承抽象类TestAbstract同时实现了两个接口A,B
//当然这个类不一定要是抽象类,普通类也可,但是注意只能继承一个类
 class Test extends TestAbstract implements A,B{
     @Override
     public void A() {
      //注意接口中的方法默认都是public ,不写的话默认是包访问权限,子类重写方法访问权限要大于等于父类
     }
     @Override
     public void B() {
     }
    @Override
    public void funcAbstract() {
    }
}
  • 接口可以扩展一个或多个接口,如:
interface D extends A,B;
interface A{
    void A();
}
interface B{
    void B();
}
interface C extends A{//接口C扩展接口A
    void C();
}//此时接口C里,不仅有方法C(),也有A()
interface D extends A,B{
    void D();
}//也可以扩展多个,此时接口D里有方法D(),A(),B()
//此时让一个类去implements D,就需要重写方法D(),A(),B(),也验证了接口D里有方法D(),A(),B()
class TestNormal implements D{
    @Override
    public void A() {
    }
    @Override
    public void B() {
    }
    @Override
    public void D() {
    }
}

提示:

1. 我们创建接口的时候, 接口的命名一般以大写字母 I 开头.

2. 接口的命名一般使用 "形容词" 词性的单词.

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

注意一个错误写法:

interface IShape {
 void draw() ; // 即便不写public,也是public,完整为public abstract void draw()
}
class Rect implements IShape {
 void draw() {
   //注意接口中的方法默认都是public ,不写的话默认是包访问权限,子类重写方法访问权限要大于等于父类
 }
} 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值