1、第7讲 Java的接口、抽象类与包,回顾,Java类和对象的概念类的结构以及如何生成对象类的3大特性:封装,继承,多态打包的使用以及访问控制符,类和对象的高级特性,抽象类和抽象方法接口的使用内部类的使用,抽象类和抽象方法,关键字是abstract 抽象类 定义抽象类的目的是提供可由其子类共享的一般形式,子类可以根据自身需要扩展抽象类。 抽象类不能实例化,只能用于继承 抽象方法 没有函数体。 抽象方法必须在子类中给出具体实现。abstract和final、static、private不能同时使用,abstract 修饰符可与类和方法一起使用,抽象类和抽象方法(续),在以下情况下,某个类将成为抽象
2、类: 当类的一个或多个方法为抽象方法时。 当类是一个抽象类的子类,但没有为所有抽象方法提供实现细节或方法主体时。 当类实现了一个接口,但没有为所有抽象方法提供实现细节或方法主体时。 注意:抽象类可以包含非抽象方法,也可以一个抽象方法都没有,但只要有一个抽象方法就是抽象类(参见程序GraphicDemo),接口,public interface InterfaceExample int i=4;int k=5;void func1();int func2(int x); ,若抽象类中的所有方法都是抽象的,则该类可用另一种方式定义,即接口,关键字interface 接口是抽象方法和常量定义的集合,
3、接口的访问修饰符只有public和friendly 接口的成员变量隐含为public、static、final,必须赋初值。 接口的成员方法隐含为public、abstract 接口是抽象类的进一步升华,它只提供一个框架,具体代码由实现接口的类完成 接口和抽象类的不同在于,它为无关的类实现同样功能提供了可能,Java设计接口就是为了实现多继承的功能,而抽象类只能由继承链上的类实现,接口的特性,接口的实现,interface Interface1 int k=5;void func1(); public class Class1 implements Interface1 public void
4、 func1() System.out.println(“ func1=“+k); ,关键字implements:类继承接口的关键字,接口实现多重继承,一个类可以实现多个接口。 实现接口的类必须给出接口中所有方法的实现代码,最少要有一对大括号,而且必须在实现方法前加public关键字,若只实现部分方法,则该类成为抽象类。 用接口可定义一个引用变量,该引用可指向任何实现该接口的类的对象,即接口引用可指向实现类对象。,接口的实现(续),interface Interface1int i=4;void func1(); interface Interface2int k=5;void func2()
5、; class Class2 public void func2() System.out.println(“func2 in class2“); public class Class1 extends Class2 implements Interface1,Interface2 问题:为什么Class1前int j; 不加abstract?public void func1() System.out.println(“func1 in Class1“); ,接口实现多重继承(续),通过实现多个接口来达到继承多个类的目的 在程序中如果同时继承类和实现接口,则必须把类写在前面,接口写在后面;若
6、实现多个接口,接口之间用逗号分开 接口与接口的继承关键字为:extends 接口之间可以多重继承(见下页),interface Interface1 int i=4;void func1(); interface Interface2 int k=5;void func2(); interface Interface3 extends Interface1,Interface2 int j=6;void func3(); public class Class3 implements Interface3 int m;public void func1()public void func2()p
7、ublic void func3() ,接口引用,接口可作为一种引用类型来使用,不需要了解对象所对应的具体的类,而是着重于它的交互界面。任何实现该接口的类的实例都可以存储在该接口类型的变量中(类似父类引用指向子类对象),通过这些变量可访问类所实现的接口中的方法。参见程序InterfaceDemo1,类的多种使用方法,内部类 成员类 局部类 匿名类,内部类,定义在另一个类中的类称为内部类,内部类可分为 成员类:类似于成员变量,定义在外部类所有方法之外, 局部类:类似于局部变量,定义在外部类某个方法之内,成员类,成员类可访问外部类成员,外部类不能直接访问成员类成员,只能通过成员类对象引用访问 参考
8、InnerClassDemo1 成员类可以声明为private或protected 根据成员类前是否有static修饰,在外部类之外创建成员类对象分两种情况,成员类(续),无static修饰:先创建外部类对象,再由外部类对象创建内部类对象 OutClass outer=new OutClass(); OutClass.InClass in=outer.new InClass(); 参考InnerClassDemo 有static修饰:直接创建内部类对象 OuterClass.InClass in=new OuterClass.InClass(); 参考InnerClassDemo2,包装类,使
9、用8种基本数据类型声明的变量不是对象 JAVA提供包装类,可以将基本数据类型当作对象操作 每种基本数据类型都有对应的包装类对应关系如下表:,包装类,Java包(package),当编译Java源程序时,对其中的每个类都生成一个.Class文件,为统一组织和管理它们,Java使用了包 包类似于文件夹,一组相关的类被放在一起建议每个文件只写一个类,然后用包将相关的类进行组合,包的用途,包允许你将类文件组织起来,便于查找和使用合适的类。 包不仅包含类和接口,还能包含其它包,从而形成有层次的包空间。 包有助于避免命名冲突。当你使用很多类时,确保类和方法名称的唯一性是非常困难的。包能够形成层次命名空间,
10、缩小了名称冲突的范围,易于管理名称。,使用包,创建包package mypackage; 访问 Java 包成员mypackage.My_Class 导入包 import package_name.*; 导入子包 import package_name.Student.* 示范一个打包,并访问包内的CLASS,包的访问权限,public-公共 所有类都可以访问protected-保护 可被子类访问,不管是同一个包还是不同包 同一个包中非子类需要通过对象访问private-私有 只有自身类才能访问,其它类一概不能访问friendly-友好(默认,不是关键字) 可被同一包的所有的类访问,访问权限,总结,类的静态成员抽象类和抽象方法接口的使用内部类的各种写法,