Java 抽象类与接口

一、抽象类

在Java语言中,使用 abstract  class 来定义抽象类:

/**
 * 定义一个抽象类
 * @author Administrator
 *
 */
public abstract class Demo {

}
  • 尽管Demo类是抽象类,但是它仍然可以有成员变量,成员方法和构造方法
  • 抽象类不能被实例化
  • 抽象类可以被继承

抽象方法:

  使用abstract 来声明抽象方法,抽象方法只包含一个方法名。且没有方法体。

声明抽象方法会造成以下两个结果:

  • 如果一个类包含抽象方法,那么该类必须是抽象类。
  • 任何子类必须重写父类的抽象方法,或者声明自身为抽象类。

继承抽象方法的子类必须重写该方法。否则,该子类也必须声明为抽象类。最终,必须有子类实现该抽象方法,否则,从最初的父类到最终的子类都不能用来实例化对象

 

/**
 * 定义一个抽象类
 * @author Administrator
 *
 */
public abstract class Demo {
    
    public String name;        //抽象类中的成员变量
    public String sex;
    public int age;
    
    /**
     * 抽象类的构造方法
     */
    public Demo(){
        
    }
    
    /**
     * 抽象类中的成员方法
     */
    public void fun(){
        System.out.println("我是抽象类中的成员方法");
    }
    
    /**
     *     抽象方法
     *     使用abstract声明
     *     没有方法体
     */
    public abstract void funtion();
}    

抽象类总结规定:

  1. 抽象类不能被实例化(初学者很容易犯的错),如果被实例化,就会报错,编译无法通过,只有抽象类的非抽象子类可以创建对象。

  2. 抽象类中不一定包含抽象方法,但是有抽象方法的类必定是抽象类。

  3. 抽象类中的抽象方法只是声明,不包含方法体,就是不给出方法的具体实现也就是方法的具体功能。

  4. 构造方法,类方法(用 static 修饰的方法)不能声明为抽象方法。

  5. 抽象类的子类必须给出抽象类中的抽象方法的具体实现,除非该子类也是抽象类

二、接口

接口定义的语法格式如下:

  [访问控制修饰符] interface 接口名 [ extends 接口列表]{

    常量

    抽象方法

  }

/**
 * 定义一个借口
 * @author Administrator
 *
 */
public interface Interface {
    
        public String name = "abc";        //接口中的常量
        public int age = 18;
        
        /**
         *     接口中的抽象方法
         *     接口中定义抽象方法可以不写abstract
         */
        public void fun();
}

 访问控制修饰符的要求与类的一致,只能使用public和default(在使用default时,访问控制修饰符不填写)

  •   使用public进行修饰表示该接口为公共接口,可以被任意一个类所使用
  •   不加访问控制修饰符进行修饰则表示此接口为友好接口,友好接口只能被同一个包中的类所使用

 interface为关键字,只有使用了interface,程序才认为这是接口

 接口名同标识符

  接口也是可以继承的,其语法与类的继承是一样的

  与类继承的区别在于一个接口可以有多个父接口,这些父接口之间用逗号“ , ”隔开,形成父接口列表

接口的特性:

  •   接口不可以被实例化
  •   实现类必须实现接口的所有方法
  •   实现类可以实现多个接口
  •   接口中的变量都是静态常量

接口的作用:

  •   接口的主要作用就是将程序中的“ 实现什么功能 ” 和 “ 怎么实现功能 ” 这两个概念分离开,这样编写出来的程序是可以拆分的,增强了程序的可维护性
  •   另一个作用主要体现在团队合作上,准确的进行项目的开发

 三、关键字final

final 可以用来修饰类,变量,方法  

  final 修饰的类不能有子类,也不能被继承

  final 修饰的变量是一个常量,不能重新赋值,且定义时必须赋值

  final 修饰的方法不能重写

/**
 * final 修饰类
 * @author Administrator
 *
 */
public final class Abc {
    
    public final String name = "sunny";        //final 修饰变量
    public final int age = 18;
    
    /**
     * final修饰方法
     */
    public final void fun(){
        
    }
}
原文地址:https://www.cnblogs.com/sloth-007/p/10639085.html