JAVA接口:
Java语言的继承是单一继承,一个子类只能有一个父类(单一继承)
Java语言给我们提供了一种机制,用于处理继承单一的局限性的,接口;
接口:是一个比抽象类还抽象的类,接口里所有的方法全是抽象方法,接口和类的关系是实现,关键字是implements
接口是功能的集合,同样可以看作是一种数据类型,是比抽象类更为抽象的”类”.
接口只描述所应该具备的方法,并没有具体实现,具体的实现由接口的实现类(相当于接口的子类)来完成.这样是将功能的定义与实现分离,优化了程序设计.
格式:接口定义时需要使用interface关键字.
定义接口所在的仍为.java文件,虽然声明时使用的为interface关键字的编译后仍然会产生.class文件.这点额可以让我们将接口看作是一种只包含了功能声明的特殊类.
Public interface 接口名{
抽象方法1;
抽象方法2;
抽象方法3;
}
接口的应用场景:
接口中的方法诠释抽象方法,直接new接口来调用方法没有意义.java也不允许这样干.
类与接口的关系为实现关系,即类实现接口.实现的动作类似继承,只是关键字不同.继承是extends,实现是implements.
其他类(实现类)实现接口后,就相当于声明:我应该具备这个接口中的功能.实现类仍然需要重写方法以实现具体的功能.
格式:
Class 类 implements 接口{
重写接口中的方法;
}
在类实现接口后,该类就会将接口中的抽象方法继承过来,此时该类需要重写该抽象方法,完成具体的逻辑.
接口中成员的特点:
接口中可以定义变量,但是变量必须有国定的修饰符修饰,public static final.所以接口中的变量也称之为常量,其值不能改变.
接口中可以定义方法,方法也有固定的修饰符 public abstract
接口中可以定义方法.方法也有固定的修饰符,public abstract.
接口中不可以创建对象
子类必须覆盖掉接口中所有的抽象方法后,子类才可以实例化.否则子类是一个抽象类.
接口与类之间的关系
类与类之间:继承关系,一个类只能继承一个父类,但是支持多重继承
类与接口之间:只有实现关系,一个类可以实现多个接口
接口与接口之间:只用继承关系,一个接口可以继承多个接口,implements后使用,分割
类与接口的关系是实现关系,一个类实现了一个接口,就要实现该接口中所有的方法.
接口优点:
接口是对外暴露的规则
类与接口的关系是实现
接口的出现降低耦合性.(实现了模块化开发,定义好规则,每个人实现自己的模块,大大提高了开发效率)
接口和抽象类的异同
同:
都位于继承的顶端,用于被其他类实现或继承
都不能直接实例化对象
都包含抽象方法,其子类都必须复写这些抽象方法.
异:
一个类只能继承一个直接父类(可能是抽象类),却可以实现多个接口(接口弥补了java的单继承) 单继承多实现
成员变量: 抽象类既可以有常量也可以有变量,接口只能有常量
成员方法: 抽象类既可以有抽象方法也可以有非抽象方法
接口只能有抽象方法
构造方法: 抽象类有构造方法,子类通过super语句调用.接口没有构造方法
匿名对象
匿名对象即无名对象,直接使用new关键字来创建对象.
应用场景:
当方法只调用一次的时候可以使用匿名对象
可以当作参数进行传递,但是无法在传参之前做其他的事情.
Note:匿名对象可以调用成员变量并赋值,但是无法在传参之前做其他的事情.
示例:
public class demo{
public static void main(String[] args ){
method(new Student());
}
public void method(Student s){
s.study();//输出”学生学习了”
}
}
class Student{
private String name;
private int age;
public void study(){
System.out.println(“学生学习了”);
}
}
JAVA多态
多态是继封装.继承之后,面向对象的第三大特性.
多态的前提:
字符类的继承关系
方法的重写
父类引用指向子类对象
动态绑定:运行期间调用的方法,是根据其具体的类型.
现实事物经常会体现多种形态,如学生,学生是人的一种,则一个具体的同学张三既是学生也是人,即出现两种形态.
Java作为面向对象的语言,同样可以描述一个事物的多种形态.如Student类继承了Person类,一个Student的对象便既是Student,又是Person.
多态的定义格式:就是父类的引用变量指向子类对象.
父类类型 变量名 = new 子类类型();
变量名.方法名();
Abstract class Fu{
Public abstract void method();
}
Class Zi extends Fu{
Public void method(){
System.out.println(“重写父类抽象方法”);
}
}
//类的多态使用
Fu fu = new Zi();
普通类多态定义的格式:
父类 变量名 = new 子类();
如: class Fu{ }
Class Zi extends Fu{}
//类的多态使用
Fu f= new Zi();
抽象类多态定义的格式
接口多态定义的格式
接口 变量名 = new 接口实现类();
如: interface Fu{
Public abstract void method();
}
Class Zi implements Fu{
Public void method(){
System.out.println(“重写接口抽象方法”);
}
}
//接口的多态使用:
Fu fu = new Zi();
多态的成员特点:
当子父类中出现同名的成员变量时,多态调用该变量时:
编译时期:参考的是引用型变量所属的类中是否有被调用的成员变量.没有,编译失败.
运行时期:也是调用引用型变量所属的类中的成员变量.
简单记:编译和运行都参考等号的左边.编译运行看左边.
多态成员方法:
编译时期:参考引用变量所属的类,如果没有类中没有调用的方法,编译失败
运行时期:参考引用变量所指的对象所属的类,并运行对象所属类中的成员方法
简而言之:编译看左边,运行看右边.
Note:
多态的成员特点:
成员变量: 编译时看的是左边,运行时看的是左边
成员方法: 编译时看的是左边,运行时看右边
静态方法: 编译时看的是左边,运行时看的也是左边.
编译时看的都是左边,运行时成员方法看的是右边,其他(成员变量和静态的方法)看的都是左边.
多态的向上转型和向下转型
向上转型:当有子类对象赋值给一个父类引用时,便是向上转型,多态本身就是向上转型的过程. 由小到大(子类型转换为父类型)
向下转型:一个已经向上转型的子类对象可以使用强制类型转换的格式,将父类引用转为子类引用,这个过程是向下转型.如果是直接创建父类对象.是无法向下转型的.由大到小(强转)
多态的优缺点:
优点:可以提高可维护性(多态前提所保证的),提高代码的可扩展性
缺点:无法直接访问子类特有的成员.