目录
5.Java只有单继承(继承父类),Java还有多实现(多个implements);
一、interface:接口 定义
1.接口中没有构造器;
2.类是要实现接口<实现关系> implement:实现;
3.一旦实现一个接口,那么实现类要重写接口中的全部方法;
4.如果没有全部重写抽象方法,可以将其变成一个抽象类;
5.Java只有单继承(继承父类),Java还有多实现(多个implements);
6.接口不能创建对象,可以指向实现类--->多态
二、接口中常量如何访问?
System.out.println(TestInterface01.NUM);//接口.常量名
System.out.println(Student.NUM);//实现类.常量名(必须是静态的)
Student s = new Student(); * System.out.println(s.NUM);//创建实现类对象
TestInterface01 t2 = new Student();
System.out.println(t2.NUM);//接口实现类访问常量
三、接口的作用是什么?
定义规则,只是跟抽象类不同的地方在于:他不是接口不是类;
接口定义好规则之后,实现类负责实现即可;
继承:子类对父类的继承;
实现:实现类对接口实现
手机 是不是 照相机
继承:手机 extends 照相机 “is_a”d的关系,手机是一个照相机;
* 上面的写法不好 *
实现:手机 implements 拍照功能 “has_a”的关系,手机具备照相的功能;
具备能力
案例: 飞机 小鸟 风筝
定义一个接口:Flyable
四、多态的应用场合:
(1)父类当作方法的形参,传入具体的子类的对象;
(2)父类当作方法的返回值,返回的是具体的子类的对象
(3)接口当作方法的形参,传入具体的实现类的对象;
(4)接口当作方法的返回值,返回的之具体的实现类的对象;
五、接口和抽象类的区别:
1.抽象类允许包含某些方法的实现,而接口是不允许的。
2.在抽象类中提供成员方法的实现细节。
3.抽象类中的成员变量可以实现多个权限publicprivateprotectedfinal等。
扩充.抽象类是一个多个子类,是一个模板式的设计;一个接口就是一个图形。”
六、两者相同点
1、不能直接实例化,如果要实例化,抽象类变量必须指向实现所有抽象方法的子类对象,接口变量必须指向实现所有接口方法的类对象。
2、抽象类里的抽象方法必须全部被子类所实现,子类不能全部实现父类抽象方法,那么该子类还只能是抽象类。一个类实现接口的时候,如不能全部实现接口方法,那么该类也只能为抽象类。
七、两者不同点
1、默认的方法实现
抽象类可以有默认的方法实现;
接口,Java8规定可以为接口提供默认实现的方法并且不用强。
2、实现 * 制子类来重写子类使用extends关键字来继承抽象类。如果子类不是抽象类的话,它需要重写抽象类中的抽象方法;接口子类使用关键字implements 来实现接口,它需要重写接口中没有默认。
3、构造器 * 抽象类可以有构造器,接口不能有构造器。
4、与正常Java类的区别 * 除了不能实例化抽象类之外,和普通Java类没有任何区别;接口是完全不同的类型外。
5、访问修饰符 * 抽象方法可有public.protected和default、abstract修饰符。不能用privatestatic.synchronize、 native 修饰。
接口属性默认修饰符是publicstatic final (必须赋初值) ,方法默认修饰符是publicabstract. Java8 开始出现静态方法,多加static关键字。
6、main方法 * 并且可以运行它;接口没有main方法,因此不能运行它。
7、多继承 * 抽象类可以继承一个类和实现多个接口;接口只可以继承一个或多个接口。
8、抽象类的运用意义
在面向对象方法中,抽象类主要用来进行类型隐藏。构造出一个固定的一组行为的抽象描述,但是这组行为却能够有任意个可能的具体实现方式。
这个抽象描述就是抽象类,而这一组任意个可能的具体实现则表现为所有可能的派生类。模块可以操作一个抽象体。
由于模块依赖于一个固定的抽象体,因此它可以是不允许修改的;同时,通过从这个抽象体派生,也可扩展此模块的行为功能。
为了能够实现面向对象设计的一个最核心的原则OCP(Open-Closed Principle),抽象类是其中的关键所在。
八、包含的内容:
1.常量:
public static final int NUM =10; //常量名建议大写
2.抽象方法:
public interface TestInterface01{
public abstract void a();
public abstract void b(int num);
public abstract int c(String name);//这些修饰符系统会自动补全,可以省略
}
3.实例
public interface TestInterface01 { //* 1.常量: // * public static final int NUM =10; //常量名建议大写 int NUM = 10; public abstract void a(); public abstract void b(int num); public abstract int c(String name);//这些修饰符系统会自动补全,可以省略 } class Student implements TestInterface01{ @Override public void a() { System.out.println("---1"); } @Override public void b(int num) { System.out.println("---2"); } @Override public int c(String name) { return 100; } } class Test{ //这是一个main方法,是程序的不入口; public static void main(String[] args){ //接口不能创建对象; //TestInterface02 t = new TestInterface02(); TestInterface01 t = new Student();//接口可以实现类 --->多态 //7.接口中常量如何访问? System.out.println(TestInterface01.NUM);//接口.常量名 System.out.println(Student.NUM);//实现类.常量名(必须是静态的) Student s = new Student(); System.out.println(s.NUM);//创建实现类对象 TestInterface01 t2 = new Student(); System.out.println(t2.NUM);//接口实现类访问常量 }