接口、内部类

别说谁变了你拦得住时间么 提交于 2019-11-27 18:56:52

一、接口

接口是引用数据类型,关键字interface。一个类只能继承一个类使用extends,实现多个接口使用implements。继承在前,实现在后

1、接口的特性:[1]接口可以声明属性,且属性都是static final类型的。

        [2]接口中的方法都是public abstract 修饰的。

        [3]接口不能实例化。接口中不能定义构造方法。

        [4]接口可继承一个或多个其他接口,用extends关键字。

        [5] 一个类实现了A接口,必须实现A接口中所有抽象方法。其中该类称为A接口的实现类,使用关键字implement。

        [6] 接口约定了实现类必须具备的能力,同时也拓展了类的能力  => 实现类具有接口中定义的能力。=> 实现类 has a 接口

   注意:如果抽象类中抽象方法和接口中的抽象方法名称一样时,实现类实现的是抽象类中的抽象方法,实际开发过程尽量规避。

二、抽象类和接口

相同点:抽象类和接口都是引用数据类型,均包含抽象方法,都可以重写抽象方法,都可以实现多态,都具有传递性,它们都不能创建对象。

区别:1、接口中只能定义全局静态常量,不能定义变量。抽象类中可以定义常量和变量。

   2、接口中所有方法都是抽象方法。抽象类中可以有0个、1个、多个或全部都是抽象方法(可以有非抽象方法)。

   3、接口中不能定义构造方法。抽象类可以有构造方法,但不能用来实例化,子类实例化时,完成属于抽象类的初始化操作

   4、一个类只能继承一个抽象类,但可以继承多个接口。

   5、接口不要求实现类和接口在概念本质上一致,它们之间是一种“has-a的关系”,抽象类与子类在概念本质上是相同的,它们之间必存在“is-a”的关系

   6、抽象类和子类解决的是模块内的问题(代码重用,重写,多态),接口解决的是模块间的问题  => 高内聚,低耦合。

三、Object

java.lang.Object类的常用方法:1、public boolean equals(Object) 比较内容

              2、public native int hashCode() 哈希码

              3、public java.lang.String toString() 变成字符串

              4、public final native java.lang.Class getClass() 获取类结构信息

              5、protected void finalize() throws java.lang.Throwable 垃圾回收前执行的方法

              6、protected native Object clone() throws java.lang.CloneNotSupportedException 克隆

              7、public final void wait() throws java.lang.InterruptedException 多线程中等待功能

              8、public final native void notify() 多线程中唤醒功能

              9、public final native void notifyAll() 多线程中唤醒所有等待线程的功能

  Object 是所有类的直接或者间接父类,在java中称为根类。一个类如果没有显示继承一个类,那它一定继承Object类。

  toString() 用于输出对象的字符串形式。默认Object的toString方法输出对象类型@内存地址。一般子类重写toString()

四、==和euqals

==用于基本数据类型值或者两个对象地址是否相等,两个对象如果相等(==),一定是同一个对象,不能比较没有父子关系的两个对象

equals()用于判断两个对象指定内容是否相等:

  a) 系统类一般已经覆盖了equals(),比较的是内容。

  b) 用户自定义类若没有重写equals(),将调用父类的equals(Object),而Object的equals的比较是地址

  c) 用户自定义类需要重写父类的equals()

注意:Object的==和equals比较的都是地址,作用相同

五、内部类

一个类可定义在另一个类的内部,该类称内部类,另一个类称外部类。内部类作为外部类的一个成员而存在

内部类前可以添加必要的修饰符,不可用public。一般而言,采用默认修饰符。编译完成后的样式:Outer$Inner.class

内部类根据修饰符和定义的位置可以分为:成员内部类、静态内部类、方法内部类、匿名内部类。

  1、成员内部类:public class Outer{class Inner{public void a(){}}}

    Outer outer = new Outer();  Inner inner = outer.new Inner();  inner.a();

   内部类特性:[1]内部类可以直接访问外部类的私有成员。

         [2]内部类和外部内定义了同名的私有属性,以name为例。实际开发尽量规避。

     ①访问内部类的私有成员:在内部类中写name或this.name

     ②访问外部类的私有成员:Outer.this.name

  2、静态内部类:public class Outer{static class Inner{public void a(){}}}

    Inner inner =new Outer.Inner();  inner.a();

   静态内部类特性:[1]静态内部类可以直接访问外部类的静态成员。

         [2]内部类和外部内定义了同名的静态属性,以name为例。实际开发尽量规避。

     ①访问内部类的私有成员:在内部类中写name或Inner.name

     ②访问外部类的私有成员:Outer.name

  3、方法内部类:public class Outer{public void a(){class Inner{m方法};new Inner().m();}}若内部类的对象只用一次,使用匿名对象

   方法内部类特性:方法内部类可以直接访问方法的局部变量。不能在方法内部类中修改外部类方法的局部变量

  4、匿名内部类:匿名内部类一定存在实现(接口),以接口Myinterface为例

    public class Outer{public void a(){new MyInterface(){public void showInfo() {}}.showInfo();}}

    new匿名类表示构建了一个匿名对象,通过匿名对象调用接口中定义的方法。

六、Java垃圾回收机制

1、传统的C/C++语言,需要程序员负责回收已经分配内存。显式回收垃圾回收的缺点(Java可有效回避):

  ①程序忘记及时回收,从而导致内存泄露,降低系统性能。

  ②程序错误回收程序核心类库的内存,导致系统崩溃。

2、Java由JRE在后台自动回收不再使用的内存,称为垃圾回收机制,GC。

  除上述优点外,Java还有:① 可以提高编程效率。

              ② 保护程序的完整性。

              ③其开销影响性能。JVM必须跟踪程序中有用的对象,确定哪些是无用的。

3、垃圾回收机制gc的特点:

1) 垃圾回收机制回收JVM堆内存里的对象空间,不负责回收栈内存数据。

2) 对其他物理连接,比如数据库连接、输入流输出流、Socket连接无能为力。

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

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

5) 现在的JVM有多种垃圾回收实现算法,表现各异。

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

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

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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!