JAVA基础第二章-java三大特性:封装、继承、多态
业内经常说的一句话是不要重复造轮子,但是有时候,只有自己造一个轮子了,才会深刻明白什么样的轮子适合山路,什么样的轮子适合平地!
我将会持续更新java基础知识,欢迎关注。
往期章节:
至今记得若干年前,去面试排了半天的队,到我的时候,面试官问我的第一个问题,java三大特性是什么~我支支吾吾的没有答全~0.0
什么是封装?
举个例子:有一个房子,房子里面有厨房,卫生间,卧室,客厅等房间,每一个房间都有各自的用途,而客人要来我家吃饭也好,闲聊也好,那么他只能从我家的门(对外暴露的接口)进来,那这个房子就代表一个“封装”。
封装(Encapsulation)是面向对象方法的重要原则,就是把对象的属性和操作(或服务)结合为一个独立的整体,并尽可能隐藏对象的内部实现细节。
封装时的权限控制符区别如下:
具体到java代码如下:
/*
* 封装演示
*/
public class House
{ // 私有化属性
private String cookroom;
private String bathroom;
private String bedroom;
private String parlor; public String getCookroom() {
return cookroom;
}
public void setCookroom(String cookroom) {
this.cookroom = cookroom;
}
public String getBathroom() {
return bathroom;
}
public void setBathroom(String bathroom) {
this.bathroom = bathroom;
}
public String getBedroom() {
return bedroom;
}
public void setBedroom(String bedroom) {
this.bedroom = bedroom;
}
public String getParlor() {
return parlor;
}
public void setParlor(String parlor) {
this.parlor = parlor;
}
}
所以,在这里我们可以看到这个House 类就是一个封装的体现。
什么是继承?
俗话说,龙生龙,凤生凤,老鼠的儿子会打洞,这就是继承的一种表现。就像我们每个人会继承父母的相貌等基因,甚至财富,人脉等资源。
同样在java代码中类与类,接口与接口之间都存在继承,要想继承另一个类,那么 extends 是必不可少的。
唯一要注意的是,java所倡导的继承是单继承,就像我们每一个人,只会有一个亲生父亲(当然马云爸爸,要认我做儿子的话,我也是无法拒绝的0.0),所以java类只能通过关键字extends 继承另外一个类,或者一个接口通过 关键字extends继承另外一个接口。
而类与接口之间,只能是类实现接口,通过关键字 implements 完成类实现接口。
具体java代码如下:
public class MyHouse extends House{
//我的房子啥都没有~ }
从上面代码看到,新建MyHouse类啥都没有,我只是继承了House,但是请看下图,我可以通过new一个MyHouse对象去调用House的方法属性,这就是继承的魅力
最后还要强调的一点就是继承和 final 关键字的关系:
final 可以修饰类,代表当前被修饰类不能被继承;
可以修饰变量,就变成了类的常量,这个变量一旦被初始化便不可改变;
可以修饰方法,代表子类不能复写或者说不能改变被修饰的方法中的代码,但是可以直接拿来使用;
注:万物皆对象,其实我们每新建一个类,都是已经默认继承了Object类了,我们新建一个类之后,可以看到有一些默认的方法,如下图中我圈中的部分,都是来自于Object类的。
什么是多态?
java中的多态具体分为2大类:覆写(又叫重写)和重载
覆写
覆写的存在的前提条件就是首先要有继承,比如前面我们写的Myhouse继承House,我在House类中新增一个方法名为myName,之前的代码不做变化,新增代码如下:
public String myName()
{
return "House";
}
这个时候我通过Myhouse对象调用myName方法,通过输出到控制台可以看到,输出的结果为house,因为我们继承了父类
下面我们在子类中覆写这个方法,代码如下
public class MyHouse extends House{ public static void main(String[] args) { MyHouse mm = new MyHouse();
System.out.println(mm.myName());
}
public String myName()
{
return "myHouse";
}
}
这个时候再运行程序,得到的结果就是 myHouse,而不再是House。
所以呢,覆写就是当子类定义了和父类在方法名称、返回值类型、参数类型及个数完全相同的方法的时候,称为方法的覆写。
在进行方法覆写的时候有一点需要注意:被子类所覆写的方法不能拥有比父类更严格的访问控制权限。
如果此时父类之中的方法是default权限,那么子类覆写的时候只能是default或public权限,而如果父类的方法是public,那么子类之中方法的访问权限只能是public。
当一个子类覆写了一个父类方法的时候,子类要想调用父类的被覆写过的方法,要在方法前要加上 super 关键字
重载
重载,简单说,就是函数或者方法有相同的名称,但是参数列表不相同的情形,这样的同名不同参数的函数或者方法之间,互相称之为重载函数或者方法。
关于重载是不是多态这部分,其实有很多人还进行过争论,有人认为他不是面向对象,只是面向方法,违背了最基本要求。
我个人理解,重载是不是多态 关键是你给多态的定义是什么 如果多态的定义是同一事物具有的不同反应 那重载也算多态 也就是所谓的广义多态 。
具体的代码表现如下,同名的myName方法有4个,在调用的时候我们只需要传入不同的参数即可调用相应的方法:
public class MyHouse extends House{ public static void main(String[] args) { MyHouse mm = new MyHouse();
System.out.println(mm.myName());
}
public String myName()
{
return "myHouse";
} public String myName(String args)
{
return "myHouse" + args;
} public String myName(String args,String args1)
{
return "myHouse" + args;
} public String myName(int i)
{ return "myHouse" + i;
}
}
文中若有不正之处,欢迎批评指正!
JAVA基础第二章-java三大特性:封装、继承、多态的更多相关文章
- Java三大特性(封装,继承,多态)
Java中有三大特性,分别是封装继承多态,其理念十分抽象,并且是层层深入式的. 一.封装 概念:封装,即隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别:将抽象得到的数据 ...
- C++三大特性 封装 继承 多态
C++ 三大特性 封装,继承,多态 封装 定义:封装就是将抽象得到的数据和行为相结合,形成一个有机的整体,也就是将数据与操作数据的源代码进行有机的结合,形成类,其中数据和函数都是类的成员,目的在于将对 ...
- 深入理解Java面向对象三大特性 封装 继承 多态
1.封装 封装的定义: 首先是抽象,把事物抽象成一个类,其次才是封装,将事物拥有的属性和动作隐藏起来,只保留特定的方法与外界联系 为什么需要封装: 封装符合面向对象设计原则的第一条:单一性原则,一个类 ...
- “全栈2019”Java多线程第二章:创建多线程之继承Thread类
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...
- OOP三大核心封装继承多态
OOP支柱 3 个核心:封装 继承 多态 封装就是将实现细节隐藏起来,也起到了数据保护的作用. 继承就是基于已有类来创建新类可以继承基类的核心功能. 在继承中 另外一种代码重用是:包含/委托,这种重用 ...
- JAVA的三大特征 封装继承多态- 简单总结
简单总结一下 封装-即从很多类的抽取相同的代码 写在一个类里. 好处是 代码的重用,安全. 继承-减少代码的书写. 其好处也是 代码的重用. 多态- 把不同的子类对象都当作父类来看,可以屏蔽不同子类对 ...
- <<深入Java虚拟机>>-第二章-Java内存区域-学习笔记
Java运行时内存区域 Java虚拟机在运行Java程序的时候会将它所管理的内存区域划分为多个不同的区域.每个区域都有自己的用途,创建以及销毁的时间.有的随着虚拟机的启动而存在,有的则是依赖用户线程来 ...
- JAVA基础01----第1章Java开发环境搭建
一. Java开发环境中涉及的名词:JDK,JRE,JVM A:什么是JVM JVM是java虚拟机(JVM Java Virtual Machine),java程序需要运行在虚拟机上,不同平台有自己 ...
- java入门第二章——java编程基础
习题 一.填空题 (p)1.java中的程序代码都必须在一个类中定义,类使用(class)关键字来定义. (p)2.布尔常量即布尔类型的两个值,分别是(true)和(false) (p18)3.jav ...
随机推荐
- DELETE_FAILED_INTERNAL_ERROR Error while Installing APK
真是Android2.3的特殊版本问题,问题原因是android2.3的instant run的测试版安装方式有所特别,解决办法有2: 1.手动adb install 安装包 2.把Instant r ...
- 学习MySQL我们应该知道哪些东西?
随笔:小编由于年前一直在找工作,而年后找到工作后又一直在忙工作,所以也很少有时间给大家写点什么,总的来说呢,回顾一下之前面试的几次经历,也曾小小的总结了一下自己的不足,发现自己虽然一直在原有的公司(外 ...
- netcore入门-基础
.NETCORE1.0出来了,咦不错,什么开源,跨平台的,观望下等2.0:我擦2.0出来了可以学习了,截止到目前2.1都快出来了,是时候学习一下了. 先建一个webapi项目,从简单的demo开始 l ...
- 智能指针auto_ptr & shared_ptr
转载:智能指针auto_ptr 很多人听说过标准auto_ptr智能指针机制,但并不是每个人都天天使用它.这真是个遗憾,因为auto_ptr优雅地解决了C++设计和编码中常见的问题,正确地使用它可以生 ...
- build.gradle使用gradle.property中定义的字段及乱码问题的解决
gradle.property文件可以用来定义一些字段 而这些字段可以被build.gradle文件引用到 例如:给大家贴出来一个gradle.property文件 # Project-wide Gr ...
- 部署Dubbo监控中心
1.部署监控中心: [root@localhost ~]# cp dubbo-admin-2.5.4.war apache-tomcat-7.0.47/webapps/dubbo-admin.war ...
- python_方法说明
方法用来描述对象所具有的行为,例如,列表对象的追加元素.插入元素.删除原宿.排序,字符串对象的分隔.连接.排版.替换.烤箱的温度设置.烘烤,等等 在类中定义的方法可以粗略分为四大类:公有方法.私有方法 ...
- String的substring()用于截取字符串
substring() 用于返回一个字符串的子字符串,即截取字符串功能. substring()常用的重载方法如下: substring(int beginIndex,int endIndex) 意思 ...
- Java中的queue和deque对比详解
队列(queue)简述 队列(queue)是一种常用的数据结构,可以将队列看做是一种特殊的线性表,该结构遵循的先进先出原则.Java中,LinkedList实现了Queue接口,因为LinkedLis ...
- ExecutorCompletionService分析及使用
当我们通过Executor提交一组并发执行的任务,并且希望在每一个任务完成后能立即得到结果,有两种方式可以采取: 方式一: 通过一个list来保存一组future,然后在循环中轮训这组future,直 ...