大家面试的时候肯定被问过java 接口、抽象类、类、内部类、匿名内部类的区别及它们之间的关系。那么下面我就来整理下它们之间的关系。(主要是总结了下网上的资料,不是自己原创的。)总结的不好,请勿喷。^_^
java 接口:
[修饰符] interface 接口名 [extends 父接口名列表]{
[public] [static] [final] 常量;[public] [abstract] 方法;
}
修饰符:可选,用于指定接口的访问权限,可选值为public。如果省略则使用默认的访问权限。
接口名:必选参数,用于指定接口的名称,接口名必须是合法的Java标识符。一般情况下,要求首字母大写。(个人习惯:在接口类名前先写一个I_后面跟着接口名称)
extends 父接口名列表:可选参数,用于指定要定义的接口继承于哪个父接口。当使用extends关键字时,父接口名为必选参数。
方法:接口中的方法只有定义而没有被实现。
接口中可以定义变量和方法,但是一般人不会在接口中定义变量,因为在接口中定义的变量会被隐式的定义为public static final变量(并且只能是public static final变量,用private修饰会报编译错误),而方法会被隐式地指定为public abstract方法且只能是public abstract方法(用其他关键字,比如private、protected、static、 final等修饰会报编译错误)。说java接口中的方法必须是抽象方法。如果接口中存在非抽象方法,编译器会编译不过去,就会报错。并且接口中所有的方法不能有具体的实现。说java接口中的方法必须是抽象方法。如果接口中存在非抽象方法,编译器会编译不过去,就会报错。并且接口允许任何类去实现它,一个类如果实现一个接口,那么这个类就要把这个借口中的所有方法都实现了。
所以说java接口中的方法都是极度抽象的类型,它比抽象类更加严格的“抽象”。
其实java中的接口是为了解决java中单继承而来的,大家都知道,java中一个类只能有继承一个父类,不像C++中可以多继承,一个孩子可以有多个爸爸。java严格按照我们生活中的人与人的关系,一个孩子只能有一个爸爸,但是可以有多个干爹(现在的干爹都不靠谱啊,原因你懂的。),一个孩子可以继承父亲的所有遗产,但是也可以拥有多个干爹的遗产,前提是他的干爹愿意把遗产给他。(这里指的是别的接口中的方法)。
java 抽象类:
public abstract class Demo01 {
public abstract void addUser();//抽象方法
}
java抽象类必须要以abstract 来进行修饰,抽象类可以继承抽象类。一个类中存在一个抽象方法,那么这个类必须要定义成抽象类。java中抽象类的访问控制修饰符默认是public类型的,抽象类中的抽象方法(其前有abstract修饰)不能用private、static、synchronized、native访问修饰符修饰。因为,抽象方法没有方法体,是用来被继承的,所以不能用private修饰;static修饰的方法可以通过类名来访问该方法(即该方法的方法体),抽象方法用static修饰没有意义;使用synchronized关键字是为该方法加一个锁。。而如果该关键字修饰的方法是static方法。则使用的锁就是class变量的锁。如果是修饰类方法。则用this变量锁。但是抽象类不能实例化对象,因为该方法不是在该抽象类中实现的。是在其子类实现的。所以,锁应该归其子类所有。所以,抽象方法也就不能用synchronized关键字修饰了;native这个东西本身就和abstract冲突,他们都是方法的声明,只是一个把方法实现移交给子类,另一个是移交给本地操作系统。如果同时出现,就相当于即把实现移交给子类,又把实现移交给本地操作系统,那到底谁来实现具体方法呢? 总之:抽象类是提取具体类的公因式。
java 内部类:
package test;
public class test {
private String name = "小熊猫";
class in {
private String name = "丢丢";
public void sal(){
String name = "小熊猫丢丢";
System.out.println("局部变量name:"+name);
System.out.println("内部类变量name:"+this.name);
System.out.println("外部类变量name:"+test.this.name);
}
}
public static class ma {
public static void main(String[] args) {
test.in in = new test().new in();
in.sal();
}
}
}
java 匿名内部类:
匿名内部类的定义语法如下:new 父类构造器(参数列表)|实现接口()
{
//匿名内部类的类体部分
}
虽然看上去很简单,但是还有一些注意事项需要我们注意的:
4:匿名内部类也是局部内部类,所以局部内部类的限制对匿名内部类同样有效。