网站地图 | RSS订阅 老铁博客 - 上海SEO优化|上海网站建设|蜘蛛池出租|站群代搭建
你的位置:首页 » 前端脚本 » 正文

java抽象类,java抽象类的用法

2020-4-30 13:55:30 | 作者:老铁SEO | 0个评论 | 人浏览

  抽象类是用来捕捉子类的通用特性的。它不能被实例化,只能被用作子类的超类。抽象类是被用来创建继承层级里子类的模板。接口是抽象方法的集合。如果一个类实现了某百个接口度,那么它就继承了这个接口的抽象方法。这就像契约模式,如果实现了这个接口,那么就必须确保使用这些方法。接口只是一种形式,接口自身不能做任何事情。


  java里抽象类到底有什么用?


  你明白多态就明白这个问题了,给你举个例子吧:比如有个抽象类叫动物,他有“叫”的动作,继承他的类都是普通类,有猫、狗...各种动物,他们实现叫的方法都不同。现在有个需求:就是实现各种动物“叫”的动作,为了动态实现,就需要把动物做为形参传过去,依照多态的特性“任何父类出现的地方,都可以替换成子类”,我们就可以将真正实现了“叫”这个方法的实现类传过去而执行实现类里的方法了,以下是实例代码:


  //动物类


  publicabstractclassAnimal(){


  publicvoidshout();


  }


  //实现类:狗


  publicclassDogextendsAnimal(){


  publicvoidshout(){


  System.out.println("汪");


  }


  }


  //实现类:猫


  publicclassCatextendsAnimal(){


  publicvoidshout(){


  System.out.println("瞄");


  }


  }


  //执行类


  publicclassOpration(){


  //定一个以Animal为参数的方法


  publicvoidExecuteTest(Animalanimal){


  //只调用“叫”的方法


  animal.shout();


  }


  }


  //测试类


  publicclassTest(){


  //实现main()


  publicstaticvoidmain(String[]args){


  //实例化


  Dogdog=newDog();


  Catcat=newCat();


  Oprationop=newOpration();


  //接下来要用多态了


  //这里是狗“叫”的放法


  op.ExecuteTest(dog);


  //这里是猫“叫”的方法


  op.ExecuteTest(cat);


  }


  }


  希望能对你有帮助。


  我这没用任何工具,要是有错误,请见谅。


  JAVA抽象类可以继承抽象类


  您好,提问者:


  1、抽象类只是一个特殊的类,但是也具备类的特性。


  2、如果这个类中有抽象方法,那么这个类必须定义为抽象类。3、如果这个抽象类继承了别的抽象类,那么可以不覆盖抽象方法。因为:这个抽象类也是抽e79fa5e98193e78988e69d8331333335313838象的,没办法实现方法体。例如一下代码:abstractclassA{


  abstractvoidadd();


  publicvoiddelete(){}


  }


  abstractclassBextendsA{


  //继承了抽象A类,因为也是抽象的,可以不写抽象方法,当然也可以重写抽象方法(切记抽象方法是没有方法体的)


  //abstractvoidadd();//也是没有问题的


  abstractvoidgetXX();


  }


  publicclassextendsB{


  //必须实现抽象方法


  //继承了B,也就继承了A,AB方法都有,所以必须重写这两个抽象类的抽象方法


  publicvoidadd(){}


  publicvoiddelete(){}


  publicvoidgetXX(){}


  }


  JAVA抽象类的this一个问题


  你老师瞎掰。。。。


  谁说抽象类里面不能用this关键字?小伙子啊,你老师把你给害了。。。追问这个是老师说的“在抽象类中可以包含静态变量和静态方法,在此类中还可以使用抽象类名调用静态变量,在抽象类中不可以使用this关键字,原因是由于该类为抽象类,既然是抽象类就不可以获取该类的实例对象.”


  求大神指点


  追答我这样给你说吧:


  抽象类和接口在使用上类似,都是不能直接实例化的类,但可以实例化抽象类的非抽象子类。


  抽象类的非抽象子类实例化后,实际上也是抽象类的实例,所以抽象类里面的this实际代表的也是抽象类自己,当然也是实例它的子类对象。


  也就是说,抽象类虽然不能直接实例化,但是我们通过实例化它的非抽象子类就可以说是实例化了抽象类。我给你举一个例子:


  publicabstractclassPar{};


  publicclassSubextendsPar{};


  上面定义了一个父类抽象类Par,和抽象类的子类Sub,


  我可以这样来解释我说的是不是正确的:


  Subinstance1=newSub();//没有问题,自己实例化赋值给自己


  Parinstance2=newSub();//没有问题,实例化子类赋值给父类对象


  Objectinstance3=newSub();//同样么有问题,因为Object是任何类的父类,简称超类。


  但你要明白的是,抽象类里面的this,在运行时期实质上指向的是子类的内存地址!


  再给你补充点:


  我上面说的子类抽象类的非抽象子类的实例就相当于抽象类的实例,我证明给你看:


  booleanisSuperInstance=instance1instanceofPar;


  isSuperInstance结果为true,结果很显然了。

  • 本文来自: 老铁博客,转载请保留出处!欢迎发表您的评论
  • 相关标签:
  • 已有0位网友发表了一针见血的评论,你还等什么?

    必填

    选填

    记住我,下次回复时不用重新输入个人信息

    必填,不填不让过哦,嘻嘻。

    ◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

    相关推荐