Java的三大特性之继承
此处我会分为这几个部分来理解继承是怎么样的:
1、区分封装、继承和多态
2、区分限定词的范围
3、区分隐藏、覆盖、重载
4、继承的理解
5、一道面试题的原型
---------------------------------------这里是友好的分隔线----------------------------------------
一般我们都会说Java的三大特性有:封装、继承、多态。现在先来捋顺一下它们的概念加以区分。
封装
封装就是将类的信息隐藏在类内部,不允许外部程序直接访问,而是通过该类的方法实现对隐藏信息的操作和访问。
可以这么理解:
1、封装可以把一个对象的属性私有化,同时可以选择性地提供可以被外界访问的方法(getter、setter)。
2、封装可以使我们更容易地对一个对象的内部进行操作。
3、封装可以让我们对成员变量进行更为精准的控制,像是对成员变量使用限定符,还有判断属性值的合法性。
继承
继承是类与类的一种关系,是使用已存在的类的顶底作为基础建立新类的技术。新类的定义可以增加新的数据或新的功能,也可以使用父类的功能,不能选择性地继承父类,但是父类可以选择性地让子类继承一些属性。
可以这么理解:
1、父类拥有的“财产”可以让子类来继承,但是父类有权利选择给子类继承多少“财产”,而子类没有权利选择性地继承父类给的“财产”。
2、子类也可以通过自己的双手去创造自己的“财富”,可以对父类的“财产”进行扩展。
3、子类可以通过“覆盖”、“隐藏”来实现自身的特殊的价值(后文会重点提到)。
另外,对于继承来说有三个关键字不得不提:构造器、protected、向上转型,后文会提及。
多态
多态指的是对象的多种形态。多态有两种:引用多态和方法多态。继承是多态的实现基础。
1、引用多态
父类的引用可以指向本类的对象;父类的引用可以指向子类的对象。
public class Test{
public static void main(String[] args){
//父类的引用可以指向本类的对象
Animal ani1 = new Animal();
//父类的引用可以指向子类的对象
Animal ani2 = new Dog();
}
}
2、方法多态
创建父类对象时,调用的方法为父类方法;
创建子类对象时,调用的方法是子类重写的方法或继承自父类的方法;
参考:
https://www.cnblogs.com/BoscoGuo/p/5877185.html
---------------------------------这里是友好的分隔线-----------------------------------
我们所说的限定词有四种,public、protected、默认、private。
这里就简单说一下他们的区别。
范围 |
public |
protected |
默认 |
private |
同类 |
||||
同包子类 |
||||
非同包子类 |
||||
非同包非子类 |
(注意:这里重点区分一下protected和默认的区别)
参考:http://blog.51cto.com/ironkui/1755385
-------------------------------------------这里是友好的分隔线-----------------------------------------
接下来我们来了解一下隐藏、覆盖和重载的区别
重载
重载是方法名相同,但是参数不同的多个同名函数
注意:参数不同的意思是指参数类型、参数个数和参数顺序之中至少有一个不同,但是返回值和异常已经访问修饰符不能算作是重载的条件,另外main方法也还是可以重载的。
覆盖
覆盖是子类重写父类的方法,要求方法名和参数类型完全一样(参数不能是子类),返回值和异常比父类小或者是相同(即为父类的子类),限定符范围比父类的大或者相同。
注意:子类实例方法不能覆盖父类的静态方法;子类的静态方法也不能覆盖父类的实例方法。
隐藏
隐藏是指当父类和子类拥有相同名字的属性或者方法时,父类的同名的属性或者方法形式上不见了,实际上还是存在的。
注意:父类的实例变量和静态变量能被子类的同名变量隐藏;父类的静态方法被子类的同名静态方法隐藏;父类的实例方法被子类的同名实例变量覆盖。
也就是说,不能用子类的静态方法覆盖父类中同样签名(参数签名完全一样)的实例方法;不能用子类的实例方法覆盖父类中同样表示的静态方法;变量只能被隐藏而不会被覆盖。
隐藏和覆盖的区别:
被隐藏的属性,在子类被强制转换成父类之后,访问的是父类中的属性。
被覆盖的方法,在子类被强制转换成父类后,调用的还是子类自身的方法。
参考:
https://www.cnblogs.com/it12345/p/5221673.html
https://www.cnblogs.com/xiaoQLu/archive/2013/01/07/2849869.html
---------------------------------这里是友好的分隔线-----------------------------------
继承
在java中使用extends关键字来表示继承关系。当创建一个类时,总是在继承,如果没有明确指出要继承的类,就总是隐式地继承根类Object。
如果两个类存在继承关系,那么子类会自动继承父类的方法和变量,在子类中可以调用父类的方法和变量。在java中只允许单继承,但是一个类却可以被多个类继承,也就说是,一个男人可以有多个儿子但是他的儿子只能认他为亲爹。
1、子类继承父类的成员变量也不是全部的变量都可以继承到的。
① 父类用private修饰的成员变量不能继承。
② 对于父类的包访问权限成员变量,要跟父类在同一个包下子类才能继承它。
③ 如果子类和父类中都出现了同名称的成员变量,则会发生隐藏现象,子类的成员变量会屏蔽掉父类的同名成员变量。如果要在子类中访问父类的同名成员变量,需要使用super关键字进行引用。
2、子类继承父类的方法同样也是有条件的。
① 父类用private修饰的成员方法不能继承。
② 对于父类的包访问权限成员方法,要跟父类在同一个包下子类才能继承它。
③ 如果子类和父类中都出现了同名称的成员方法,则会发生覆盖现象,子类的成员方法会覆盖掉父类的同名成员方法。如果要在子类中访问父类的同名成员方法,需要使用super关键字进行引用。
(注意:隐藏是针对成员变量和静态方法的,而覆盖是针对普通方法的)
3、构造器:子类是不能够继承父类的构造器
① 如果父类的构造器都是带有参数的,则必须在子类的构造器中显示地使用super来调用父类的构造器。
② 如果父类有无参构造器,则在子类的构造器中用super关键字调用父类构造器不是必须的,因为系统会自动调用父类的无参构造器。
参考:
https://www.cnblogs.com/dolphin0520/p/3803432.html
-------------------------------这里是友好的分隔线-----------------------------------
接下来是一道面试题的原型,看看你能不能做对?
public class Test03 {
public static void main(String[] args) {
Son son = new Son();
}
}
class Parent{
static{
System.out.println("Static Parent.");
}
public Parent(){
System.out.println("Parent Block");
}
}
class Son extends Parent{
static{
System.out.println("Static Son.");
}
public Son(){
System.out.println("Son Block.");
}
}
答案:
Java的三大特性之继承的更多相关文章
- 【转】java提高篇(二)-----理解java的三大特性之继承
[转]java提高篇(二)-----理解java的三大特性之继承 原文地址:http://www.cnblogs.com/chenssy/p/3354884.html 在<Think in ja ...
- Java 浅析三大特性之一继承
上文Java 浅析三大特性之一封装我们说到Java是一个注重编写类,注重于代码和功能复用的语言.Java实现代码复用的方式有很多,这里介绍一个重要的复用方式--继承. 在介绍继承之前,我们要明确一点, ...
- java提高篇(二)-----理解java的三大特性之继承
在<Think in java>中有这样一句话:复用代码是Java众多引人注目的功能之一.但要想成为极具革命性的语言,仅仅能够复制代码并对加以改变是不够的,它还必须能够做更多的事情.在这句 ...
- java提高篇(二)-----理解java的三大特性之继承
在<Think in java>中有这样一句话:复用代码是Java众多引人注目的功能之一.但要想成为极具革命性的语言,仅仅能够复制代码并对加以改变是不够的,它还必须能够做更多的事情.在这句 ...
- (转)java提高篇(二)-----理解java的三大特性之继承
在<Think in java>中有这样一句话:复用代码是Java众多引人注目的功能之一.但要想成为极具革命性的语言,仅仅能够复制代码并对加以改变是不够的,它还必须能够做更多的事情.在这句 ...
- java基础(二)-----java的三大特性之继承
在<Think in java>中有这样一句话:复用代码是Java众多引人注目的功能之一.但要想成为极具革命性的语言,仅仅能够复制代码并对加以改变是不够的,它还必须能够做更多的事情.在这句 ...
- java面向对象三大特性之继承
通过重用已经测试并验证通过的代码,怎样才减少开发工作,所有开发团队都在为一问题而努力.一个久经考验的方法是通过有效地使用Java继承优化应用程序开发. 继承的从某种意义上讲,继承的短暂美就如同宇宙中所 ...
- 深入理解Java面向对象三大特性 封装 继承 多态
1.封装 封装的定义: 首先是抽象,把事物抽象成一个类,其次才是封装,将事物拥有的属性和动作隐藏起来,只保留特定的方法与外界联系 为什么需要封装: 封装符合面向对象设计原则的第一条:单一性原则,一个类 ...
- 理解java的三大特性之继承
学习来源:http://www.cnblogs.com/chenssy/p/3354884.html default 默认权限(包权限-同一个包可以访问) private 私有(类内部可以使用,继承的 ...
随机推荐
- 慕课网java就业班级
家里电脑教程路径: F:\教程\java-慕课 开发工具路径: D:\java 公司电脑:开发工具路径 J:\java\开发工具 教程路径: G:\学习中\廖雪峰的java教程\1-Java快速入门\ ...
- JAVA学习笔记——(二)
今日内容介绍 1.变量 2.运算符 01变量概述 * A: 什么是变量? * a: 变量是一个内存中的小盒子(小容器),容器是什么?生活中也有很多容器,例如水杯是容器,用来装载水:你家里的大衣柜是容器 ...
- CI框架中,扩展验证码类。
使用CI框架的朋友,应该都知道CI框架的的验证码辅助函数,不太好用.它需要写入到数据库中,然后再进行比对. 大家在实际项目中,好像不会这样去使用,因为会对数据库造成一定的压力. 所以,我们还是利用se ...
- 写守护进程时碰到open函数的参数,没记住
今天写一个最简单的守护进程, 要成为一个守护进程,其实很简单了.主要步骤就4步: 1,创建进程. 2,父进程退出. 3,成为会话的头领进程. 4,将工作目录改成根目录,并把标准输入输出重定向到空设备. ...
- h5模型文件转换成pb模型文件
本文主要记录Keras训练得到的.h5模型文件转换成TensorFlow的.pb文件 #*-coding:utf-8-* """ 将keras的.h5的模型文件,转换 ...
- JS 上拉加载
$(document).ready( function(){ $contentLoadTriggered = false; $("#mainDiv").scroll(functio ...
- 2015 Noip提高组 Day2
P2678 跳石头 [题目背景] 一年一度的“跳石头”比赛又要开始了! [题目描述] 这项比赛将在一条笔直的河道中进行,河道中分布着一些巨大岩石.组委会已经选择好了两块岩石作为比赛起点和终点.在起点和 ...
- 18.使用for循环计算+1-3+5-7+9-11+13...99的结果
j = 1 # -1 num1 = 0 #1-3 for i in range(1,100,2): num1 += j * i # -3 j = j * -1 # 1 print(num1) sum1 ...
- 爬虫基础(1):urllib库
urllib库 urllib库是python中的一个基本网络请求库.用于模拟浏览器的行为,向指定服务器发送请求,并接收返回的数据. 在python3中所有的网络请求相关函数都集中在urllib.req ...
- Nginx 最新版源码编译安装 包含常用模块作用及所需依赖
第一部分 Nginx最新版源码编译安装 1. 使用的模块 模块1:http_rewrite_module 基于正则匹配来实现重定向.依赖PCRE库,见依赖1 模块2:http_gzip_module ...