【Java学习笔记二】继承和多态

与C++不同的是,在Java中,一个类只能直接继承另一个类,而不允许继承多个类,这个新类称为继承类、派生类或者子类,而被继承的类称为基类或者父类。

继承类能够继承基类的群不属性和行为。

面向对象程序设计的三大特点为:封装、继承和多态
类的继承能够重复呢利用已有的类,在已有类的基础上进行必要的扩充和修改就可以得到具有新功能和用途的类,从而简化程序设计,提高了软件开发的重用性、可维护性和可靠性。

具体格式为:

<修饰词>class <派生类名> extends <父类名>
{<派生类成员表>
}

习惯要求派生类名第一个字母要大写。
派生类成员可以是对已有成员的重新定义,赋予新的含义和功能,也可以定义基类中不存在的成员。

Java不支持多重继承,因此继承结构为树状结构,树的最顶端额为java.lang.Object

在Object类中提供了许多的成员函数,其中主要的两个为:

  • public boolean equals(Object obj)如果调用对象等于参数对象时返回真。
  • public String toString返回一个描述调用对象字符串

对于派生类来讲,如果没有显式的定义构造函数在,则系统将定义一个缺省的构造函数,函数体首先使用super()语句来调用基类的无参数构造函数,对基类成员变量进行初始化,然后再调用派生类的无参数构造函数进行初始化。

在派生类中也能显示的定义构造函数,加上super()语句,实现对基类数据成员初始化的任务。

这里补充一下super的含义:super代表了父类,我们可以通过super来调用父类的构造函数,成员函数和成员变量。在一般情况下子类继承了父类的所有属性,因此一般情况下我们都不需要使用super,但是当子类的成员和父类发生冲突或者涉及到子类的构造函数的时候就会用到super。

当子类的成员和父类的成员重复的时候子类的成员会对父类覆盖,因此想要访问父类的成员时就必须使用super显式地调用父类的成员。(包含父类的成员变量和成员方法)。

子类的构造函数系统会默认在开头加上一句super();来访问父类的无参构造函数,无论我们是否定义了子类的构造函数(如果没有定义系统会默认定义一个无参构造函数,其中刚开始会运行super()来运行父类无参构造函数,然后会对子类中特有的变量进行初始化,如果我们定义了子类的构造函数,系统同样 的会在函数开头加上一句super()),这就会导致一个问题就是如果父类没有无参构造函数就会发生错误

在类中,若定义了构造函数,则系统不会隐含定义无参构造函数。如果定义了一个有参构造函数则访问其无参构造函数是错误的

如果父类只有有参构造函数我们在子类的构造函数中就不能调用super(),所以我们必须显式调用父类的有参构造函数,即super(参数列表);

如果想要了解详细情况可以移步:传送门1 | 传送门2

派生类对基类成员的继承:若派生类继承的是不同包中的父类,则只能直接访问父类中属于publicprotected属性的成员,不能访问私有和缺省访问的成员,若派生类继承的是同一包中的父类,则能够直接访问公有、保护和缺省访问权限的成员,不能访问私有成员,即私有成员永远不能被继承。(体现其封装性的、隐藏性的特点)

多态:一个方法可以有一个名称多种形态。多态实现了“接口与实现的分离”,将“是什么”和“怎么做”分离,改善程序的组织框架以及可读性,提高程序的可扩展性。
在Java中多态有两种表现形式:

  1. 重写(Override)
    也称作覆盖,指子类通过继承覆盖父类中的方法。
    重写规则:
  • 参数列表必须完全与被重写方法相同
  • 返回类型必须是被重写方法返回值的派生类(当然可以相同)(java5及更早版本必须一样)
  • 访问权限不能比父类中被重写的方法访问权限更低。
  • 声明为final或者static的方法不能被重写,但是声明为static的方法可以再次声明(不太理解)
  • 重写的方法能够抛出任何非强制异常,无论被重写的方法是否抛出异常,但是重写方法不能抛出新的 强制性异常,或者比被重写方法更广泛的强制性异常。
  • 构造方法不能重写

当需要在子类中调用父类的被重写方法时,要使用super关键字。

  1. 重载(Overload)
    指在用一个类中可以定义多个同名的方法,只要确定他们的参数个数和类型不同即可。与返回值没有关系

在这里插入图片描述

在实际程序设计中,我们用父类的引用对象(指针)指向不同的实例化对象(分配到内存),即用父类的引用对象分别指向父类和子类的实例化成员就可以实现多态。

但是需要注意到一点是:只有方法会被覆盖,属性(变量)不会被覆盖!!!

因此如果我们用父类的引用对象指向子类的实例化,那么我们访问的方法是经过父类中经过子类重写后(如果没有重写就是父类本身)的方法,但是访问的属性只能是父类的,而且我们也不能访问父类没有的子类特有的方法。

例如:

class Father
{int age;Father() {age=40;} void eat() {System.out.println("爸爸在吃饭");}
}
class Son extends Father
{int age;Son() {age=19;}void eat() {System.out.println("儿子在吃饭");}void play() {System.out.println("儿子在玩SC2");}
}class Main()
{public static void main(String[] args){Father a=new Son();System.out.println("年龄为"+a.age);a.eat();//a.play();}
}

运行结果为
在这里插入图片描述

如果想要运行a.play();时就会出错。

如果想要了解更多请戳这里

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/383841.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用poll实现的io多路复用服务端和客户端

http://blog.csdn.net/robertkun/article/details/52269313 参考&#xff1a;http://www.cnblogs.com/Anker/p/3261006.html 使用poll实现的io多路复用服务端和客户端。 客户端通过子进程创建多个客户端连接。 客户端每隔1秒向服务端发送一个时间戳&#xff0c; 服务端接收到时…

【Java学习笔记三】抽象类与接口

对象的类型转换分为自动转换和强制转换两种 派生类向基类转换是自动转换&#xff0c;因为派生类中包含基类基类向派生类的转换是强制转换 强制类型转换是通过在转换对象前面使用圆括号运算符来实现&#xff0c;圆括号内为要转换的目标类型&#xff0c;格式为&#xff1a; (&…

Epoll 的tcp通信代码(服务器+客户端)

http://blog.csdn.net/libinbin_1014/article/details/50096187 Epoll 的tcp通信代码&#xff08;服务器客户端&#xff09; /* gcc -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS64 -I${ORACLE_HOME}/rdbms/public -I${ORACLE_HOME}/rdbms/demo -L${ORACLE_HOME}/lib -lclntsh …

【Java学习笔记四】Java中的包

包的声明和引入&#xff1a;在Java语言系统中&#xff0c;Java编译器为每一个类生成一个字节码文件&#xff08;.class&#xff09;&#xff0c;为了对类文件进行分层和按用途分类管理&#xff0c;同时也为了解决相同类名的文件冲突的问题&#xff0c;Java提供了包机制来管理类…

Linux系统编程——线程池

http://blog.csdn.net/tennysonsky/article/details/46490099# 线程池基本原理 在传统服务器结构中&#xff0c;常是有一个总的监听线程监听有没有新的用户连接服务器&#xff0c;每当有一个新的用户进入&#xff0c;服务器就开启一个新的线程用户处理这 个用户的数据包。这个线…

【Java学习笔记五】Java异常处理

异常通常分为三类&#xff1a; 程序可控制的异常&#xff1a;一般是可预见的错误&#xff0c;不是致命的。例如&#xff1a;除数为0&#xff0c;数组下标越界。程序不可控制的的异常&#xff1a;这种异常往往是致命的&#xff0c;但是系统可以预见的。例如&#xff1a;系统栈溢…

【C++学习笔记一】C++类和对象详解

类定义是以关键字class开头&#xff0c;后面跟类的名称。主体是包含在一对花括号中。类定义后必须跟着一个分号或一个声明列表。 类的对象的公共数据成员可以使用直接成员访问运算符.来访问。需要注意的是&#xff0c;私有的成员和受保护的成员不能直接使用成员访问运算符来访…

C语言实现的简单的线程池

http://www.linuxidc.com/Linux/2013-01/77619.htm 有时我们会需要大量线程来处理一些相互独立的任务&#xff0c;为了避免频繁的申请释放线程所带来的开销&#xff0c;我们可以使用线程池。下面是一个C语言实现的简单的线程池。 头文件&#xff1a; 1: #ifndef THREAD_POOL_H_…

C++获取当前时间

可以使用windowsAPI直接获取。 例如&#xff1a; #include<windows.h> #include<cstdio>using namespace std;int main() {SYSTEMTIME now;GetLocalTime(&now);printf("现在是%02d时%02d分%02d秒\n",now.wHour,now.wMinute,now.wSecond);printf(&…

成员函数后面加上const的作用

const表示成员函数不会修改类中的数据成员。 规则&#xff1a; 在类中被const 声明的函数只能访问const 函数&#xff0c;而非const 函数可以访问任意成员函数。在成员函数中不管数据是否具有const 属性&#xff0c;编译器检查的的是是否有修改&#xff08;赋值&#xff0c;自…

简单Linux C线程池

http://www.cnblogs.com/venow/archive/2012/11/22/2779667.html 大多数的网络服务器&#xff0c;包括Web服务器都具有一个特点&#xff0c;就是单位时间内必须处理数目巨大的连接请求&#xff0c;但是处理时间却是比较短的。在传统的多线程服务器模型中是这样实现的&#xff1…

C++创建对象:栈和堆的区别

首先我们应该了解栈和堆的差别&#xff1a; 详细信息&#xff1a;传送门 栈相当于函数自带的存储空间&#xff0c;在windows下一般为2M,在Linux下一般为8M&#xff0c;存取速度稍微快一点。堆是系统的空间&#xff0c;相对较大&#xff0c;一般为2G&#xff0c;效率稍微慢一点…

IO多路复用之poll总结

http://www.cnblogs.com/Anker/p/3261006.html 1、基本知识 poll的机制与select类似&#xff0c;与select在本质上没有多大差别&#xff0c;管理多个描述符也是进行轮询&#xff0c;根据描述符的状态进行处理&#xff0c;但是poll没有最大文件描述符数量的限制。poll和select同…

【C++学习笔记二】C++继承

继承 继承允许我们一句另一个类来定义一个类&#xff0c;这使得继承和维护一个程序变得更加容易&#xff0c;也达到了重用代码功能和提高执行效率的效果。 一般格式为&#xff1a; class 派生类名 :访问修饰符 基类名{};其中访问修饰符是public protected private中的一个&a…

处理大并发之二 对epoll的理解,epoll客户端服务端代码

http://blog.csdn.net/wzjking0929/article/details/51838370 序言&#xff1a; 该博客是一系列的博客&#xff0c;首先从最基础的epoll说起&#xff0c;然后研究libevent源码及使用方法&#xff0c;最后研究nginx和node.js&#xff0c;关于select,poll这里不做说明&#xff0c…

C++基类指针指向派生类(指针)

我们常用基类指针指向派生类对象来实现多态性。 私有继承不允许基类指针指向派生类 基类指针只能访问到基类中含有的公有成员。 当用基类指针指向派生类对象在动态分配堆上内存的时候&#xff0c;析构函数必须是虚函数! 成员如果是数据成员的话访问的是基类的版本&#xff…

C++虚继承中构造函数和析构函数顺序问题以及原理

多重继承的问题&#xff1a;多个类B,C,…继承同一个类A导致如果X继承了B,C,…那么在X中将还有多个A中成员的拷贝&#xff0c;如果想要访问A中的成员如果不加名字空间将会导致二义性&#xff0c;这种拷贝大多是没有实际意义的&#xff0c;为了避免这种空间浪费&#xff0c;C有虚…

一个简单的linux线程池

http://blog.csdn.net/wzjking0929/article/details/20312675 线程池&#xff1a;简单地说&#xff0c;线程池 就是预先创建好一批线程&#xff0c;方便、快速地处理收到的业务。比起传统的到来一个任务&#xff0c;即时创建一个线程来处理&#xff0c;节省了线程的创建和回收的…

【C++学习笔记三】C++多态、抽象(接口)

当类之间存在多种层次结构&#xff0c;并且类之间通过继承关联时就会用到多态。 虚函数在子类中的覆盖版本和该函数在基类中的原始版本必须有相同的函数签名、函数名、形参名、常属性。如果返回值为非类类型&#xff0c;则必须相同&#xff0c;如果是类类型A的指针或者引用&am…

C++重载和重写的条件以及重写后对基类函数的覆盖

重载&#xff1a;同一个类中名字相同&#xff0c;参数列表不同的方法构成重载函数&#xff0c;和返回值没有关系。这就意味着就算返回值不同&#xff0c;只要名字相同参数列表相同编译器还是会报错&#xff0c;觉得一函数被定义了两次。 重写&#xff1a;派生类中只要函数名字…