-
2014-05-15 22:32:14
id 声明的对象具有运行时的特性,即可以指向任意类型的objcetive-c的对象;
更多相关内容 -
面向对象有哪些特性?
2020-12-30 11:02:581、面向对象有封装、继承 、抽象、多态等4个主要的特征。 2、封装:面向对象的封装就是把描述一个对象的属性和行为的代码封装在一个类中,有些属性是不希望公开的,或者说被其他对象访问的,所以我们使用private修饰...1、面向对象有封装、继承 、抽象、多态等4个主要的特征。
2、封装:面向对象的封装就是把描述一个对象的属性和行为的代码封装在一个类中,有些属性是不希望公开的,或者说被其他对象访问的,所以我们使用private修饰该属性,使其隐藏起来;类中提供了方法(用public修饰),常用的是get、set方法,可以操作这些被隐藏的属性,其他类可以通过调用这些方法,改变隐藏属性的值!
下面的回答是更高要求,不需要学生必须掌握:
封装是保证软件部件具有优良的模块性的基础,封装的目标就是要实现软件部件的“高内聚、低耦合”,防止程序相互依赖性而带来的变动影响。在面向对象的编程语言中,对象是封装的最基本单位,面向对象的封装比传统语言的封装更为清晰、更为有力。
3、抽象:抽象就是找出一些事物的相似和共性之处,然后将这些事物归为一个类,这个类只考虑这些事物的相似和共性之处,并且会忽略与当前主题和目标无关的那些方面,将注意力集中在与当前目标有关的方面。
4、继承:在定义和实现一个类的时候,可以在一个已经存在的类的基础之上来进行,使用extends关键字实现继承;子类中可以加入若干新的内容,或修改原来的方法使之更适合特殊的需要,这就是继承。继承是子类自动共享父类数据和方法的机制,这是类之间的一种关系,提高了软件的可重用性和可扩展性。
5、多态:Java引用变量有两种类型,分别是编译时类型(原型)和运行时类型,编译时类型由声明类型决定,运行时类型由赋值对象的类型决定。如果编译时类型和运行类型不一致,就会出现所谓多态。
可以这样理解:多态是指通过父类型的变量引用不同的子类对象(也就是说父类型变量指向的是一个子类对象,JVM会在运行时动态的绑定父类型变量所指向的子类对象),来调用在不同子类中实现的方法。
多态就是在声明时使用父类,在实现或调用时使用具体的子类;即不修改程序代码就可以改变程序运行时所绑定的具体代码,多态增强了软件的灵活性和扩展性。这里可以举个例子,比如声明时使用的是动物类,调用时传递的是一个猫类(动物类的子类)的对象,具体执行父类里动物——吃的方法时,实际执行的是猫——吃的方法。
多态依赖于向上转型和后期绑定。 -
js 对象属性的特性
2022-04-08 16:33:35“js 对象属性的特性”的学习笔记,介绍属性特性的种类和说明,以及如何获取和修改属性特性。文章目录
前言
“js 对象属性的特性”的学习笔记,介绍属性特性的种类和说明,以及如何获取和修改属性特性。
在 js 中,可以把对象想象成一个散列表(类似于 Python 中的字典类型,或者是 Java 中的 HashMap),其中的内容就是一组名/值对,值可以是数据或者函数。
一、创建简单的对象
创建一个简单的对象主要有两种方法,第一种是先创建一个 Object 实例,然后给这个实例添加属性和方法:
let person = new Object(); person.name = "ec50n9"; person.age = 19; person.sayName = function(){ console.log(this.name); };
这样就创建好一个名为
person
的对象了,它包含有name
、age
、sayName
三个属性。其中sayName
的值是一个函数,可以这样子调用:person.sayName(); // "ec50n9" // 👇也可以尝试一下另一种获取属性值的方式 person["sayName"](); // "ec50n9"
还有一种看起来更加直观的创建方法,那就是使用对象字面量来创建对象,下面这种写法等价于上面的,只是看起来更简洁:
let person = { name: "ec50n9", age: 19, sayName(){ console.log(this.name); } };
这种写法看起来就和 Python 中的字典很类似了,实际上,如果不考虑 js 的原型链的话,它俩的用法好像确实差别不大🤪。
二、对象属性的特性
对于对象中的属性,除了可以对其赋值以外,每一个属性的内部都包含有一些内部特性来描述属性自身的特征的。
这些内部特性,开发者是无法直接访问的,只能通过
Object.defineProperty()
这个函数来对其进行修改。不同的对象属性又有不同的内部特性,这里分开来介绍。对象的属性分两种:数据属性和访问器属性。
数据属性
数据属性就是最普通的属性,包含一个保存数据的位置。值都在同一个地方读写,比如这里的
name
就是一个数据属性:let person = { name: "ec50n9" };
这种属性有四个特性描述他们的行为:
1. configurable “可配置的”
默认值:
true
作用:
- 是否可以通过 delete 删除并重新定义
- 是否可以修改其特性
- 是否可以把它改为访问器属性。
解释:
如果把
configurable
设置成false
,就意味着这个属性不能在对象上删除。非严格模式下对这个属性调用delete
没有效果(返回false
),严格模式下会抛出错误。而且,当一个属性被设置为不可配置之后,就不能再设置回可配置的了,也无法修改其他内部特性,因为
Object.defineProperty()
无法对configurable
值为false
的属性进行修改。2. enumerable “可列举的”
默认值:
true
作用:是否可以通过
for-in
循环返回。(for-in
循环可以列举对象的属性)3. writable “可写的”
默认值:
true
作用:它的值(也就是👇下面的
value
属性)是否可被修改。4. value “值”
默认值:
undefined
作用:属性实际的值。
在👆上面
person.name
这个示例属性中,它的value
就为"ec50n9"
。📜 修改方法
Object.defineProperty()
需要传入三个参数,第一个是需要修改属性的对象,第二个是属性的名称,第三个是需要修改的特性的集合。例如我想把
name
属性修改为不可枚举且不可修改:// 操作前:person.name 的内部属性是这样的↙️ // ✅可修改、✅可列举、✅可写,值为"ec50n9" Object.defineProperty(person, "name", { // 把可列举设置为 false enumerable: false, // 把可写设置为 false wirtable: false }); // 操作过后,person.name 属性的内部特性就会发生改变,变成下面这样↙️ // ✅可修改、❌可列举、❌可写,值为"ec50n9" person.name = "new name"; // 尝试修改 console.log(person.name); // "ec50n9" 还是原有值,没有被改变,说明不可写。
函数的第三个参数只需传入需要修改的特性和值即可,对于没传入的特性,比如上面没有传入的
configurable
和value
这两个特性将会保持原有值不变。如果第二个参数传入的属性名是对象上没有的属性,就会为那个对象添加一个属性。例如:
// person 上面没有 age 属性 Object.defineProperty(person, "age", { enumerable: true, wirtable: true, value: 19 }); console.log(person) // {name: "ec50n9", age: 19}
访问器属性
访问器属性不包含数据值,取而代之的是一个
getter
函数和一个setter
函数,不过这两个函数都不是必须的。在读取访问器属性时,会调用
getter
函数,并返回函数的返回值。在写入访问器属性的时候,会调用
setter
函数,并传入新值,由setter
函数来决定如何处理这个新值。访问器属性也有四个特性,其中
configurable
和enumerable
特性和数据属性是一样的,不同的是另外两个特性被get
和set
取代:1. configurable “可配置的”
默认值:
true
作用:👆同数据属性一样。
2. enumerable “可列举的”
默认值:
true
作用:👆同数据属性一样。
3. get “获取函数”
默认值:
undefined
作用:获取函数,在读取属性时调用。
4. set “设置函数”
默认值:
undefined
作用:设置函数,在写入属性时调用。
set
函数可以为空,如果只设置了get
函数而没有设置set
函数的话,则意味着该属性为只读属性,尝试修改属性会被忽略(在严格模式下会抛出错误❌)。📜 修改方法
同数据属性类似,访问器属性的特性也是通过
Object.defineProperty()
来定义的:// 定义一个对象,包含伪私有成员 year_ 和公共成员 edition let book = { year_: 2017, edition: 1 }; Object.defineProperty(book, "year", { get(){ // 直接返回 year_ 的值 return this.year_; }, set(newValue){ // 对新的值进行判断 if(newValue > 2017){ // 把 year_ 设置为新的值 this.year_ = newValue; // 同时修改 edition 的值 this.edition += newValue - 2017; } } });
year_
中的下划线常用来表示该属性并不希望在对象方法的外部被访问。实际上,你仍可以在外部像访问普通属性一样访问到year_
,这只是一个约定,没有真的隐藏(防君子不防小人的那种)。如果想真正隐藏内部变量,可以试试闭包。通常,我们可以在
get
函数里面对即将返回的数据进行一些修饰处理什么的,也可以在set
函数里面进行对新的值的一些验证,以防设置了一个不符合要求的值等等…三、定义多个属性
上面用到的
Object.defineProperty()
函数每次就只能定义一个属性的特性,如果想要同时定义多个属性就需要用到Object.defineProperties()
函数了。例如,把上面的几个属性同时定义:
let book = {}; Object.defineProperties(book, { year_: { value: 2017 }, edition: { value: 1 }, year: { get(){ return this.year_; }, set(newValue){ if(newValue > 2017){ this.year_ = newValue; this.edition += newValue - 2017; } } } });
四、读取属性的特性
读取属性可以使用
Object.getOwnPropertyDescriptor(对象, 属性名)
函数。拿上面👆定义的book
对象作示例:// 读取一个数据属性 Object.getOwnPropertyDescriptor(book, "edition"); // 结果👇 Object { value: 1, writable: false, enumerable: false, configurable: false } // 再试试读取一个访问器属性 Object.getOwnPropertyDescriptor(book, "year"); // 结果👇 Object { get: get(), set: set(newValue), enumerable: false, configurable: false }
ECMAScript 2017
新增了Object.getOwnPropertyDescriptors(对象)
函数,从函数名后面的s
就可以看出来,它可以获取传入对象上的全部自有属性的特性。实际上,它会在传入对象的每个自有属性上调用Object.getOwnPropertyDescriptor()
函数,并在一个新对象中返回它们。例如:Object.getOwnPropertyDescriptors(book);
运行结果如下:
以上。
-
C# 面向对象三大特性:封装、继承、多态
2021-01-20 07:08:00面向对象有封装、继承、多态这三个特性,面向对象编程按照现实世界的特点来管理复杂的事物,把它们抽象为对象,具有自己的状态和行为,通过对消息的反应来完成任务。这种编程方法提供了非常强大的多样性,大大增加了... -
JS基于对象的特性实现去除数组中重复项功能详解
2021-01-19 16:13:42本文实例讲述了JS基于对象的特性实现去除数组中重复项功能。分享给大家供大家参考,具体如下: 数组去重的方法有很多,不同的方法的效率也不相同。如前面文章JS实现的数组去除重复数据算法小结中就总结分析了4种实现... -
面向对象是什么?有哪些特征?
2021-03-22 18:46:28提起Java,大家都知道它是一门典型的面向对象的编程语言。但是对于面向对象,可能还有许多人并...面向对象程序设计是种具有对象概念的程序编程典范,同时也是一种程序开发的抽象方针。它可能包含数据、属性、代码与...提起Java,大家都知道它是一门典型的面向对象的编程语言。但是对于面向对象,可能还有许多人并不清楚。那么面向对象是什么?有哪些特征呢?本文就来带大家好好认识一下面向对象。面向对象是一种软件的开发方法,它的特征归纳起来就是三点,即封装、继承和多态。下面是关于面向对象的深入介绍:
面向对象是什么?
面向对象程序设计是种具有对象概念的程序编程典范,同时也是一种程序开发的抽象方针。它可能包含数据、属性、代码与方法。对象则指的是类的实例。它将对象作为程序的基本单元,将程序和数据封装其中,以提高软件的重用性、灵活性和扩展性,对象里的程序可以访问及经常修改对象相关连的数据。在面向对象程序编程里,计算机程序会被设计成彼此相关的对象。面向对象的优点是易维护、易复用、易扩展。由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统更加灵活、更加易于维护。但是它的缺点也是很明显的,像是性能比面向过程低。
面向对象有哪些特征?
1、封装:找到变化并且把它封装起来,你就可以在不影响其它部分的情况下修改或扩展被封装的变化部分,这是所有设计模式的基础,就是封装变化,因此封装的作用,就解决了程序的可扩展性。
2、继承:子类继承父类,可以继承父类的方法及属性,实现了多态以及代码的重用,因此也解决了系统的重用性和扩展性,但是继承破坏了封装,因为他是对子类开放的,修改父类会导致所有子类的改变,因此继承一定程度上又破坏了系统的可扩展性,所以继承需要慎用,只有明确的IS-A关系才能使用,同时继承在在程序开发过程中重构得到的,而不是程序设计之初就使用继承,很多面向对象开发者滥用继承,结果造成后期的代码解决不了需求的变化了。因此优先使用组合,而不是继承,是面向对象开发中一个重要的经验。
3、多态:接口的多种不同的实现方式即为多态。接口是对行为的抽象,刚才在封装提到,找到变化部分并封装起来,但是封装起来后,怎么适应接下来的变化?这正是接口的作用,接口的主要目的是为不相关的类提供通用的处理服务,我们可以想象一下。比如鸟会飞,但是超人也会飞,通过飞这个接口,我们可以让鸟和超人,都实现这个接口,这就实现了系统的可维护性,可扩展性。
以上就是面向对象的具体介绍和特征分析。在Java的学习中,面向对象是一个绕不过去的重点,如果大家还想继续了深入了解面向对象的相关知识点,可以上博学谷平台观看相关视频学习资源。
-
什么是类?什么是对象?类与对象之间是什么关系?类的特性有哪些?
2021-08-02 10:57:53一、什么是类? 1、类是一种抽象的概念。 2、类:具有相同的特性(数据元素)和行为(功能)的对象的抽象就是类。对象的抽象就是类,类的具体化...对象具有状态,一个对象用数据值来描述它的状态。对象还有操作,用于 -
面向对象三大特性_面向对象_
2021-09-28 20:37:50面向对象的特点和特性说明。并且有代码说明 -
什么是面向对象、面向对象的三大特性
2021-02-04 20:05:431什么是面向对象 (1)面向对象思想 面向对象是一种分类的思维模式,思考问题会先解决问题需要分成哪些类,然后对各种问题单独思考,最后对每个分类下的细节进行面向过程思考。面向对象适合处理有分工的复杂问题... -
面向对象的三大特性
2021-07-19 19:05:12◆属性——对象具有的各种特征 ◆每个对象的每个属性都拥有特定值 方法——对象执行的操作 对象:用来描述客观事物的一个实体,由一组属性和方法构成 类:具有相同属性和方法的一组对象的集合类是对象的抽象,对象是... -
什么是类 ? 什么是对象 ? 类和对象有什么关系 ?
2018-07-23 20:57:28面向对象(Object Oriented,OO)。 面向对象(Object Oriented,OO)是软件开发方法。面向对象的概念和应用已超越了程序设计和软件开发,扩展到如数据库系统、交互式界面、...核心特性包括:类,对象,方法,封装,继承... -
面向对象三大特性的意义讲解
2021-01-20 06:59:35前几天在youtube上看了Bob大叔讲解的SOLID原则,其中有一段提到面向对象的三大特性,收获很多,但是我并不完全赞同他的观点,这里谈谈我的想法: 封装 『封装』第一层含义是信息隐藏。这是教科书里都会讲解的,把类... -
javascript 的面向对象特性参考
2020-12-12 11:57:24javascript 的面向对象特性参考。 这是我学习javascript中面向对象特性的一点总结。希望对具有其他语言的面向对象设计经验的朋友理解javascript的OO有所帮助。我具有c++,java和python的面向对象设计的经验。 总的... -
python中什么是对象
2021-01-12 06:06:17详细内容Python从设计之初就是一门面向对象的语言,它有一个重要的概念,即一切皆对象。Java虽然也是面向对象编程的语言,但是血统没有Python纯正。比如Java的八种基本数据类型之一int,在持久化的时候,就需要包装... -
Javascript 面向对象特性
2020-10-29 11:21:26很少有人对JavaScript的面向对象特性进行系统的分析。我希望接下来的文字让你了解到这个语言最少为人知的一面。 -
面向对象的含义及特性
2021-11-22 21:20:542 面向对象三大特性:封装、继承和多态。 封装 封装把一个对象的属性私有化,同时提供一些可以被外界访问的属性的方法。 如果属性不想被外界访问,我们大可不必提供方法给外界访问。 但是如果一个类没有提供给... -
面向过程,面向对象的区别和面向对象三大特性
2021-10-21 20:28:171.面向过程和面向对象的区别 a.、两者都是软件开发思想,先有面向过程,后有面向...面向对象具有继承性和多态性, 而面向过程没有继承性和多态 性,所以面向对象优势是明显。 2.面向对象三大特性 a、封装:隐藏... -
Java面向对象 面向对象都有哪些特性?
2018-11-25 22:23:381) 继承: 继承都是从已有的类得到继承信息创建新的类的过程.提供信息的类被称为父类(超类,基类),得到信息的类被称为...面向对象的本质就是将现实世界描绘成一系列完全自治,封闭的对象.我们在类中编写方法就是对实... -
面向对象有哪些特性?以及你对这些特性的理解
2020-08-13 09:39:32面向对象的本质就是将现实世界描绘成一系列完全自治、封闭的对象。我们在类中编写的方法就是对实现细节的一种封装;我们编写一个类就是对数据和数据操作的封装。可以说,封装就是隐藏一切可隐藏的东西,只向外界提供... -
简述一下面向对象的三大特性
2022-06-09 09:41:07问:简述一下面向对象的三大特性。 参考: 面向对象的三大特性是:封装、继承和多态。 1、封装:封装隐藏对象的属性,并且外界只能通过对外提供的接口进行访问,这个对外提供的接口一般是指get方法。 2、继承:子类... -
什么是面向对象
2021-10-18 16:21:44以为对象就是一个class(类),并不觉得有什么特殊。直到很久之后,面试官问到什么是OOP,嘴巴都是一个大O,OOP?WTF?那人厌恶的说到就是面向对象编程。我说:Java就是面向对象,就是一切以对象为载体,去编程,去... -
JavaScript对象的特性与实践应用深入详解
2020-12-02 21:02:56本文实例讲述了JavaScript对象的特性与实践应用。分享给大家供大家参考,具体如下: JavaScript 的简单数据类型是数字、字符串、布尔值(true/false)、null 以及 undefined,其它所有的值都是对象。这些对象是可变... -
对象的三大特性
2019-03-11 20:57:01面向对象的三大特性 封装 把客观事物封装成抽象的类,并且类可以把自己的数据和方法让可信的类或对象操作,对不可信的进行信息隐藏。 通过权限设置来限制外部访问,权限修饰符如下几个:private、(default)、... -
浅谈对c# 面向对象的理解
2021-01-21 18:28:161)封装:是隐藏信息的特性,具有“封装”意识,是掌握面向对象分析与设计技巧的关键。 最简单的理解:创建一个对象的整体,使对象的属性可以具有赋值、取值的功能,也就是对象中的变量可以赋值、取值。,是一种认为... -
【C++】什么是对象?什么是类?
2021-03-27 18:47:32“有对象吗?没有! new 一个。”当第一次接触面向程序设计语言Java时,大家都会拿这句话作为调侃,但是,作为一个大三的学生,如果还是对“对象”有着浅层次的理解,确实有点说不过去啦! 文章目录1、什么是对象?1.1 ... -
什么是面向对象OOP(面向对象的三大特性)
2019-09-26 13:39:31什么是面向对象(面向对象的三大特性) 简介 学java的都知道,java语言有三个特性,也可以说是三个优点,就是 1.简单性: java语言相对于C语言,C++来说比较简单。 2.跨平台:java语言编写的代码可以在不同的操作... -
什么是js面向对象?有什么特点?
2017-06-27 19:33:27什么是js面向对象?首先,js面向对象是一种思想;其次,遵循万物皆对象的准则; -
什么是类?什么是对象?类和对象有什么关系?
2016-05-13 15:26:11面向对象(Object Oriented,OO)。 起初,“面向对象”是指在程序设计中采用封装、继承、多态等设计方法。现在,面向对象的思想已经涉及到软件开发的各个方面。如,面向对象的分析(OOA,ObjectOriented Analysis),... -
什么是对象?什么是面向对象程序设计?面向对象语言有什么优点?
2017-03-01 15:03:24在计算机科学中,对象(英语:object),台湾译作物件,是一个存储器地址,其中拥有值,这个地址可能有标识符指向此处。对象可以是一个变量,一个数据结构,或是一个函数。是面向对象(Object Oriented)中的术语,...