接口与内部类

    xiaoxiao2021-03-25  62

    1, 接口(interface):广义上对外提供规则的都是接口,接口降低了耦合性,增加了扩展。 <1>接口方法都是抽象方法,接口不可实例化,可以参照多态,使用子类进行实例化。接口与类之间是implements关系。接口的子类:可以是抽象类,但没有意义。建议重写所有抽象方法。 <2>接口成员: 成员变量只能是常量,且是静态并公共的。默认修饰符为public static final接口没有构造方法。成员方法只能是抽象方法。默认修饰符:public abstract。 <3>抽象类与接口: 共性:都是不断向上抽取的结果。 抽象类:一般用于描述一个体系单元,将一组共性内容进行抽取,特点:可以在类中定义抽象内容让子类实现,可以定义非抽象内容让子类直接使用。它里面定义的都是一些体系中的基本内容。抽象类体现的是共性功能,体现“is a”关系。抽象类只能被单继承。 接口:一般用于定义对象的扩展功能,是在继承之外还需这个对象具备的一些功能。接口中都有抽象方法,需要子类去实现。接口体现的是扩展功能,体现“like a”关系。接口需要被实现,而且可以多实现。接口中的成员修饰符是固定的,全都是public,而抽象类的成员修饰符可以自定义。

    2, 内部类:使用内部类可以把有相互关系的接口和类放到一起,提高程序的可读性和维护性. <1>内部类可以直接访问外部类,包括其私有成员。外部类要访问内部类,必须建立内部类对象.方式如下:

    Outer.Inner oi = new Outer().new Inner();

    也可以在外部类的方法中创建内部类对象,外部类通过调用自己的成员方法,访问内部类。

    <2>私有修饰符: 通常内部类被封装,都会被私有化,因为封装性不让其他程序直接访问。

    <3>静态修饰符: 如果内部类被静态修饰,相当于外部类,会出现访问局限性,只能访问外部类中的静态成员。注意;如果内部类中定义了静态成员,那么该内部类必须是静态的。静态时,建立内部类对象方式如下:

    Outer.Inner oi = new Outer. Inner();

    <4>内部类编译后的文件名为:“外部类名$内部类名.java”。内部类可以直接访问外部类中的成员。因为内部中都持有一个外部类的引用。这个是引用是 外部类名.this.

    <5>内部类可以定义在外部类中的成员位置上,也可以定义在外部类中的局部位置上。这时要访问局部内部类,需要在局部方法中新建内部类对象。当内部类被定义在局部方法内时,只能访问局部方法中被final修饰的局部变量。因为如果不加final,局部变量生命周期和相关方法周期是一致的,如果方法弹栈,内部类就无法使用相关变量,加final后,变量进常量池,延长了变量的生命周期,内部类可以调用到。

    <6>匿名内部类:继承一个类或实现一个接口,没有名字。

    匿名内部类的格式: new 父类名&接口名(){ 定义子类成员或者覆盖父类方法 }.方法。 New Inter(){}表示实现接口。如果实现了接口,再重写Inter抽象方法,那么就相当于Inter接口的子类对象. 匿名内部类的使用场景:在创建匿名内部类时,该类中的封装的方法不要过多,最好两个或者两个以内。

    <6-1>匿名内部类的当做参数传递

    public class Demo { public static void main(String[] args) { PersonDemo pd = new PersonDemo(); //继承了Person类,重写了抽象方法,相当于person的子类 pd.method(new Person() { public void show() { System.out.println("show"); } }); } } //这里写抽象类,接口都行 abstract class Person { public abstract void show(); } /* 父类引用指向子类对象,调用父类show方法,实际执行子类的show方法; Person = new Person() { public void show() { System.out.println("show"); } }; */ class PersonDemo { public void method(Person p) { p.show(); } }

    试题:要求控制台输出hello world

    class Test2 { public static void main(String[] args) { Outer.method().show();//说明Outer.method()返回一个对象 //相当于Inter i = Outer.method( );i.show } } interface Inter { void show(); } class Outer { public static Inter method() { return new Inter() { //返回Inter子类对象 public void show() { System.out.println("hello world"); } };//相当于创建Inter子类对象 } }

    <6-3>最近在学习集合框架,在学习TreeSet集合时需要重写Comparator中的比较方法,为了方便,使用了局部内部类,这种写法确实比较优雅,给人一种封装的感觉。

    TreeSet<Student> ts = new TreeSet<>(new Comparator<Student>() { // 重写compare方法,定义比较方式 @Override public int compare(Student o1, Student o2) { int num = o2.getSum() - o1.getSum(); return num == 0 ? 1 : num; } });

    You may say I am a dreamer, but I am not the only one. I hope someday you’ll join us. And the world will live as one.

    转载请注明原文地址: https://ju.6miu.com/read-36031.html

    最新回复(0)