final、static、abstract修饰符以及Interface接口

final可以修饰的元素的特点

final可以修饰:类、变量、方法

  1. 当final修饰类的时候,说明该类不能被继承。
  2. 当final修饰方法的时候,说明该方法不能被重写。
  3. 当final修饰成员变量时,有两种情况:
  • 如果修饰的是基本类型,说明这个变量的所代表数值永不能变(不能重新赋值)。
  • 如果修饰的是引用类型,该变量的引用不能变(即地址值不能改变),但引用所代表的对象内容是可变的(即该地址指向的对象中内容可变)。

 


 

static 声明的元素的特点

  1. 当成员被静态修饰后,除了可以被对象调用外,还可以直接被类名调用:类名.静态成员
  2. 静态成员随着类的加载而加载。
  3. 静态成员优先于对象存在
  4. 静态成员被所有对象所共享。
  5. 静态方法只能访问静态成员, 非静态方法既可以访问静态又可以访问非静态。
  6. 静态方法中不可以定义this,super关键字(因为this代表是对象,而静态存在时,有可能没有对象,况且静态优先于对象存在,所以静态方法运行时,this是没有任何对象代表的。简单说,先进内存的数据不可以访问后进内存的数据,可是后进内存数据可以访问先进内存的数据)。

静态变量与实例变量的区别:

  • 静态变量也称为类变量,也就是直接可以被类名调用的变量,这个变量是所属于类的;

    非静态变量称为成员变量,或者实例变量,是被对象调用的,是所属具体对象的。

  • 静态变量随着类的加载而加载,也意味着随着类的消失而消失,生命周期最长;

    实例变量,随着对象的创建而加载,随着对象的消失而消失,按照对象的生命周期而存在。

  • 静态变量存储在方法区的静态区中;

    实例变量存在于对象所属的堆内存中。

  • 静态变量数据,被所有对象所共享;

    实例变量是对象中的特有数据。

 


 

abstract修饰的元素的特点

  abstract一般用来修饰类和方法

abstract修饰类

  abstract修饰类,会使得类变成抽象类,抽象类不能生成实例,但是可以作为对象变量声明的类型,也就是编译时类型。

注意事项:
  1. 抽象类虽然不能实例化,但是有自己的构造方法。
  2. 抽象类和接口(interface)有很大的不同之处,接口中不能有实例方法去实现业务逻辑,而抽象类可以有实例方法,并实现业务逻辑。
  3. 抽象类不能被final修饰,因为被final修饰的类无法被继承,而抽象类需要通过继承去实现抽象方法(需要子类继承并覆盖其中的方法)。

abstract修饰方法

  abstract修饰方法会使得这个方法变成抽象方法,也就是只有声明,而没有实现,需要子类重写。

注意事项:

  1. 有抽象方法类一定是抽象类,但是抽象类不一定有抽象方法。
  2. 父类是抽象类,其中有抽象方法,那么子类继承父类,并把父类中的所有抽象方法都实现了,子类才有创建对象实例的能力,否则子类也必须是抽象类。
  3. 抽象类中可以有构造方法,子类在构造子类对象时需要调用父类(抽象类)的构造方法。
  4. 抽象方法不能用private修饰,因为抽象方法必须被子类重写,而private权限对于子类来说是不能访问的,所以会产生矛盾。
  5. 抽象方法也不能用static修饰,如果用static修饰,就可以直接通过类名调用,而抽象方法压根没有主体,这么做毫无意义。

 


 

Interface的定义与作用

  接口是抽象方法与全局常量的集合。子类实现接口时,用关键字implements实现。

注意事项:
  1. 接口中所有方法都必须是抽象的,默认修饰符:public abstract
  2. 接口中的成员变量默认修饰符:public static final
  3. 子类可以实现多个接口,同时要覆写接口父类中的所有抽象方法
  4. 接口可继承接口(可多继承)。
  5. 接口无法直接实例化对象,只能通过子类实现。
  6. 接口可向上转型成它的任意接口类型。
  7. 接口中没有构造方法,因为接口中所有方法都是抽象方法。
  8. 接口中只允许public权限(属性、方法),可直接省略不写。
  9. 接口不可实例化但可作为类型引用

 


 

 

总结:abstract和接口的区别

  1. 抽象类中可以有普通成员变量,接口中没有普通成员变量。
  2. 抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以是任意的,但是接口中定义的变量只能是public static final类型,且默认为public static final类型。
  3. 抽象类可以有构造方法,接口中不能有构造方法。
  4. 抽象类中抽象方法的访问类型可以是public、protected,但是接口中的抽象方法只能是public类型的,并且默认为public abstract类型的。
  5. 一个类可以实现多个接口,但是只能继承一个抽象类。

 

posted @ 2020-10-27 20:46  A_xiba  阅读(316)  评论(0编辑  收藏  举报