您的位置:首页 > 编程语言 > Java开发

接口与内部类

2017-03-12 20:17 134 查看
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.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Java 接口 内部类