java接口和抽象类的区别是什么,java抽象类和接口的理解

  java接口和抽象类的区别是什么,java抽象类和接口的理解

  

目录

抽象类对实现多态性有什么意义通过接口实现多态性的接口是什么?今天我们继续学习java,看看java里有哪些抽象类和接口?

 

  

什么是抽象类

我们之前学过什么是类,那么抽象类也是类的一种吗?

 

  我一听名字就觉得好抽象!对了,他是抽象的,不是具体的。一个类不包含足够的信息来描述一个特定的对象,这样的类被称为抽象类。

  看一个抽象类的例子。

  //抽象类和抽象方法需要用抽象关键字修饰。抽象类Shape {//抽象类中的方法一般需要抽象方法,没有方法体抽象void draw();}你以为这个抽象类什么都没干?他唯一的方法draw()仍然是空的。

  如果像这样的类没有包含足够的信息来描述一个特定的对象,自然就不能实例化该对象。不要相信我:

  既然那个类不能实例化,那么这个抽象类存在的意义是什么?别担心,存在就是合理。慢慢听我说。

  00-1010抽象类存在的一个最大意义就是继承,继承了就可以用来实现多态性。

  看一段代码。

  //抽象类和抽象方法需要用抽象关键字修饰。抽象类Shape {//抽象类中的方法一般需要抽象方法,没有方法体抽象void draw();}//当普通类继承抽象类时,普通类必须覆盖抽象类中的方法classcycleextends shape { @ override void draw(){//覆盖draw方法system . out . println( draw a circle );} } public class Test4 { public static void main(String[]args){//Shape Shape=new Shape();虽然抽象类不能直接实例化//,但是可以将普通类对象传递给抽象类的引用,即父类引用指向子类对象Shape Shape=new Cycle();//这叫:向上转化/*Cycle循环=new Cycle();shape=cycle//这是向上转换*/shape.draw()的另一种写法;//通过父类引用调用被子类覆盖的方法}}运行后会发现一个神奇的场景:

  看完代码,你可能会有很多疑问。别急,我们一个一个说。

  什么是向上转化:一句话,概括为“父类引用子类对象”

  向上转换后的变化

  关于方法:父类引用可以调用子类和父类共有的方法(如果子类覆盖了父类的方法,就会调用子类的方法),但是子类的具体方法不能调用。关于属性:父类引用可以调用父类的属性,但不能调用子类的属性的向上变换。

  在实例化一些重复的代码对象时,我们可以根据不同的需求实例化不同的对象,这样就可以理解上面的代码。

  好像可以通过子类继承重写抽象类,抽象类真的很有用!

  但是这和多态性有什么关系呢?抽象类用起来这么麻烦,我还不如直接用普通类,达到这样的效果,不用再写一个子类?

  好了,再看下面这段代码,你就知道抽象类在实现多态性上的好处了。

  抽象类Shape {公共抽象void draw();//抽象方法里面不能有具体的语句}//普通类继承抽象类的时候,抽象类里面的抽象方法classcycle extends shape必须在这个子类里面重写{ @ override//不重写会出错,但是继承普通类就不会出错。使用抽象类public void draw(){ system . out . println( draw a circle )} }类Flower extends比较安全

  hape { // 不同的子类对父类的draw方法进行了不同的重写 @Override public void draw() { System.out.println("画一朵花"); }}class Square extends Shape { @Override public void draw() { System.out.println("画一个正方形"); }} public class Test4 { public static void main(String[] args) { Cycle cycle = new Cycle(); // 子类引用cycle Flower flower = new Flower(); // 子类引用flower Square square = new Square(); // 数组的类型是Shape,即数组中每一个元素都是一个父类引用 // 在这个过程其实也发生了向上转型,对抽象类中的方法进行了重写 Shape[] shapes = {cycle, flower, square}; // 父类引用引用不同的子类对象 for (int i = 0; i < shapes.length; i++) { Shape shape = shapes[i]; // 父类引用shape指向—>当前所对应的子类对象 shape.draw(); // 通过父类引用调用子类重写的draw方法 } }}

 

  

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: