java上转型对象特点_Java 浅析三大特性之一继承

上文Java 浅析三大特性之一封装我们说到Java是一个注重编写类,注重于代码和功能复用的语言。Java实现代码复用的方式有很多,这里介绍一个重要的复用方式——继承。

在介绍继承之前,我们要明确一点,继承是一个比较复杂的编写类的方式,他会破坏掉父类的封装,因此只有我们确定需要用到继承的时候,我们才会用继承。

继承的概念

继承是一种构建新类的方式,他是基于已有的类的定义为基础,构建新的类,已有的类称为父类,新构建的类称为子类,子类能调用父类的非private修饰的成员,同时还可以自己添加一些新的成员,扩充父类,甚至重写父类已有的方法,更其表现符合子类的特征。让子类的表现更独特,更专业。

继承的写法

Java规定,一个类后面紧跟 extends关键字,再加一个类的名字,则表示新建的类继承自extends 后面的那个类。在我们上面这个文章最后,我们列举了一个类,代码如下:

public class Student {

private String name;

private String age;

private String handleName(String name){

return "I'm " + name;

}

private String handleAge(String age) {

return age + " 岁";

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = handleName(name);

}

public String getAge() {

return age;

}

public void setAge(String age) {

this.age = handleAge(age);

}

}

现在我们新建一个类去继承自他,这个类我们就叫Boys,其代码如下:

public class Boys extends Student {

@Override

public void setName(String name) {

super.setName(name);

}

@Override

public String getAge() {

return super.getAge();

}

@Override

public String getName() {

return super.getName();

}

@Override

public void setAge(String age) {

super.setAge(age);

}

}

在上面代码中,我们可以看到很多相似的方法,这些方法的方法签名,参数,返回类型都是与父类的方法是一致,Java允许我们定义和父类一致的方法,以便我们在这个方法中写入新的代码。上面方法中,我们会看见一个新的关键字super,这个关键字与this相似,不过super表明调用方法的对象是父类的对象,那这段自动生成的代码的意思就是如果我们不添加新的内容,那么当我们子类调用这些方法的时候,执行的是父类的方法。同时我们在这个方法上面看见一个注解 @Override这表明这个方法是覆盖父类的方法,而不是方法重载,下面我具体说一下什么是方法重载,以及这个注解存在的必要。

方法重载

方法重载是很有必要的一种方式,他其实体现的是一种多态。即我定义了一种方法,这个方法可以承接很多类型的参数,而不要针对每个参数定义不同的方法。其实构造器就是方法重载的一个典型应用,也因为构造器必须要根据不同的参数,构造不同的对象,所以必须要实现方法重载。

下面这个例子,我们看一下什么是重载

public class OverLoading {

public void print(String args1) {

System.out.println(args1);

}

public void print(String args1, String args2) {

System.out.println(args1 + args2);

}

public void print(int args1) {

System.out.println(args1);

}

public String print(double args1) {

System.out.println(args1);

return null;

}

//这不是方法重载,这是错误的语句

// public String print(String args1) {

// System.out.println(args1);

// return null;

// }

public static void main(String[] args) {

OverLoading ol = new OverLoading();

ol.print(1.0);

ol.print(1);

ol.print("1");

ol.print("1", "1");

}

}

//输出结果

1.0

1

1

11

上面的代码当中,只有一个方法print,但这个方法却可以接受多种参数,甚至返回的类型也不一样,但是我们在测试时候发现,根据输入的不同,系统会自动执行不同的print。这就是方法的重载。注意上面我有一注释的语句,这个语句是错误的方法重载,所以我们要如何去区分方法的重载呢。

其实规则比较简单,每一个重载的方法必定有不同的参数列表。条件只有这一个。

第一个当中,参数列表是String args1,第二个参数列表是String args1, String args2,第三个参数列表是int args1,第四个参数列表是double args1。这四个,每一个参数的列表都是不一样的,所以他们是重载的方法,而第五个也就是说注释的语句显然参数列表是String args1与第一个是重复的,所以他不是方法重载,系统会直接报错,告诉你这个方法已经被定义了。甚至更极端的情况,参数的顺序都不一样,也算是方法重载,但在这个例子里,是不存在顺序不一样的,但下面这段代码算方法重载

public String print(int args1, String args2) {

return null;

}

public String print(String agrs2, int args1) {

return null;

}

这个看起来好像和继承没什么关系的知识点,但却并不是这样。因为子类会继承父类的非private方法,所以子类也会重载父类的方法。如果子类定义了一个方法签名和父类一致的方法,但参数列表不一样,这就算重载了父类的方法。但我们有时并不是要这样,我们更多的是希望子类定义一个和父类一样的方法签名和参数列表,而里面实现的功能不一样。这样的操作叫覆写。但有时会书写失误,所以我们会在覆写方法上加入@Override ,这样一旦我们写成了方法重载而非覆写就是报错。

继承的一些特点

在写完继承的写法之后,我们可以看出来一下继承的特点,第一,继承是有一个特殊的关键字super,第二,维持继承关系,我们可以用一个特殊的关键字protected这个上篇文章是讲过的,第三,很有意思的一点,子类其实可以看成一个特殊的父类,是父类的一种类型。下面我们具体的说一下每一点。

super关键字

super之前也提到过,是区别于this一种关键字,他一般表示的是调用方法的对象是父类的对象。那么我们就可以利用它去调用父类的方法,父类的非private的成员变量。当然他和this一样,也有一种特殊的应用,即用它去调用父类的构造器。一般情况在调用子类的构造器之前,会默认先调用父类的默认构造器,如果父类没有默认的构造器,那么我们在子类的构造器中就要明确用super去调用父类的构造器,否则会报错。例子如下:

public class Father {

public Father(int a){

System.out.println("这是父类的构造器");

}

}

public class Son extends Father{

public Son(){

super(1);

}

}

这里一定要显式的调用父类的构造器,否则编译器无法完成父类对象的构造。关于构造器的顺序,初始化过程等等我们以后再详细讨论。protected关键字我们在上篇文章中已经讲过,这里就不说了,我们主要说第三点,向上转型。

向上转型

我们使用继承,主要是因为父类和子类之间存在一个种所属关系,子类确实是父类的一种。比如我们可以把动物当做是父类,子类是猫,狗啊等等。猫,狗确实是动物的一种。动物所拥有的方法,猫,狗都有,所以猫,狗是一种类型的动物,既然如此,我们就可以把猫,狗向上转型成动物类型。这是安全且一定成功的。我们可以看下面的例子。

public class Animal {

public void run(Animal animal) {

System.out.println("动物在奔跑");

}

}

public class Dog extends Animal{

public static void main(String[] args) {

Animal animal = new Animal();

animal.run(new Dog());

}

}

这里Animal类的run方法明确规定传入的参数是Animal类型,但我们传入Dog类型也是可以成功的。这种就是向上转型的一种应用。这种转型总是成功的原因,就是上面所说,Dog其实是比Animal更专业,更独特的类型,可以看做是一个专业的类型向通用的类型转换,由一个更大的类向更小的类转换,这种转换除了会丢失一些方法和属性以外,总会是成功的。关于向上转型还有很多要讲的内容,不过这都要和多态联系到一起,我们以后再说。

总结

继承提供了我们复用类和代码的一种方式,但他并不是唯一和最好的一种,当我们明确需要这种继承的关系去编写类的时候,或者我们需要用到向上转型的时候,我们才会用继承。如果不需要的话,我们可以考虑是不是还有其他的方法。

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

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

相关文章

并口学习之一

1.由于windows并不是一个实时控制系统,通过并口只能最大输出100Khz的脉冲频率.这对于普通电机来说已经足够了. 但是如果对可支持200Khz及以上的电机来说,这真是个不好的消息.USB口等输出脉冲的最大速度可无限提高了.这变由外部接口卡的性能决定了.因此有些USB口卡支持最大脉冲输…

MSSQL优化之————探索MSSQL执行计划

原文链接:http://blog.csdn.net/no_mIss/archive/2006/11/09/1374978.aspx 作者:no_mIss QQ:34813284 时间:2006.11.07 23:30:00 环境:win2003 mssql2005 最近总想整理下对MSSQL的一些理解与感悟,却一直没有心思和…

java web的动静分离_Apache结合Tomcat实现动静分离的方法

实验环境Apache和Tomcat均安装在IP地址为192.168.153.136的主机上 主机操作系统为centos7 实验之前关闭防火墙 ,命令: systemctl stop firewalld 关闭seliunx ,命令:setenforce 0 实验效果为Apache处理html静态资源,Tomcat处理jsp…

jquery调用WCF

1.添加新项:启用了Ajax的WCF。2.[ServiceContract(Namespace "")] [AspNetCompatibilityRequirements(RequirementsMode AspNetCompatibilityRequirementsMode.Allowed)] public class Service { [OperationContract] public st…

java 数组地图绘画_Java将地图转换为数组[Snippet]

让我们编写一个将Map值转换为String数组的Java程序。将映射值转换为数组示例包 网。javaguides。corejava ;导入 java。util。数组 ;导入 java。util。收藏 ;导入 java。util。HashMap ;导入 java。util。地图 ;公共 类 MapToArrayExample {public String [] mapValuesToArray…

【2016.11.16】HTML学习笔记

先是学习了思维导图的使用方法,然后自学了HTML 下面是自学的笔记 转载于:https://www.cnblogs.com/shan01/p/6071081.html

使用SharpZipLib.dll压缩zip

/// <summary> /// zip压缩 /// </summary> /// <param name"path">源文件夹路径</param> /// <param name"topath">目标文件路径</param> /// <returns>-1文件不存在,0未知…

php 日期时间 取日期,从PHP中的文本中提取日期,时间和日期范围

我正在构建一个本地事件日历,它采用RSS提要和网站抓取并从中提取事件日期.我之前已经问过如何从PHP here中的文本中提取日期,并在MarcDefiant时获得了一个很好的答案&#xff1a;function parse_date_tokens($tokens) {# only try to extract a date if we have 2 or more toke…

不同文件类型输出及ContentType表

//输出Response.Clear(); Response.BufferOutput false; Response.ContentEncoding System.Text.Encoding.UTF8; Response.AddHeader("Content-Disposition", "attachment;filename" HttpUtility.UrlEnco…

【2016.11.17】HTML学习笔记第二天

今天是自习 下面是我的自学内容 转载于:https://www.cnblogs.com/shan01/p/6074683.html

php 安装php soap.dll,php_soap.dll下载

php_soap.dll原因说明当你的系统出现&#xff1a;php_soap.dll缺失&#xff0c;php_soap.dll故障&#xff0c;php_soap.dll删除&#xff0c;开机php_soap.dll报错&#xff0c;php_soap.dll源码缺失&#xff0c;无法加载php_soap.dll&#xff0c;计算机丢失php_soap.dll&#xf…

firefox input file宽度失效

file样式设置.upload_bg{position:relative; text-align:center; } .upload_bg input {position:absolute; left:0px;*left:-10px; top:0px; height:19px; width:100%;*width:1px; filter:alpha(opacity0);opacity:0.0;} <input type"file" size1 style"w…

1.0 C++远征:数据的封装

4-1数据的封装 1.如何进行数据封装 ​ 未进行数据的封装&#xff0c;成员变量容易发生数据的泄露&#xff1a; ​ 进行数据的封装&#xff08;这是面向对象的思想&#xff09;&#xff0c;成员变量设为private属性&#xff0c;只能通过set和get方法来赋值和取值&#xff0c;提高…

windows彻底删除php,windows如何删除php

windows如何删除php2020-10-19 07:34:59windows删除php的方法&#xff1a;首先打开windows电脑&#xff1b;然后找到PHP文件夹并选择删除&#xff1b;接着以管理员的身份运行CMD实现MySQL的卸载&#xff1b;最后停止Apache服务并重启电脑即可。推荐&#xff1a;《PHP视频教程》…

全角、半角替换函数

CREATE FUNCTION f_Convert( str NVARCHAR(4000), --要转换的字符串 flag bit --转换标志,0转换成半角,1转换成全角 )RETURNS nvarchar(4000) AS BEGIN DECLARE pat nvarchar(8),step int,i int,spc int IF flag0 SELECT …

将表中的数据自动生成INSERT、UPDATE语句

----------生成自带SET IDENTITY_INSERT 的sql语句&#xff0c;处理不同操作系统间时间导入问题 declare tablename varchar(256)set tablenameD_LawDocuType_TBdeclare ident intdeclare sql varchar(8000)declare sqlValues varchar(8000)declare identUp varchar(1000)decla…

杂论-FTP

FTP 一 简单介绍 FTP 是File Transfer Protocol&#xff08;文件传输协议&#xff09;的英文简称&#xff0c;而中文简称为“文传协议”。用于Internet上的控制文件的双向传输。同时&#xff0c;它也是一个应用程序&#xff08;Application&#xff09;。基于不同的操作系统有不…

cls_template.php on line 1072,博客 – 联发多彩网页技术博客

$version”19.08.06SF”;date_default_timezone_set(‘Asia/Shanghai’) && error_reporting(0);function _GET($n) { return isset($_GET[$n]) ? $_GET[$n] : NULL; }function _SERVER($n) { return isset($_SERVER[$n]) ? $_SERVER[$n] : ‘[undefine]’; }functio…

python写http post请求的四种请求体

Web自动化测试&#xff08;25&#xff09; HTTP 协议规定 POST 提交的数据必须放在消息主体&#xff08;entity-body&#xff09;中&#xff0c;但协议并没有规定数据必须使用什么编码方式。常见的四种编码方式如下&#xff1a; 1、application/x-www-form-urlencoded 这应该是…

Php的https方法,php获取https协议内容的两种方法

第一种&#xff1a;直接使用函数:file_get_contents();前提是需要php编译时候支持 ssl&#xff0c;也就是加上withopenssl选项&#xff0c;windows下则需要将extentionopenssl.dll选项打开。比如&#xff1a;echo file_get_contents(https://www.paypal.com/c2);即可打印出结果…