总结基础OOP(面向对象)
OOP其实也就是面向对象编程。
一:什么是对象:
我们最常见的理解方式无非是:对象(object)是任何看得见、摸得着、感觉得到,可以获得的东西,有自己的标识的任何东西。对象是某一类的事物的具体个例。比如这辆汽车、这个人、这间房子、这张桌子、这株植物、这张支票、这件雨衣,概括来说就是:万物皆对象。
在这里给大家摘录一些句子,希望看过的人能够花时间去思考一下:(有些还是不太懂啊啊。。。)
①“对象一般以域的形式包含数据,通常称作属性;以程序的形式包含代码,通常称作方法”。
②“对象在域中储存自身状态并通过方法暴露自身行为”。
③“每个对象就如一个小型电脑——它有状态,并且它提供操作,你可以调用执行”。
④“一个类包含了存放数值的数据域和操作数值的的方法”。
⑤“一个对象就是储存某些类型的值的内存空间”。
⑥“一个对象包含一些私有内存空间和一些操作”。
二:面向对象程序的设计方法:
(1)所有东西都是对象。可将对象想象成一种新型变量;它保存着数据,但可要求它对自身进行操作。理论上讲,可从要解决的问题身上提出所有概念性的组件,然后在程序中将其表达为一个对象。
(2)程序是一大堆对象的组合;通过消息传递,各对象知道自己该做些什么。为了向对象发出请求,需向那个对象“发送一条消息”。更具体地讲,可将消息想象为一个调用请求,它调用的是从属于目标对象的一个子例程或函数。
(3)每个对象都有自己的存储空间,可容纳其他对象。或者说,通过封装现有对象,可制作出新型对象。所以,尽管对象的概念非常简单,但在程序中却可达到任意高的复杂程度。
(4)每个对象都有一种类型。根据语法,每个对象都是某个“类”的一个“实例”。其中,“类”(Class)是“类型”(Type)的同义词。一个类最重要的特征就是“能将什么消息发给它?”。
(5)同一类所有对象都能接收相同的消息。这实际是别有含义的一种说法。由于类型为“圆”(Circle)的一个对象也属于类型为“形状”(Shape)的一个对象,所以一个圆完全能接收形状消息。这意味着可让程序代码统一指挥“形状”,令其自动控制所有符合“形状”描述的 对象,其中自然包括“圆”。这一特性称为对象的“可替换性”,是OOP
最重要的概念之一。
(6)一些语言设计者认为面向对象的程序设计本身并不足以方便解决所有形式的程序问题,提倡将不同的方法组合成“多形程序设计语言”。
三:对象的使用:

在这个例子中,类型/类的名称是 Light,可向 Light 对象发出的请求包括包括打开( on)、关闭( off)、变得更明亮( brighten )或者变得更暗淡( dim)。通过简单地声明一个名字( lt),我们为 Light 对象创建了一个“句柄”。然后用 new 关键字新建类型为 Light 的一个对象。再用等号将其赋给句柄。为了向对象发送一条消息,我们列出句柄名( lt),再用一个句点符号( .)把它同消息名称( on)连接起来。从中可以看出,使用一些预先定义好的类时,我们在程序里采用的代码是非常简单和直观的。
四:封装:
封装,即隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别;将抽象得到的数据和行为(或功能)相结合,形成一个有机的整体,也就是将数据与操作数据的源代码进行有机的结合,形成“类”,其中数据和函数都是类的成员。封装的目的是增强安全性和简化编程,使用者不必了解具体的实现细节,而只是要通过外部接口,以特定的访问权限来使用类的成员。隐藏之后,外部程序就不能接触和改变那些细节,所以不用担心自己的类会受到非法修改,可确保它们不会对其他程序造成影响。
封装的原则:
1. 将不需要对外提供的内容都隐藏起来;
2. 把属性都隐藏,提供公共方法对其访问。
package oop;
public class Student {
//属性私有化,避免属性被直接使用和修改
private String name;
private int age;
//对外提供公有的方法用来获取对象的属性值
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
//对外提供公有的方法用来获取对象的属性值
public int getAge() {
return age;
}
//对外提供公有的方法,可以对对象的属性进行控制,避免不合法的操作,可以对操作进行筛选
public void setAge(int age) {
if(age>120||age<=0){
System.out.println("输入的年龄不合法!");
}else{
this.age = age;
}
}
static class test{
public static void main(String[] args) {
Student s=new Student();
s.setAge(130);
s.setAge(20);
System.out.println(s.getAge());
}
}
}

五:继承:
我们费尽心思做出一种数据类型后,假如不得不又新建一种类型,令其实现大致相同的功能,那会是一件非常令人灰心的事情。但若能利用现成的数据类型,对其进行“克隆”,再根据情况进行添加和修改,情况就显得理想多了。“继承”正是针对这个目标而设计的。但继承并不完全等价于克隆。在继承过程中,若原始类(正式名称叫作基础类、超类或父类)发生了变化,修改过的“克隆”类(正式名称叫作继承类或者子类)也会反映出这种变化。在 Java 语言中,继承是通过 extends 关键字实现的。
package oop;
public class Father {
private String name;
public Father(String name) {
super();
this.name = name;
}
public void getname(){
System.out.println(name);
}
}
package oop;
public class Son extends Father{
public Son(String name) {
super(name);
// TODO Auto-generated constructor stub
}
@Override
public void getname() {
// TODO Auto-generated method stub
super.getname();
}
public static void main(String[] args) {
Son s=new Son("aa");
s.getname();
}
}
如果子类继承一个父类只是一个简单的继承,这意味着衍生类的对象不仅有相同的类型,也有同样的行为,这并不是我们想要的结果,一般我们,就像儿子继承父亲的财产,要进行有更进一步的发展一样。
第一种做法十分简单:为衍生类添加新函数(功能)。这些新函数并非基础类接口的一部分。进行这种处理时,一般都是意识到基础类不能满足我们的要求,所以需要添加更多的函数。这是一种最简单、最基本的继承用法,大多数时候都可完美地解决我们的问题(添加特定的方法,特殊的方法)。第二种做法是改变基础类一个现有函数的行为(重写父类的方法)。
第一种:添加方法
package oop;
public class Son extends Father{
public Son(String name) {
super(name);
// TODO Auto-generated constructor stub
}
@Override
public void getname() {
// TODO Auto-generated method stub
super.getname();
}
public void getouther(){
System.out.println("hello");
}
public static void main(String[] args) {
Son s=new Son("aa");
s.getname();
s.getouther();
}
}

第二中:重写父类的方法:
package oop;
public class Son extends Father{
public Son(String name) {
super(name);
// TODO Auto-generated constructor stub
}
@Override
public void getname() {
System.out.println("aaaaaaaaaaaaaaaaaaaaaa");
}
}
JAVA中是单继承的,一个类只能继承一个父类。就像是一个孩子不管父亲是谁,只会有一个真正的父亲。
六:多态:
多态是同一个行为具有多个不同表现形式或形态的能力,多态就是同一个接口,使用不同的实例而执行不同操作,多态性是对象多种表现形式的体现。
多态的优点:
1. 消除类型之间的耦合关系
2. 可替换性
3. 可扩充性
4. 接口性
5. 灵活性
6. 简化性
多态存在的三个必要条件:
- 继承
- 重写
- 父类引用指向子类对象
当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误;如果有,再去调用子类的同名方法。
例如:
package oop;
abstract class Animal {
abstract void eat();
}
package oop;
public class Cat extends Animal{
@Override
void eat() {
// TODO Auto-generated method stub
System.out.println("吃鱼");
}
public void work(){
System.out.println("抓老鼠");
}
}
package oop;
public class Dog extends Animal{
@Override
void eat() {
// TODO Auto-generated method stub
System.out.println("吃烤翅");
}
public void work(){
System.out.println("看家");
}
}
package oop;
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
duotai(new Cat());
duotai(new Dog());
}
public static void duotai(Animal a){
if(a instanceof Cat){
Cat cat=(Cat) a;
cat.eat();
cat.work();
}else{
Dog dog=(Dog) a;
dog.eat();
dog.work();
}
}
}

七:抽象类:
设计程序时,我们经常都希望基础类只为自己的衍生类提供一个接口。也就是说,我们不想其他任何人实际创建基础类的一个对象,只对上溯造型成它,以便使用它们的接口。为达到这个目的,需要把那个类变成“抽象”的—— 使用 abstract 关键字。若有人试图创建抽象类的一个对象,编译器就会阻止他们。这种工具可有效强制实行一种特殊的设计。
亦可用 abstract 关键字描述一个尚未实现的方法—— 作为一个“根”使用,指出:“这是适用于从这个类继承的所有类型的一个接口函数,但目前尚没有对它进行任何形式的实现。”抽象方法也许只能在一个抽象类里创建。继承了一个类后,那个方法就必须实现,否则继承的类也会变成“抽象”类。通过创建一个抽象方法,我们可以将一个方法置入接口中,不必再为那个方法提供可能毫无意义的主体代码。
interface(接口)关键字将抽象类的概念更延伸了一步,它完全禁止了所有的函数定义。“接口”是一种相当有效和常用的工具。另外如果自己愿意,亦可将多个接口都合并到一起(不能从多个普通 class 或abstract class 中继承)。比如上面的示例代码就将父类以及父类的方法进行了抽象,因为父类并不需要做任何实际的事情。
一
总结基础OOP(面向对象)的更多相关文章
- c#基础-oop(面向对象理解)
OOP-面向对象 封装,继承多态 一个桌子,用面向对象来描述一下它这个桌子项目 定义桌子类 对象:桌子 桌子的属性:名字,材质,体积 桌子的方法;放东西(方法) 现在桌子要放书,放花瓶,放文件(这里就 ...
- OOP 面向对象 七大原则 (一)
OOP 面向对象 七大原则 (一) 大家众所周知,面向对象有三大特征继承封装多态的同时,还具有这七大原则,三大特征上一篇已经详细说明,这一篇就为大家详解一下七大原则: 单一职责原则,开闭原则,里氏 ...
- [.net 面向对象编程基础] (11) 面向对象三大特性——封装
[.net 面向对象编程基础] (11) 面向对象三大特性——封装 我们的课题是面向对象编程,前面主要介绍了面向对象的基础知识,而从这里开始才是面向对象的核心部分,即 面向对象的三大特性:封装.继承. ...
- [.net 面向对象编程基础] (12) 面向对象三大特性——继承
[.net 面向对象编程基础] (12) 面向对象三大特性——继承 上节我们说了面向对象的三大特性之一的封装,解决了将对同一对象所能操作的所有信息放在一起,实现统一对外调用,实现了同一对象的复用,降低 ...
- [.net 面向对象编程基础] (13) 面向对象三大特性——多态
[.net 面向对象编程基础] (13) 面向对象三大特性——多态 前面两节,我们了解了面向对象的的封装和继承特性,面向对象还有一大特性就是多态.比起前面的封装和继承,多态这个概念不是那么好理解.我们 ...
- OOP面向对象三大特点
OOP面向对象三大特点 (一)封装:将现实中一个事物的属性和功能集中定义在一个对象中.(创建对象) 创建对象的3种方式: 1.直接量方式:(创建一个单独的对象) var obj={ 属性名:值, ...
- Python 基础 四 面向对象杂谈
Python 基础 四 面向对象杂谈 一.isinstance(obj,cls) 与issubcalss(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls ...
- 自学Python之路-Python基础+模块+面向对象+函数
自学Python之路-Python基础+模块+面向对象+函数 自学Python之路[第一回]:初识Python 1.1 自学Python1.1-简介 1.2 自学Python1.2-环境的 ...
- JAVA(一)JAVA基础/面向对象基础/高级面向对象
成鹏致远 | lcw.cnblog.com |2014-01-23 JAVA基础 1.开发环境搭建 JAVA程序的执行流程 JAVA命令->要使用一个*.class文件(类文件)->通过c ...
- 二十. Python基础(20)--面向对象的基础
二十. Python基础(20)--面向对象的基础 1 ● 类/对象/实例化 类:具有相同属性.和方法的一类人/事/物 对象(实例): 具体的某一个人/事/物 实例化: 用类创建对象的过程→类名(参数 ...
随机推荐
- 如何设置html中img宽高相同-css
最近项目中有一个问题,做一个响应式的盒子,随着屏幕的变化, 宽高一直保持相等,之前一直使用js动态设置,获取盒子的宽度来设置盒子高度. 但是加载时样式显示不是很好,后来直接用css实现. html部分 ...
- 《Qt on Android核心编程》介绍
<Qt on Android核心编程>最终尘埃落定.付梓印刷了. 2014-11-02更新:china-pub的预售链接出来了.折扣非常低哦. 封面 看看封面的效果吧,历经几版,最终就成了 ...
- vue-router实例
最近刚刚用vue写了个公司项目,使用vue-cli构建的,算是中大型项目吧,然后这里想记录并且分享一下其中的知识点,希望对大家有帮助,后期会逐渐分享:话不多说,直接上代码!! main.js // T ...
- DB主从一致性架构优化4种方法
需求缘起 大部分互联网的业务都是"读多写少"的场景,数据库层面,读性能往往成为瓶颈.如下图:业界通常采用"一主多从,读写分离,冗余多个读库"的数据库架构来提升数 ...
- HTTPS加密流程超详解(一)前期准备
0.前言 前一阵子想写一个HTTPS的嗅探工具,之前只是大致了解SSL/TLS协议的加密流程,真正上起手来一步一步分析发现还是有点复杂的,于是我参考了wireshark的源码以及各种RFC,弄清楚了S ...
- 在Office Add-in中实现单点登陆(SSO)
作者:陈希章 发表于 2017年12月27日 这篇文章经过多次修改,终于在今天晚上写完了,演示用的范例代码也终于跑通了.因为这个SSO的功能目前只是Preview的状态,所以本篇文章严格参考了官方的文 ...
- Mac环境下实现alias重命名命令(永久生效)
Mac环境下实现alias重命名命令 iOS Dev在使用Xcode完成代码编写后,可能需要上传至第三方分发应用给测试人员进行相关测试,比如蒲公英.FIR. 效率较高的上传方式是借助于Fastlane ...
- web基础笔记整理(一)
一.程序的分层 1.界面层: 某种类型的应用程序 a.DOS(控制台运行) b.桌面应用程序--独立安装,独立运行 c.web类型--现在流行的 单机版:电脑上要安装,程序升级之后,电脑上也要升级-- ...
- Python下载一张图片与有道词典
1.下载一张图片代码1 import urllib.request response = urllib.request.urlopen('http://photocdn.sohu.com/201009 ...
- JS画几何图形之三【正弦曲线】
数学式:y=Asin(ωx+φ)+k 样例:http://www.zhaojz.com.cn/demo/draw7.html 依赖:[点].[直线] JS函数的声明: //画正弦曲线 //dot 原点 ...