技术标签: Java extends 继承 Java进阶之路
利用继承,我们可以基于已存在的类构造一个新类。继承的好处在于,子类可以复用父类的非 private
的方法和非 private
成员变量。
is-a
是继承的一个明显特征,就是说子类的对象引用类型可以是一个父类。我们可以将通用的方法和成员变量放在父类中,达到代码复用的目的;然后将特殊的方法和成员变量放在子类中,除此之外,子类还可以覆盖父类的方法。这样,子类也就焕发出了新的生命力。
一个对象变量可以引用多种类型的现象被称为多态。多态发生的前提条件就是继承。也就是说,先有继承,后有多态。
class Wanger {
public void write() {
System.out.println("我为自己活着");
}
}
class Wangxiaoer extends Wanger {
public void write() {
System.out.println("我也为自己活着");
}
}
class Test {
public static void main(String [] args) {
Wanger wanger;
wanger = new Wanger();
wanger = new Wangxiaoer();
Wangxiaoer wangxiaoer;
//wangxiaoer = new Wanger(); // 不可以
wangxiaoer = new Wangxiaoer(); // 只能这样
}
}
wanger
这个对象变量既可以引用 Wanger
对象,也可以引用 Wangxiaoer
对象。但 wangxiaoer
就只能引用 Wangxiaoer
对象,不能引用 Wanger
对象。根本的原因在于 Wangxiaoer
是 Wanger
的继承者。
当使用 wanger
调用 write()
方法时,程序会在运行时自动识别其引用的对象类型,然后选择调用哪个方法——这种现象称为动态绑定。
动态绑定有一个非常重要的特性:无需对现有的代码进行修改,就能对程序进行扩展。假如 Wangdaer
也继承了 Wanger
,并且 wanger
引用了Wangdaer
的对象,那么 wanger.write()
仍然可以正常运行。
当然了,有些类不愿意被继承,也没法被继承。谁不愿意被继承呢?比如武则天,亲手弄死自己的亲儿子。谁没法被继承呢,每朝每代最后的那位倒霉皇帝。
类怎么做到不被继承呢?可以使用 final
关键字。final
关键字修饰的类不能被继承,final
修饰的方法不能被覆盖。
final class Wanger {
public final void write() {
System.out.println("你们谁都别想继承我");
}
}
继承是面向对象编程当中举足轻重的一个概念,与多态、封装共为面向对象的三个基本特征。 继承可以使得子类具有父类的成员变量和方法,还可以重新定义、追加成员变量和方法等。
在设计继承的时候,可以将通用的方法和成员变量放在父类中。但不建议随心所欲地将成员变量以 protected
的形式放在父类当中;尽管允许这样做,并且子类可以在需要的时候直接访问,但这样做会破坏类的封装性(封装要求成员变量以 private
的形式出现,并且提供对应 getter / setter
用来访问)。
Java 是不允许多继承的,为什么呢?
如果有两个类共同继承一个有特定方法的父类,那么该方法会被两个子类重写。然后,如果你决定同时继承这两个子类,那么在你调用该重写方法时,编译器不能识别你要调用哪个子类的方法。
这也正是著名的菱形问题,见下图。ClassC 同时继承了 ClassA 和 ClassB,ClassC 的对象在调用 ClassA 和 ClassB 中重载的方法时,就不知道该调用 ClassA 的方法,还是 ClassB 的方法。
在 Java 中,所有类都由 Object 类继承而来。Object 这个单词的英文意思是对象,是不是突然感觉顿悟了——万物皆对象?没错,Java 的设计者真是良苦用心了啊!现在,你一定明白了为什么 Java 是面向对象编程语言的原因。
你可能会疑惑地反问道:“我的类明明没有继承 Object 类啊?”如果一个类没用显式地继承某一个类,那么它就会隐式地继承 Object 类。换句话说,不管是鸡生了蛋,还是蛋孵出了鸡,总有一只 Object 鸡或者一个 Object 蛋。
在面试的时候,你可能会被问到这么一个问题:“Object 类包含了哪些方法呢?”
1)protected Object clone() throws CloneNotSupportedException
创建并返回此对象的副本。
不过,《阿里巴巴 Java 开发手册》上建议:慎用 Object 的 clone 方法来拷贝对象。因为 Object 的 clone 方法默认是浅拷贝,如果想实现深拷贝需要重写 clone 方法实现属性对象的拷贝。
什么是浅拷贝,什么是深拷贝呢?
浅拷贝是指在拷贝对象时,会对基本数据类型的变量重新复制一份,而对于引用类型的变量只拷贝了引用,并没有对引用指向的对象进行拷贝。
深拷贝是指在拷贝对象时,同时对引用指向的对象进行拷贝。
浅拷贝和深拷贝的区别就在于是否拷贝了对象中的引用变量所指向的对象。
2)public boolean equals(Object obj)
判断另一对象与此对象是否「相等」。
该方法使用的区分度最高的“==”操作符进行判断,所以只要两个对象不是同一个对象,那么 equals()
方法一定返回 false
。
《阿里巴巴 Java 开发手册》上强调:由于 Object 的 equals 方法容易抛出空指针异常,所以应该使用常量或者确定不为 null 的对象来调用 equals。
正例:"test".equals(object);
object.equals("test");
在正式的开发项目当中,最经常使用该方法进行判断的就是字符串。不过,建议使用org.apache.commons.lang3.StringUtils
,不用担心出现空指针异常。具体使用情况如下所示:
StringUtils.equals(null, null) = true
StringUtils.equals(null, "abc") = false
StringUtils.equals("abc", null) = false
StringUtils.equals("abc", "abc") = true
StringUtils.equals("abc", "ABC") = false
3)public native int hashCode()
返回此对象的哈希码。hashCode()
是一个 native
方法,而且返回值类型是整形;实际上,该方法将对象在内存中的地址作为哈希码返回,可以保证不同对象的返回值不同。
A native method is a Java method whose implementation is provided by non-java code.
native
方法是一个Java
调用非Java
代码的接口。该方法的实现由非Java
语言实现,比如 C。这个特征并非Java
所特有,其它的编程语言也有这个机制,比如C++
。
hashCode()
通常在哈希表中起作用,比如 HashMap
。
向哈希表中添加 Object
时,首先调用 hashCode()
方法计算 Object
的哈希码,通过哈希码可以直接定位 Object
在哈希表中的位置。如果该位置没有对象,可以直接将 Object
插入该位置;如果该位置有对象,则调用 equals()
方法比较这个对象与 Object
是否相等,如果相等,则不需要保存 Object
;如果不相等,则将该 Object
加入到哈希表中。
4)protected void finalize() throws Throwable
当垃圾回收机制确定该对象不再被调用时,垃圾回收器会调用此方法。不过,fnalize
机制现在已经不被推荐使用,并且在 JDK 9 开始被标记为 deprecated
(过时的)。
5)public final Class getClass()
返回此对象的运行时类。
当我们想知道一个类本身的一些信息(比如说类名),该怎么办呢?这时候就需要用到 Class
类,该类包含了与类有关的信息。请看以下代码:
Wanger wanger = new Wanger();
Class c1 = wanger.getClass();
System.out.println(c1.getName());
// 输出 Wanger
6)public String toString()
返回此对象的字符串表示形式。
《阿里巴巴 Java 开发手册》强制规定:POJO 类必须重写 toString
方法;可以使用 Eclipse 直接生成,点击 「Source」→「Generate toString」。示例如下:
class Wanger {
private Integer age;
@Override
public String toString() {
return "Wanger [age=" + age + "]";
}
}
重写 toString()
有什么好处呢?当方法在执行过程中抛出异常时,可以直接调用 POJO 的 toString()
方法打印其属性值,便于排查问题。
POJO(Plain Ordinary Java Object)指简单的 Java 对象,也就是普通的
JavaBeans
,包含一些成员变量及其getter / setter
,没有业务逻辑。有时叫做 VO (value - object),有时叫做 DAO (Data Transform Object)。
本篇,我们先谈了面向对象的重要特征继承;然后谈到了继承的终极父类 Object
!
在日常开发中,有些API接口会限制请求的元素个数,这时就需要把一个大列表分割为固定的小列表,再进行相关处理,本文搜集了几个简单的方法,分享出来供大家参考学习,下面来看看详细的介绍:方法示例? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ...
转摘:http://blog.csdn.net/maopig/article/details/67844111、宏块匹配像素精度: MPEG2中,运动估计的精度是1/2的像素,通过线性插值实现(可能有简单修正); H264和MPEG4 都可以支持1/4像素的精度2、参考帧的数量:
计算机在材料科学中的应用论文篇二《计算机技术在材料科学中的应用》摘要:现如今,我国各产业都朝向精细化和完整化的趋势发展,因此计算机技术的应用必不可少,且对其需求不断提高。另一方面,应用于各领域的材料科学也逐渐引起人们的重视。在此背景下,本文综合分析讨论了计算机在材料科学中的应用领域,及其实际应用的方向,以期进一步推进计算机在材料科学中的发展。关键字:计算机 材料科学 应用计算机作为电子信息时代的基...
1. 滤波器介绍滤波器作为图像处理课程的重要内容,大致可分为两类,空域滤波器和频率域滤波器。本文主要介绍常用的四种滤波器:中值滤波器、均值滤波器、高斯滤波器、双边滤波器,并基于opencv做出实现。空域的滤波器一般可以通过模板对原图像进行卷积。注意:空域滤波器和频率域滤波器对比1)空间域指图像本身,空域变换直接对图像中的像素进行操作。2)图像变换是将图像从空间域变换到某变换域(如 ...
JavaWebJava. web1. 基本概念1.1 前言web开发:web:网页的意思 www.baidu.com静态webhtml. Css提供给所有人看的数据始终不会发生变化!动态web淘宝等,几乎是所有的网站!提供给所有人看的数据始终会发生变化,每个人在不同的时间,不同的地点看到的信息各不相同!技术栈:Servlet/JSP,ASP,P...
当前pyecharts版本为1.9.0概述render包结构render包位于pyecharts包顶级目录中,用于渲染图表。render包结构如下:├─render # 渲染设置包│ │ display.py # 定义HTML、JavaScript显示类,用于支持在notebook中嵌入输出结果│ │ engine.py # 定义渲染相关类、函数│ │ snapshot.py # 定义渲染图片函数│ │ __init__.py # 暴露渲染图片函数│ ││ ├─tem
我是一名前端开发工程师,最近入手了一台MacBook Pro,之前用的是win10,上面倒是跑着一个mac虚拟机。。对于mac的操作基本还是从零开始。趁机捂着脸赶紧捡起博客!!好久好久没写博客了。。真是要不得!! P.S.mac真心棒啊。。屏幕超级喜欢啊。。已经脱离鼠标啦。。可是也真是贵啊。。。-_-
GitLab 是一款免费的开源 DevOps 软件,它附带多种工具,可在单个应用程序中开发、保护和操作软件。它提供免费的无限存储库和无限的协作者。它主要用于托管 Git 存储库,并具有其他与开发相关的功能,例如问题跟踪。它与 Github 和 Bitbucket 非常相似,允许个人和团队与他人远程共享代码。GitLab 有四个主要版本:GitLab 社区版- 免费、开源和自托管。GitLab 企业版- 自托管和付费附加功能。GitLab.com - 免费和 SaaS。GitLab.io - 由
1. tiltShift.js TiltShift.js 是一个jQuery插件,它使用CSS3图片过滤器来代替倾斜偏移效果,这个概念证明只支持 Chrome & Safari 6浏览器。您可以定义聚焦点,模糊半径,在焦点中的面积大小,完整的焦点和完整的模糊量之间的面积,和方向的效果。2. Responsive Measures使您可以通过选择器来产生理
原标题:用C语言验证“6174数学黑洞之谜”?我们先来看看五组实验结果请输入一个互不相同的四位数:3758输入的四位数是:3758第1次:8753 - 3578 = 5175第2次:7551 - 1557 = 5994第3次:9954 - 4599 = 5355第4次:5553 - 3555 = 1998第5次:9981 - 1899 = 8082第6次:8820 - 288 = 8532第7次:...
TSO (TCP Segmentation Offload) 是一种利用网卡替代CPU对大数据包进行分片,降低CPU负载的技术。如果数据包的类型只能是TCP,则被称之为TSO。此功能需要网卡提供支持。TSO 是使得网络协议栈能够将大块 buffer 推送至网卡,然后网卡执行分片工作,这样减轻了CPU的负荷,其本质实际是延缓分片。这种技术在Linux中被叫做GSO(Generic Segmentat
MySQL回滚工具binlog2sql使用介绍发布时间:2020-03-08 20:10:02来源:51CTO阅读:7958作者:wjw555参数介绍:参考官网地址:https://github.com/danfengcao/binlog2sql直接从官网下载软件包,照着github上给的方法,虽然可以安装成功,但是执行如下命了报错,由于此工具源代码是是别人所写,目前暂时没找到是代码的哪个地方导致...