第七章接口和内部类
Java不支持多重继承,一个类不可以继承多个类。Java引入了接口来弥补这个问题。
7.1接口
接口定义了一系列的抽象方法和常量,形成一个属性集合。接口定义完成之后,任何类都可以实现这个接口,而且一个类可以实现多个接口。实现接口的类必须实现接口中定义的抽象方法,具体实现细节由类自己定义。可以说接口实现了类的框架,可以把它理解成一种完全的抽象类------没有实现任何方法。
7.1.1接口的定义
与类的定义十分相似,只是关键字不同,类定义使用关键字class,接口使用关键字interface,比如:
public interface Animal{ //接口中的常量 public static final int CHANGLIANG = 1; //接口中的方法---抽象方法 这里不用写abstract public void eat(); public String getName(); }
7.1.2接口的实现
接口的实现是指具体实现接口的类。接口的声明仅仅给出了抽象方法,相当于实现定义了程序的框架。实现接口的类必须要实现接口中定义的方法,除非这个类是抽象类。比如:
public class Tiger implements Animals{ public void eat(){ System.out.println("老虎吃肉"); } public String getName(){ return "老虎"; } public static void main(String[] args){ Tiger tiger = new Tiger(); // Animal tiger = new Tiger();这样也可以 //tiger是一个Animal接口类型,实例化实现了Animal接口的Tiger类。实际上实现的是指向的具体是实体类Tiger里的方法 tiger.eat(); System.out.println(tiger.getName()); } }
接口之间也可以有继承关系。继承接口的接口拥有它的父接口的方法,它还可以定义自己的方法。比如:
public interface Mammal extends Animal { void run(); }
要实现Mammal,必须实现两个接口中的所有方法。
public class Tiger implements Mammal{ public void eat(){ System.out.println("老虎吃肉"); } public String getName(){ return "老虎"; } public static void main(String[] args){ Tiger tiger = new Tiger(); //Mammal tiger = new Tiger(); tiger.eat(); System.out.println(tiger.getName()); } } @Override public void run(){ System.out.println("老虎会跑"); } -------------Tiger继承了Mammal这个接口,但是Tiger类要实现两个接口的所有方法------------
7.1.3抽象类和接口的比较
1、一个类可以实现多个接口,但只能继承一个抽象类。 2、抽象类可以有非抽象方法,接口中定义的方法必须全部为抽象方法。 3、在抽象类中定义的方法,可以是public、protected、private或默认值,但在接口中定义的方法全是public的。 4、抽象类可以有构造函数,接口不能。两者都不能实例都能通过它们来存放子类对象。
7.2内部类
内部类定义在其他类的内部,内部类所在的类被称为宿主类。
内部类种类很多,有静态内部类、非静态内部类、定义在方法内的局部内部类,还有没有名字的匿名内部类。
public class Outer { String outstring =“宿主类的变量”; void useInner(){ Inner inner = new Inner(); inner.print(); } /** 内部类*/ class Inner{ void print(){ System.out.println("内部类输出语句"); System.out.println(outstring); } public static void main(string[] args){ Outer outer =new Outer(); outer.useInner(); } } ---输出结果: 内部类输出语句 宿主类的变量