/****针对在框架学习中接口经常被用作某些方法的形参,而进行的Java基础的回顾笔记****/
--1.使用接口的好处:
a.接口定义的是一种标准,可以使代码分层开发,分模块开发;
b.降低代码的耦合度,提高代码的可扩展性和可维护性;
c.接口改进了Java中单继承的局限性;(在JDK1.7及以后,接口可多继承多实现)
--2.抽象类和接口的区别:
a.接口中的所有方法都是抽象的,抽象类中的方法可以是抽象的也可以是不抽象的;
b.接口和抽象类都不能实例化,接口需要类来实现并重写接口中的方法,只能实例化这个实现类;而抽象类是由类来继承并重写抽象方法,只能实例化这个子类;
c.抽象类只能单继承,接口可以多继承,还可以多实现;
d.接口中属性默认是static final的,抽象类中的属性和普通类中的属性无区别;
e.接口中方法默认是抽象的(无需加abstract),抽象类中的抽象方法需加abstract;
--3.多态的概念
总结:多态是同一种行为在子类中有不同的体现;
接口中的多态就是不同的实现类重写接口中的方法;类中的多态则表现在方法的重写,例:
abstract class Teacher{
String name;
int age;
public abstract void teach(); //定义抽象方法
public void walk(){
System.out.println(name + "正在走路");
}
}
class JavaTeacher extends Teacher{
public void teach(){
System.out.println(name + "正在教Java");
}
}
class PathonTeacher extends Teacher{
public void teach(){
System.out.println(name + "正在教Pathon");
}
}
class Leader{
public void checkJavaTeacher(JavaTeacher jt){//考察Java老师
System.out.println("开始考察");
jt.teach();//Java老师开始讲课
System.out.println("结束考察");
}
public void checkPathonTeacher(PathonTeacher pt){//考察Pathon老师
System.out.println("开始考察");
pt.teach();//Pathon老师开始讲课
System.out.println("结束考察");
}
}
class Test{
public static void main(String[] args){
JavaTeacher jt = new JavaTeacher();
jt.name = "Mike";
PathonTeacher pt = new PathonTeacher();
pt.name = "Nino";
Leader leader = new Leader();
leader.checkJavaTeacher(jt);
leader.checkPathonTeacher(pt);
}
}
此种为继承多态,将空实现的方法设置为抽象方法,被继承类变为抽象类;
特点:1.必须有继承关系,在抽象类中定义要实现多态的抽象方法,通过子类继承这个抽象类,然后重写抽象方法,达到多态的效果;
2.多态子类的实例可以赋给父类的引用
Q:上述的方法中在增加新的老师时,Leader类中会有大量的重复代码出现(check方法会重复),如何解决;
A:以父类的引用作为形参,用到上述的第二点;如下:
class Leader{
public void checkTeacher(aTeacher t){//考察Java老师
System.out.println("开始考察");
t.teach();
System.out.println("结束考察");
}
}
class Test{
public static void main(String[] args){
//子类的实例用父类的类型来接收
Teacher jt = new JavaTeacher();
jt.name = "Mike"
Teacher pt = new PathonTeacher();
pt.name = "Nino"
Leader leader = new Leader();
leader.checkTeacher(jt); //打印出Mike正在教Java
leader.checkTeacher(Pt); //打印出Nino正在教Pathon
}
}
Java的内部机制保证多态子类的实例在赋给父类的引用后仍能调用出正确的方法
但是此时的实例属于父类,不能调用子类中所特有的方法(只能调用通过子类复写的方法)另外,可以通过在Leader类中添加instanceof的方法判断多态的引用变量为何类型,其返回值为boolean型;
用法如:if(t instanceof JavaTeacher){ }
--4.多态的内存图
描述:在创建new Leader实例后,将checkTeacher方法放入方法区,在调用方法时,先压栈,在栈中找jt的地址(0X9999),再调用堆中所存的teach方法,也就是JavaTeacher的teach()方法;
另一种多态形式是接口的多态,实现接口必须重写接口中的方法,接口在后面的框架学习中经常用做方法参数,其原理就是上述的子类的实例可以赋给父类的引用。