接口是对类的一组需求描述。接口中的方法自动的属于public。接口中的属性自动的属于public static final。因此接口中的属性是常量,必须声明的时候进行初始化。
下面是一个接口的示例:
public interface InterfaceM {
String id="1190";
void value();
}
实现测试类:
public class Test implements InterfaceM{
@Override
public void value() {
System.out.println("id:"+Test.id);
}
public static void main(String[] args){
(new Test()).value();
}
}
运行结果:
run:
id:1190
成功生成(总时间:1 秒)
接口和抽象类的比较
先说一下接口和抽象类的一些区别:
接口的属性是常量;抽象类的属性则没有什么限制,同正常类的属性是一样的。接口的方法都是方法的声明,没有实现,就是没有方法体;抽象类的方法中非抽象方法和正常类的一样,抽象方法要加abstract修饰,同时没有方法体。更深层次的区别是接口时一种双方交互的协议;抽象类则是一种类型的限定,一种提供公共属性和方法的载体。
更底层的区别是Java选择单继承多实现的原因是多继承会让语言本身变得更加复杂,效率也会降低。
内部类
使用内部类的原因有三点:
内部类可以访问该类作用域中所有的数据,包括私有数据
内部类可以对同一个包中的其他类隐藏起来
当想要定义一个回调函数且不想编写大量的代码时,使用匿名内部类比较便捷。
先看下面的一个例子:
public class Test{
private String id="1899";
private void detai(){
System.out.println("I am a private method in Test class!");
}
public class Inner{
public void info(){
System.out.println("id:"+id);
detai();
System.out.println("I am a inner class method");
}
}
public void value(){
Inner inner=new Inner();
inner.info();
System.out.println("I'm a public method in Test class!");
}
public static void main(String[] args){
Test test=new Test();
test.value();
}
}
运行结果:
run:
id:1899
I am a private method in Test class!
I am a inner class method
I'm a public method in Test class!
成功生成(总时间:0 秒)
从这里面可以看见一些内部类的语法规则:
可以毫无限制的引用外部类的属性和方法,private限定不起作用
外部类引用内部类可以像引用其他类一样的引用方式,static参照其他的普通类一样使用。
下面是局部内部类的情形:
public class Test{
private String id="1899";
private void detai(){
System.out.println("I am a private method in Test class!");
}
public void value() {
class Inner {
public void info() {
System.out.println("id:" + id);
detai();
System.out.println("I am a inner class method");
}
}
Inner inner = new Inner();
inner.info();
System.out.println("I'm a public method in Test class!");
}
public static void main(String[] args){
Test test=new Test();
test.value();
}
}
如果内部类没有引用外部类的非静态属性和方法,可以把内部类声明为static,来消去对外部类的引用。
一般在开发中最常用的是接口,内部类多用在swing等图形界面开发添加Listener的时候使用。