接口,抽象类与接口的关系。多肽、向上转型与动态绑定的引出

第一:在引入接口之前,首先要知道什么是抽象类。下面是关于抽象类的定义格式:
abstract class absClass
{
public void show()
{
//这是一个非抽象的方法,下面是个抽象方法。
}

public abstract void method();
}

第二:由抽象类引出接口:
如果一抽个象类中方法全部为抽象方法,该抽象类可以为一个接口接口是抽象类的特殊形式,或者说接口就是彻底的抽象。

第三:接口的定义格式:全部是抽象方法
interface 接口名
{
public  void method();
........
}

第四:接口的实现(使用):接口是一种约束、规定
  class 类名(实现类)  implements 接口名
{
重写接口中的抽象方法
}

第五:总结
1.抽象类里可以有不抽象的方法,但是接口里的方法必须都是抽象的
2.实现类在继承接口之后,必须重写接口中的全部抽象方法,否则此实现类无法编译成功。
3.如果实现类不想重写接口中的抽象方法,那么此实现类就需要定义成抽象类(因为定义成抽象类之后就可以不用重写抽象方法了,因为抽象类里可以有抽象方法)
4.当抽象类里都是抽象方法的时候就定义为接口,接口里的抽象类不用不用写abstract,因为默认为abstract了
5.在接口中的属性int a=1;其实是在接口中写了public static final int a=1;也就是说接口中的变量默认为常量。注释:其实在项目中经常用到接口,比如dao的impl层
6.单继承多实现(一个类只能继承一个父类(如果继承两个类,而且两个类中有方法名一样的方法的时候,子类运行的时候就不知道是继承的哪个父类的方法了),但是可以实现多个接口)
7.多继承多实现(一个接口可以多继承(首先:接口的多继承指的是继承多个接口,第二:由于继承的父类也都是接口,因此即使多个父类之间有相同的方法名的时候也没事,反正每个父类中的该方法都没有方法体),多实现)

第六:抽象类与接口的关系:
1.当父类中的方法都为抽象方法的时候,此时把父类用interface关键字修饰,把此父类里面的所有抽象方法用abstract来修饰,abstract可以省略不写。
2.抽象类和类之间是继承关系,接口和类之间是实现关系。因此抽象类定义的是整个系统中的基本功能(因为子类继承抽象类之后必须重写抽象类中的抽象方法,否则此子类也是抽象的或者子类就会报错了),接口定义整个系统中的扩展功能(我们把每个子类都必须用到的方法,并且父类的该方法体不知道该写什么(因为即使父类写了方法体也会被众多子类重写掉)的时候,该方法可以写在抽象类中作为抽象方法;但是某些抽象方法不是买个子类都会用到,此时就把这个扩展方法写在接口中,哪个子类想用哪个子类就去实现该口)

--------------------------------------------------
下面是多肽:

第一:在学习多肽之前,我们就已经在用多肽的理论了:
比如说,方法的重载就是多肽,当我们传入的实参不同的时候,就会得到不同的返回值(结果)。这就是我们身边的方法多肽。我们此时学习的多肽是对象多肽

第二:(对象多肽)多肽的概念:一个对象能够表现不同的形态(同一个引用表现不同的行为)。
当引用数据类型的变量的数据类型和所引用的值的类型不一致的时候,有可能发生多态(等号两边的类型不一致的时候)
第三:继承和多肽的区别:
   Zi zi=new zi();//这是继承
   Fu  fu=new zi();//这是多肽,等号两边类型不一致
注意:
1.Fu  fu=new zi()是编译时看左边,运行时看右边。
2.此时调用一下:fu.show(),编译的时候是编译父类,运行的时候,如果子类重写了父类的show方法,那么此时会执行子类的show方法,否则会执行父类的show方法。
3.fu.ziMthod()的时候会报错,因为父类中没有ziMthod()方法,编译的时候看父类,因此编译的时候会报错。也就是说多肽不能访问子类特有的功能(根据多肽的定义:一个对象能够表现出不同的形态也能看出,是在说父类中的方法,而不是子类特有的方法)。
4.Fu  fu=new zi()这种写法是在程序中是发生了向上转型(也就是在编译的时候是在编译父类),向上转型只能访问父类中声明过的方法,而且是自动发生的(将子类对象转型成父类的引用)。
5.动态绑定:多肽在发生向上转型之后必定会产生动态绑定(向上转型是多肽的编译时期,动态绑定是发生在运行时期)。
编译的时候不知道具体的对象类型(例如动物类),只有程序运行的时候才能将具体的对象绑定到相应的对象中(此时才知道具体绑定的是猫还是狗)。
6.Fu fu = new Zi();//继承多态
  Inter it =new InterImpl(); //接口多态




----多肽的代码
public class Fu
{
public void show()
{
System.out.println("-------this is fu");
}

public void method()
{
System.out.println("-------this method fu");
}
}


public class Zi extends Fu
{
//重写父类中的方法
public void show()
{
System.out.println("-----this is zi");
}

public void ziMethod()
{
System.out.println("-----this ziMethod zi");
}

public static void main(String[] args)
{
//Zi zi = new Zi();
//zi.show();
//zi.method();
//z1.ziMethod();
        //当引用数据类型的变量的数据类型和所引用的值的类型
//不一致的时候,有可能发生多态
Fu fu = new Zi();
//fu.method();
//fu.ziMthod();
fu.show();

/**
当程序编译看=的左边

运行的时候看=的右边(1 如果有重写发生,调用自己的
2 如果没有重写发生,调用父类的)
*/
}
}

  


你可能感兴趣的:(接口,抽象类与接口的关系。多肽、向上转型与动态绑定的引出)