java中继承的用法,java继承简单例子

  java中继承的用法,java继承简单例子

  java继承与合成基本概念

  继承:您可以基于现有的类构造一个新的类。继承现有的类可以重用这些类的方法和域。在此基础上,可以添加新的方法和域,从而扩展类的功能。

  组合:在新类中创建一个现有对象称为组合。这样,现有的代码可以在不改变其形式的情况下被重用。

  相关视频教程推荐:java视频教程

  1.继承的语法

  关键字extends表示新类是从现有类派生的。现有的类称为父类或基类,新的类称为子类或派生类。例如:

  班级学生拓展人{

  }类Student继承Person,Person类称为父类或基类,Student类称为子类或派生类。

  2.合成的语法

  组合很简单,就是在一个类中创建一个现有的类。

  班级学生{

  狗狗狗狗;

  }上溯造型

  1.基本概念

  继承的作用在于代码的重用。因为继承意味着父类的所有方法也可以在子类中使用,所以发送到父类的消息也可以发送到派生类。如果在Person类中有eat方法,那么在Student类中也会发现,也就是说Student对象也是一类人。

  类别人员{

  public void eat() {

  system . out . println( eat );

  }

  静态空显示(人p) {

  p . eat();

  }

  }

  公共课学生拓展人{

  公共静态void main(String[] args) {

  学生s=新生();

  个人秀;//

  }

  }[运行结果]:

  吃

  Person中定义的show方法用于接收Person句柄,但是在接收Student对象的引用。这是因为学生对象也是一个人对象。在show方法中,传入的句柄(对象的引用)可以是Person对象和Person的派生类对象。这种将学生句柄转换为个人句柄的行为称为反向建模。

  2.为什么要上溯造型

  为什么调用eat时会有意忽略对象类型?让show方法简单地获得Student句柄似乎更直观,但这将使从Person类派生的每个新类实现自己的show方法:

  类别值{

  private int count=1;

  私有值(整数){

  this.count=count

  }

  公共静态最终值

  v1=新值(1),

  v2=新值(2),

  v3=新值(3);

  }

  类别人员{

  公共void eat(值v) {

  system . out . println( person . eat());

  }

  }

  班主任扩展人{

  公共void eat(值v) {

  system . out . println( teacher . eat());

  }

  }

  班级学生拓展人{

  公共void eat(值v) {

  system . out . println( student . eat());

  }

  }

  公共类升级演示{

  公共静态空显示(学生){

  s . eat(value . v1);

  }

  公共静态空显示(教师t) {

  t . eat(value . v1);

  }

  公共静态空显示(人p) {

  p . eat(value . v1);

  }

  公共静态void main(String[] args) {

  学生s=新生();

  老师t=新老师();

  Person p=新人();

  演出;

  显示(t);

  秀(p);

  }

  }这种方法的一个明显的缺点是,需要定义与Person类的每一个衍生物密切相关的方法,导致大量重复代码。另一方面,如果您忘记了方法的重载,您将不会报告错误。上面示例中的三个show方法可以完全合并为一个:

  公共静态空显示(人p) {

  p . eat(value . v1);

  }动态绑定

  当执行show(s)时,输出结果是Student.eat(),这确实是我们想要的结果,但它似乎没有以我们想要的形式执行。我们再来看看展示方法:

  公共静态空显示(人p) {

  p . eat(value . v1);

  }它接收人句柄。当执行show(s)时,它如何知道Person句柄指向学生对象而不是教师对象?编译器无从得知,这就涉及到接下来要解释的绑定问题。

  1.方法调用的绑定

  将方法与方法体连接起来称为绑定。如果在运行之前进行绑定,则称为“早期绑定”。在上面的例子中,当只有一个Person句柄时,编译器不知道调用哪个方法。Java实现了一种方法调用机制,可以在运行时判断对象的类型,然后调用相应的方法。这种基于对象类型的绑定称为动态绑定。除非一个方法被声明为final,否则Java中的所有方法都是动态绑定的。

  用图表展示向上建模的继承关系;

  如何解决写爬虫IP受阻的问题?立即使用。

  代码总结如下:

  Shape s=new Shape();根据继承关系,将创建的圆对象句柄赋给一个形状是合法的,因为圆属于一种形状。

  当调用一个基本类方法时:

  Shape s=new Shape();此时调用Circle.draw(),这是由于动态绑定的原因。

  类别人员{

  void eat() {}

  void speak() {}

  }

  班级男生扩展人{

  void eat() {

  system . out . println( boy . eat());

  }

  void speak() {

  system . out . println( boy . speak());

  }

  }

  班级女生扩展人{

  void eat() {

  system . out . println( girl . eat());

  }

  void speak() {

  system . out . println( girl . speak());

  }

  }

  公共阶层人士{

  public static Person rand Person(){

  switch((int)(math . random()* 2)){

  默认值:

  案例0:

  返回新男孩();

  案例1:

  返回新女孩();

  }

  }

  公共静态void main(String[] args) {

  Person[] p=新人[4];

  for(int I=0;仪表板长度;i ) {

  p[I]=rand person();//随机生成男孩或女孩

  }

  for(int I=0;仪表板长度;i ) {

  p[i]。吃();

  }

  }

  } Person为Person派生的所有类建立一个通用接口,所有派生类都有两个行为:吃和说。类重写这些定义并重新定义这两个行为。

  在主类中,randPerson随机选择Person对象的句柄。* *上诉建模发生在返回语句中。**return语句获取男孩或女孩的句柄,并将其作为Person类型返回。这个时候我们不知道具体是什么类型,只知道是一个人对象的句柄。

  在main方法中调用randPerson方法为数组填充Person对象,但具体情况我不清楚。当调用数组每个元素的eat方法时,动态绑定的作用就是执行对象的重定义方法。

  但是动态绑定是前提,绑定的方法必须存在于基类中,否则无法编译。

  类别人员{

  void eat() {

  system . out . println( person . eat());

  }

  }

  班级男生扩展人{

  void eat() {

  system . out . println( boy . eat());

  }

  void speak() {

  system . out . println( boy . speak());

  }

  }

  公共阶层人士{

  公共静态void main(String[] args) {

  Person p=新男生();

  p . eat();

  p . speak();//没有为Person类型定义speak()方法

  }

  }如果子类中没有定义override方法,将调用父类中的方法:

  类别人员{

  void eat() {

  system . out . println( person . eat());

  }

  }

  班级男生扩展人{

  }

  公共阶层人士{

  公共静态void main(String[] args) {

  Person p=新男生();

  p . eat();

  }

  }[运行结果]:

  Person.eat()

  2.静态方法的绑定

  将static关键字添加到上述所有方法中,并将其转换为静态方法:

  类别人员{

  静态void eat() {

  system . out . println( person . eat());

  }

  静态void speak() {

  system . out . println( person . speak());

  }

  }

  班级男生扩展人{

  静态void eat() {

  system . out . println( boy . eat());

  }

  静态void speak() {

  system . out . println( boy . speak());

  }

  }

  班级女生扩展人{

  静态void eat() {

  system . out . println( girl . eat());

  }

  静态void speak() {

  system . out . println( girl . speak());

  }

  }

  公共阶层人士{

  public static Person rand Person(){

  switch((int)(math . random()* 2)){

  默认值:

  案例0:

  返回新男孩();

  案例1:

  返回新女孩();

  }

  }

  公共静态void main(String[] args) {

  Person[] p=新人[4];

  for(int I=0;仪表板长度;i ) {

  p[I]=rand person();//随机生成男孩或女孩

  }

  for(int I=0;仪表板长度;i ) {

  p[i]。吃();

  }

  }

  }[运行结果]:

  Person.eat()

  Person.eat()

  Person.eat()

  Person.eat()观察到,对于静态方法,无论父类引用什么子类对象,都调用父类的方法。

  更多java相关文章,请关注java基础教程部分。以上是Java中继承图文的详细内容。更多请关注我们的其他相关文章!

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

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