Java面向对象编程之类的继承详解

 更新时间:2018年02月02日 11:45:06   作者:毕加索的ma  
这篇文章主要介绍了Java面向对象编程之类的继承,结合实例形式较为详细的分析了Java面向对象编程类的概念、功能、使用方法及相关注意事项,需要的朋友可以参考下

本文实例讲述了Java面向对象编程之类的继承。分享给大家供大家参考,具体如下:

继承:特殊类拥有一般类的全部属性与行为。

继承好处:

1.提高了代码的复用性

2.让类与类之前产生了关系,有了这个关系才有多态的特性。继承是类和类之前的关系。

注意事项:

1.java只支持单继承,不支持多继承。因为多继承有安全隐患:当多个父类定义相同的函数,但是功能不同时,子类不知道运行哪一个。

2.子类继承父类时,继承了父类的所有方法和属性,可直接使用。

3,java支持多层继承,即:孙-子-父的关系

语法:

[类修饰符] class 子类名 extends 父类名{
  语句;
}

例如:

class Pserson
{
  int age;
  String name;
  public void speak()
  {
    System.out.println("Hello World!");
  }
}
//继承Person类,继承了父类所有方法和属性
class Student extends Pserson
{
  public void study()
  {
    System.out.println("Good Study!");
  }
}
//继承Person类,继承了父类所有方法和属性
class Worker extends Pserson
{
  public void work()
  {
    System.out.println("Good work!");
  }
}

如何使用一个继承体系中的功能(查阅api文档):

查阅父类的功能,创建子类对象使用功能

在继承过程中经常遇到这三种场景:

1)同名变量

1.如果子类出现非私有的同名成员变量时,子类访问本类的变量,用this;子类访问父类中的同名变量,用super。
2.this代表本类对象的引用
3.super代表父类对象的引用(用法和this相同)

2)同名函数

1.如果子类出现和父类一模一样的函数时(函数名和参数都相同),当子类对象调用该函数,会运行子类函数内容。,父类的函数会被覆盖(也叫重写)。

2.重写定义:当子类继承父类,沿袭了父类的功能,到子类中。但子类虽具备该功能,但功能的内容和父类不一致,这时,没有必须要定义新功能,而是使用覆盖特性,保留父类的功能定义,并重写功能内容。

3.重写(覆盖)注意事项:

<1>子类覆盖父类,必须保证子类的权限大于等于父类的权限,才能继承,否则编译失败。(public>不写修辞关键词>private)
<2>静态只能覆盖静态
<3>重载:只看同名函数的参数列表 重写:子父类方法要一模一样(函数名和参数列表)

class Fu
{
  //public void show()  当父类为show()时,会和子类函数一模一样,父类的show函数会被重写
  public void show(String name) //父类的show函数和子类不一样(参数列表不一样),因此父类的show函数不会被重写
  {
    System.out.println(name);
  }
}
class Zi extends Fu
{
  public void show()
  {
    System.out.println("zi");
  }
}
class Jicheng
{
  public static void main(String[] args)
  {
    Zi z1=new Zi();
    z1.show("nihao");//会调用父类的show函数
  }
}

3)构造函数

1.在对子类对象进行初始化时,父类的构造函数也会运行,因为子类的构造函数的第一行默认有一条隐式语句super()

2.super()会访问父类中空参数的构造函数,而且子类中所有的构造函数第一行默认都是super()

3.子类一定要访问父类构造函数原因

<1>因为父类中的数据子类可以直接获取,所以子类在创建是,先看看父类如何对这些数据进行初始化的,所以子类在对象初始化时,默认先访问父类的构造函数。
<2>若要访问父类制定的构造函数或者父类没有空参数的构造函数时,可以通过手动定义super语句的方式来制定。
<3>当然子类的构造函数第一行也可以手动指定this语句来访问本类的构造函数,但子类中至少有一个构造函数会访问父类的构造函数

class Fu
{
  String name;
  int age;
  Fu(){System.out.println("Hello Fu");}
  Fu(String name)
  {
    System.out.println(name);
  }
  Fu(String name,int age)
  {
    this.name=name;
    this.age=age;
    System.out.println("name: "+name+",age: "+age);
  }
}
class Zi extends Fu
{
  //Zi(){System.out.println("Hello Zi");}  默认先会调用父类的无参构造函数
  Zi()
  {
    super("zhangsan",20);//手动用super语句指定父类的构造函数,来获取父类非私有的信息
    System.out.println(name+"::"+age);
  }
}
class Test
{
  public static void main(String[] args)
  {
    Zi z1=new Zi();
  }
}

构造函数异常例子:

写出程序结果

class Super
{
  int i=0;
  public Super(String s)
  {
    i=1;
  }
}
class Demo extends Super
{
  public Demo(String s)
  {
    i=2;
  }
  public static void main(String[] args)
  {
    Demo d=new Demo("yes");
    System.out.println(d.i);
  }
}
//编译失败,因为父类中缺少空参数的构造函数。
//或者子类应该通过super语句指定要调用的父类中的构造函数。

重写和重载例子:

class Demo
{
   int show(int a,int b){return 0;}
}

下面那些函数可以存在于Demo的子类中。

A.public int show(int a,int b){return 0;}//可以,覆盖。
B.private int show(int a,int b){return 0;}//不可以,权限不够。
C.private int show(int a,long b){return 0;}//可以,和父类不是一个函数。没有覆盖,相当于重载。
D.public short show(int a,int b){return 0;}//不可以,因为该函数不可以和给定函数出现在同一类中,或者子父类中。
E.static int show(int a,int b){return 0;}//不可以,静态只能覆盖静态。<br><br>因此子类允许重写和重载。

更多java相关内容感兴趣的读者可查看本站专题:《Java面向对象程序设计入门与进阶教程》、《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧汇总》和《Java缓存操作技巧汇总

希望本文所述对大家java程序设计有所帮助。

相关文章

  • Java多线程下载网图的完整案例

    Java多线程下载网图的完整案例

    这篇文章主要给大家介绍了关于Java多线程下载网图的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • 利用Java手写一个简易的lombok的示例代码

    利用Java手写一个简易的lombok的示例代码

    Lombok是一款Java开发插件,使得Java开发者可以通过其定义的一系列注解来消除业务工程中冗长和繁琐的代码,尤其对于简单的Java模型对象。本文就来手写一个简易的lombok,需要的可以参考一下
    2022-10-10
  • Java设计模式之桥接模式的示例详解

    Java设计模式之桥接模式的示例详解

    桥梁模式是对象的结构模式。又称为柄体(Handle and Body)模式或接口(Interface)模式。本文将通过示例来详细讲解一下这个模式,感兴趣的可以学习一下
    2022-02-02
  • JAVA设计模式---原型模式你了解吗

    JAVA设计模式---原型模式你了解吗

    这篇文章主要介绍了JAVA 原型模式的的相关资料,文中讲解非常细致,实例帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2021-09-09
  • 使用MyBatis-Generator如何自动生成映射文件

    使用MyBatis-Generator如何自动生成映射文件

    这篇文章主要介绍了使用MyBatis-Generator如何自动生成映射文件,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • IDEA之如何快速生成get和set方法

    IDEA之如何快速生成get和set方法

    这篇文章主要介绍了IDEA之如何快速生成get和set方法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-05-05
  • SpringBoot入门教程详解

    SpringBoot入门教程详解

    SpringBoot 是由 Pivotal 团队提供的全新框架,其设计目的是用来简化 Spring 应用的初始搭建以及开发过程。本文将详细为大家讲讲SpringBoot是使用,需要的可以参考一下
    2022-06-06
  • SpringBoot+MQTT+apollo实现订阅发布功能的示例

    SpringBoot+MQTT+apollo实现订阅发布功能的示例

    这篇文章主要介绍了SpringBoot+MQTT+apollo实现订阅发布功能的示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-06-06
  • Maven实现自己的starter依赖

    Maven实现自己的starter依赖

    本文主要介绍了Maven实现自己的starter依赖,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • Spring Boot集成教程之异步调用Async

    Spring Boot集成教程之异步调用Async

    在项目中,当访问其他人的接口较慢或者做耗时任务时,不想程序一直卡在耗时任务上,想程序能够并行执行,我们可以使用多线程来并行的处理任务,也可以使用spring提供的异步处理方式@Async。需要的朋友们下面来一起看看吧。
    2018-03-03

最新评论