一. 接口(interface),是一种引用数据类型。
interface 差不多= = abstract class
1)接口是has a (继承是is a):“像”我中的一种,是继承体系之外的,用于功能扩展!想扩展就实现,不想就不用实现。
2)接口中只能声明抽象方法和常量且声明格式都是固定的,定义的所有变量都是static final类型的,只不过可以省略。
注意:接口中声明常量和抽象方法的格式是固定的
1 public interface Test { 2 /*public abstract final*/int SPEED=100;//声明常量 3 /*public abstract 省略了,写也对*/void showInfo();//声明抽象方法 4 }
3)接口中的方法都是公共抽象方法
1 public interface MyInterface { 2 public abstract void showInfo(); 3 void showInfo3(); 4 5 // 推荐写法 6 public void showInfo2(); 7 }
二.接口的多态现象
1)接口不能有构造器,因为不能实例化何以初始化,接口只能被“实现”。
2)具体类实现了一个接口,则必须实现全部的抽象方法,若没有全部实现,则该类为抽象类。所以说,接口约定了具体类的方法,约定了类的外部行为。
3)具体类可以同时实现多个接口,就是多继承现象。
4)多重继承:实现类Student具备了驾驶能力,实现类Teacher也具备了驾驶能力,原因是都实现了Drive,两个实现类的能力得到了增强。
5)接口用implements 表实现,实际是继承关系,可有多个接口(实现),继承用extends 只能有一个继承关系。
6)一个类既可以继承的同时,又“实现”接口:class A extends B implements C , D;
7)类与类之间是继承关系,类与接口之间是实现关系,接口与接口之间是继承关系,且只有接口之间可以多继承,即:interface A{},interface B{},interface C extends A , B 但接口多继承时要注意,要避免A、B接口中有方法名相同、参数列表相同,但返回值类 型不相同的情况,因为被具体类实现时,不确定调用哪个方法。
三. 抽象类和接口的异同比较
1.abstract class和interface有什么区别?
1)从编程的角度:abstract class在java语言中表示的是一种继承关系,一个类只能使用一次继承关系。而一个类可以实现多个interface。
2)从问题域角度:abstract class在Java语言中体现了一种继承关系,要想使得继承关系合理,父类和派生类之间必须存在"is a"关系,即父类和派生类在概念本质上应该是相同的。对于interface 来说则不然,并不要求interface的实现者和interface定义在概念本质上是一致的,仅仅是实现了interface定义的约定(协议)而已。
2.抽象类和接口的异同
1)抽象类和接口都是引用数据类型,他们都不能创建对象,都可以定义抽象方法,都可以实现多态;但是抽象类可以定义非抽象方法,而接口中定义的都是抽象方法。
2)抽象类和接口都具有传递性。抽象类是单根性(单继承),而接口是多继承;重要的是:抽象类和子类解决的是模块内的问题(代码重用,重写,多态)而接口解决的是模块间的问题。
四.内部类
在类内部定义的类为成员内部类,在方法里定义的类为局部内部类,被static修饰的为静态内部类。一个类中可有多个内部类。
1)内部类主要用于,封装一个类的声明在类的内部,减少类的暴露。
2)内部类的实例化:实例化时不需要出写对象,非要写的话为:new 外部类名.内部类名();而不是外部类名.new 内部类名()。
当内部类定义在外部类的成员位置上,而且非私有,则在外部其他类中可以直接建立内部类对象。格式:外部类名.内部类名变量名= 外部类对象.内部类对象;
Outer.Inner in = new Outer().new Inner();
1 public class Test01 { 2 public static void main(String[] args) { 3 4 // 【1】创建外部类对象 5 Outer outer = new Outer(); 6 // 【2】创建内部类对象 7 Inner inner = outer.new Inner(); 8 inner.showInfo(); 9 } 10 }
3)内部类中可以访问外部类的私有变量
1 public class Outer { 2 3 private String name = "Outer"; 4 5 class Inner{ 6 7 public void showInfo() { 8 System.out.println(name); 9 } 10 11 } 12 }
特殊情况:重名,外部类和内部类的变量同名
1 public class Outer { 2 3 private String name = "Outer"; 4 5 class Inner{ 6 7 private String name = "Inner"; 8 9 public void showInfo() { 10 // String name = "show info"; 11 12 // 访问外部类的私有成员 13 System.out.println(this.name); 14 15 // 访问外部类的私有成员 16 System.out.println(Outer.this.name); 17 18 } 19 } 20 }
注意事项:
当内部类中定义了静态成员,该内部类必须是static的。
当外部类中的静态方法访问内部类时,内部类也必须是static的。
4)内部类想调用外部类的成员,需要使用:外部类名.this.成员,即Outter.this表示外部类的对象。如果写this.成员= =成员,调用的还是内部类的成员(属性或方法)。