Java之面向对象
面向对象的特征有什么?
如果,当人家问到你,这个问题时,我们可以先引申出类的概念, 因为对象是类的一个实例。
点击查看类的详情
后面再去引出面向对象的三大特征:
- 封装
- 继承
- 多态
封装是什么?
封装是面向对象语言的精髓。
简单来讲封装就是,把一些属性和方法封装起来,形成一个实体类(JavaBean)或者一个接口(Interface)【可以是方法接口】。
类的属性,一般是私有的。
类的方法,该公开的公开,该私有的私有。
方法,封装了实现的过程,接口是参数和返回值。
举例:1)get/set 方法;对某一个属性只提供get不提供set方法,就是只读的,在类的外部不能修改;2)提供统一的参数检查,在set上给与检查,判断合法性和安全性;将属性都私有,并且提供set/get 方法,做成了通用的组件,叫JavaBean;
eg: 猫具有如下特性: 可爱,高冷,活泼爱动 那么,我们可以将其封装成一个实体类Cat
public class Cat {
private String id;
private String lovely;
private String lively;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getLovely() {
return lovely;
}
public void setLovely(String lovely) {
this.lovely = lovely;
}
public String getLively() {
return lively;
}
public void setLively(String lively) {
this.lively = lively;
}
}
那么,接口,方法实例来一个。单纯表示一个接口方法,至于里面的实现类并不打算完善
修改:
@RequestMapping("/") //里面是路径 url
Integer addOrEdit(@RequestParam("id") String id);//此注解,表示,拿到url上的属性值
继承
面向对象的主要功能
继承是一种构建新类的方式,他是基于已有的类的定义为基础,构建新的类,已有的类称为父类,新构建的类称为子类,子类能调用父类的非private修饰的成员,同时还可以自己添加一些新的成员,扩充父类,甚至重写父类已有的方法,更其表现符合子类的特征。让子类的表现更独特,更专业。
注意: 子类不能获得父类中使用privade修饰的成员。以及不可获得父类的构造器。
打个比喻的话~~那就是,你可以从你父亲那边继承得到金钱或其它。但你决不能获得你父亲的身体 咳咳咳。
多态
从一定角度来看的话,上面的封装以及继承都是为了多态而准备的。
多态可分为两种:
- 编译时的多态:其实就是方法的重载。
- 运行时的多态:Java运行时,系统根据调用该方法的实例的类型来决定,选择调用哪个方法。 (其实,我们平时所说的多态大部分便是运行时的多态)
注意:
因为说了,封装以及继承从一定角度来看,就是为了多态而准备的。
- 一定存在继承关系。
- 对父类的方法进行了重写。(重写是必须存在继承的,所以有第一点)。
- 调用方法的时候,形参为父类调用。
点击此处,查看重载(Overload)以及重写(Override)
说了这么多,那么,多态到底是什么呢?
简单来讲,多态是同一个行为具有多个不同表现形式或形态的能力。多态性是对象多种表现形式的体现。
eg:我们在WPS编辑文档时,F12是保存文档,但是对于开发人员来讲在浏览器中F12就是开发工具了,尤其是前端开发人员。可,查看网络请求,审查元素等等。
抽象
除上之外,抽象也是一个重要的特征,抽象就是忽略与当前目标无关的相关方面,以便更充分地突出与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。抽象包括两个方面,一是过程抽象,二是数据抽象。
多态的实现机制是什么?
Java允许父类或接口定义的引用变量指向子类或具体实现类的实例对象,而程序调用的方法在运行时才动态绑定,就是引用变量所指向的具体实例对象的方法,也就是内存里正在运行的那个对象的方法,而不是引用变量的类型中定义的方法。
正是由于这种机制,两个相同类型的变量,但由于它们实际引用了不同的方法,所以结果也不同
嘻嘻嘻~是不是有点晕? 表示博主真正的去读的时候也是这样,脑壳痛脑壳痛~~
OK,举个简单的例子:
就是说,可能多个实例,调用同一方法,那么,它是怎么知道该调用那个方法呢?
很简单,是通过具体的实例调用的,而不是引用变量类型中的定义的方法来运行(如上图例子:调用Chinese c = new Chinese(); c.eat(); 执行出结果是用筷子吃饭。【不是根据引用变量类型中的定义的方法运行,是指不是看左边的 Chinese c 的引用变量,而是看右边的具体事例去调用方法,如果把右边的换成new Indian() ;那么调用eat();方法运行的结果又是不同 】
)。【所谓引用变量(如: China C = new China 引用变量是C 而 引用变量类型是China)】
看完之后,是不是有点理解了~~~机智如你,对吧
最后,来个多态例子:
结果
上一篇: 第二节 python语言基础
下一篇: scala之面向对象
推荐阅读
-
Python面向对象程序设计OOP深入分析【构造函数,组合类,工具类等】
-
Python面向对象程序设计OOP入门教程【类,实例,继承,重载等】
-
Python面向对象类编写细节分析【类,方法,继承,超类,接口等】
-
Java 插入排序之希尔排序的实例
-
PHP 面向对象程序设计(oop)学习笔记(一) - 抽象类、对象接口、instanceof 和契约式编程
-
PHP 面向对象程序设计(oop)学习笔记 (四) - 异常处理类Exception
-
PHP 面向对象程序设计(oop)学习笔记(三) - 单例模式和工厂模式
-
PHP 面向对象程序设计(oop)学习笔记 (二) - 静态变量的属性和方法及延迟绑定
-
基于Java回顾之反射的使用分析
-
java9学习笔记之模块化详解