8 面向对象之抽象类+接口+内部类

1 final关键字

   用法:

  1)使用final修饰变量,该变量就变成常量,在运行的过程中无法重新赋值。

    2)使用final修饰方法,该方法无法在子类中重写

    3)使用final修饰的类,不能被继承(派生其他子类)

  JDK中常见的final修饰的类: java.lang.Math   java.lang.String

2 抽象类和抽象方法

  抽象方法:使用abstract修饰的方法。特征: 没有方法体。

  抽象类:使用abstract修饰的类。

 特点:

  1)抽象类中可以包含抽象方法。包含抽象方法的类一定是抽象类,但抽象类中不一定包含抽象方法。

  2)抽象类中可以存在属性,方法,构造方法。

  3)抽象类不能实例化(不能使用new关键字创建对象),但可以在子类调用构造方法。

  作用: 通过抽象类,可以避免子类设计的随意性。

  抽象类就是为被继承而生的。子类一旦继承了抽象类,就必须重写抽象类中的抽象方法,或者子类本身也是一个抽象类。

3 设计模式

   1)单例模式

  单例模式:保证一个类只能有一个实例。

  特征:构造方法私有化,提供一个静态的方法获取实例

  常见的实现方法: ①饿汉式:使用时再创建对象。②懒汉式:加载时创建对象。

   2)简单工厂模式

  简单工厂模式又叫静态工厂方法,可以通过其生成产品,可以降低因生成生成产品而导致的耦合性过强。(解耦合)

  工厂模式的命名:xxxFactory--->生成xxx

   如何实现工厂模式:

   1.编写父类和子类或接口和实现类

   2.编写静态的工厂方法,返回值类型为父类或接口。--->多态

   3.根据用户的需求动态创建子类的实例,并返回。

4 接口

4.1接口定义和特点

  定义: 使用interface关键字

    [修饰符] interface 接口名 [extends 父接口1,父接口2...]{

       //常量的声明

       //方法的声明

     }

   接口成员的特点:

   1)接口中所有的成员变量是常量,默认修饰符为public static final

   2)接口中所有的方法都是抽象方法,默认修饰符为:public abstract

   3)接口不能实例化,接口不能构造方法(抽象类不能实例化,但可以有构造方法)

   4)java类是单继承,但接口可以是多继承

   5)一个非抽象类实现实现接口,必须重写接口中的抽象方法,抽象类实现接口可以重写部分抽象方法。

   6)一个类只能继承一个父类,但可以实现多个接口

  如果一个类继承父类并实现了接口如何编写?

     [修饰符] class 类名 [extends 父类名 implements 接口名1,接口名2..]{

     }

      public class E extends D implements A,B{

     }

4.2 Comparable接口

  java.lang.Comparable接口:此接口强行对实现它的每个类的对象进行整体排序。

  排序规则在compareTo()方法中定义。当调用java.util.Arrays类中sort(Object[] objs)时,程序会调用compareTo()方法对对象进行比较,

  如果该方法返回正整数(1)时,代表当前对象大于待比较对象;如果返回0,代表当前对象等于待比较对象;如果该方法返回负整数(-1)时,代表当前对象小于待比较对象。

  实现思路:

  1)实现Comparable接口,并重新其compareTo方法

  2)compareTo方法中定义比较规则。返回值应该是正整数,零和负整数。

  3)在调用Arrays.sort(Object[] objs)方法的过程中,sort方法的内部对调用compareTo方法进行比较。

4.3 Comparator接口

    java.util.Comparator接口:比较器

  int compare(Object o1, Object o2):比较用来排序的两个参数。根据第一个参数小于、等于或大于第二个参数分别返回负整数、零或正整数。

  java.util.Arrayssort(Object[] objs,Comparator c):按照指定的比较器对指定数组进行排序。

5 内部类

  定义:将一个类定义置入另一个类定义中就叫作“内部类”

    特点:

  1)内部类可以访问外部的成员,但外部类不能访问内部的成员。

    2)外部类的修饰符只有两种:public和默认,而内部类的修饰符可以是public,protected,默认,private

    3)内部类成员只有在内部类的范围之内是有效的。

    4)用内部类定义在外部类中不可访问的属性。这样就在外部类中实现了比外部类的private还要小的访问权限。

  内部类的分类:成员内部类,静态内部类,方法内部类,匿名类。

  成员内部类:将一个类作为另外一个类的成员。

  静态内部类:使用static修饰的内部类。静态内部只能访问外部的静态成员。

  方法内部类:在方法中定义的内部类。如果方法内部类中需要访问方法中局部变量,该局部变量必须使用final修饰。

  匿名内部类:没有名称的内部类,可以实现一个接口或继承一个父类。适合创建那种只需要一次使用的类,不能重复使用。匿名内部类要使用外部类的局部变量,必须使用final修饰该局部变量。

6 java垃圾回收机制

  Java语言不需要程序员直接控制内存回收,是由JRE在后台自动回收不再使用的内存,程序员无法精确控制,称为垃圾回收机制(Garbage Collection)

  GC机制的优点:

  1)提高编程效率,摈弃了C/C++中的指针,避免因遗忘释放内存而导致的内存泄漏。

  2)保证了程序的完整性。

  3)降低性能开销。

  GC原理:JVM中有一个线程专门用于回收堆内存中不使用对象,常用的方法:

  1)定时扫描堆中不使用的对象

  2)通过计数控制回收时机。

  垃圾回收机制只回收JVM堆内存里的对象空间,对其他物理连接,比如数据库连接、输入流输出流、Socket连接无能为力。

  垃圾回收发生具有不可预知性,程序无法精确控制垃圾回收机制执行。

  可以将对象的引用变量设置为null,暗示垃圾回收机制可以回收该对象。

  程序员可以通过System.gc()或者Runtime.getRuntime().gc()来通知系统进行垃圾回收,会有一些效果,但是系统是否进行垃圾回收依然不确定。

垃圾回收机制回收任何对象之前,总会先调用它的finalize方法(如果覆盖该方法,让一个新的引用变量重新引用该对象,则会重新激活对象)。

  永远不要主动调用某个对象的finalize方法,应该交给垃圾回收机制调用。

posted @ 2017-06-10 15:25  Nicepanda  阅读(194)  评论(0编辑  收藏  举报