类对象

python 面向对象

别等时光非礼了梦想. 提交于 2019-12-10 08:31:49
# 面向对象 """ 面向对象特点 1.封装: 依据功能需求将某些属性与方法封装到一个类中 2.继承: 实现代码的重复调用,相同的功能调用不需要重复编写 3.多态: 不同的对象调用相同的类方法,产生不同的执行结果 面向对象的基本知识点 类: 描述具有相同的属性和方法的对象的集合,具有抽象性,不能直接使用,主要职责是创建对象 对象:通过类定义的,具有属性与方法的具体实例,可以使用 方法:类中定义的函数 类变量:类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用 数据成员:类变量或者实例变量用于处理类及其实例对象的相关的数据。 方法重写:如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写。 局部变量:定义在方法中的变量,只作用于当前实例的类。 实例变量:在类的声明中,属性是用变量来表示的,这种变量就称为实例变量,实例变量就是一个用 self 修饰的变量。 继承:即一个派生类(derived class)继承基类(base class)的字段和方法。 实例化:创建一个类的实例,类的具体对象。 在程序开发中,应该 先有类,再有对象 类和对象的关系: 类是模板,对象是根据类这个模板创建出来的 类只有一个,而对象可以有很多个 类中定义了什么属性和方法,对象中就有什么属性和方法

Java学习笔记(线程)

自古美人都是妖i 提交于 2019-12-10 02:41:03
多线程 并发与并行 并发:指两个或多个事件在同一个时间段内发生 并行:指两个或多个事件在同一时刻发生(同时发生) 进程概念 线程概念 主线程 主线程:执行主(main)方法的线程 单线程程序:java程序中只有一个线程 执行从main方法开始,从上到下依次执行 JVM执行main方法,main方法会进入到栈内存,JVM会找操作系统开辟一条main方法通向cpu的执行路径,cpu就可以通过这个路径来执行main方法,而这个路径有一个名字,叫main(主)线程。 创建多线程类 创建多线程程序的第一种方式:创建Thread类的子类 java.lang.Thread类:是描述线程的类,我们想要实现多线程程序,就必须继承Thread类 实现步骤: 创建一个Thread类的子类 在Thread类的子类中重写Thread类中的run方法,设置线程任务(开启线程做什么?) 创建Thread类的子类对象 调用Thread类中的方法start方法,开启新的线程,执行run方法 void start() 使该线程开始执行;Java 虚拟机调用该线程的 run 方法。 结果是两个线程并发地运行;当前线程(main线程)和另一个线程(创建的新线程,执行其 run 方法)。 多次启动一个线程是非法的。特别是当线程已经结束执行后,不能再重新启动。 java程序属于抢占式调度,哪个线程的优先级高,哪个线程优先执行

java new一个对象的流程

旧时模样 提交于 2019-12-10 00:39:57
转自:https://www.cnblogs.com/JackPn/p/9386182.html java在new一个对象的时候 ,会先查看对象所属的类有没有被加载到内存,如果没有的话,就会先通过类的全限定名来加载。加载并初始化类完成后,再进行对象的创建工作。 我们先假设是第一次使用该类,这样的话new一个对象就可以分为两个过程: 加载并初始化类和创建对象 。 一、类加载过程(第一次使用该类) java是使用双亲委派模型来进行类的加载的,所以在描述类加载过程前,我们先看一下它的工作过程: 双亲委托模型的工作过程是:如果一个类加载器(ClassLoader)收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委托给父类加载器去完成,每一个层次的类加载器都是如此,因此所有的加载请求最终都应该传送到顶层的启动类加载器中,只有当父类加载器反馈自己无法完成这个加载请求(它的搜索范围中没有找到所需要加载的类)时,子加载器才会尝试自己去加载。 使用双亲委托机制的好处是:能够有效确保一个类的全局唯一性,当程序中出现多个限定名相同的类时,类加载器在执行加载时,始终只会加载其中的某一个类。 1、加载 由类加载器负责根据一个类的全限定名来读取此类的二进制字节流到JVM内部,并存储在运行时内存区的方法区,然后将其转换为一个与目标类型对应的java.lang.Class对象实例 2、验证

java继承

允我心安 提交于 2019-12-10 00:11:11
子类 1.通过extends关键字,可以直接拥有来自于父类的属性和行为 (但是能不能访问要受访问修饰符的限制) 分清楚,,拥有和能不能直接操作到是两个不同的概念 2 公式: 子类 extends 父类 父亲的属性和行为 子类字自动继承; 但是子类不能继承父类的构造方法; 原因1:构造方法的语法要求是方法名必须和类名保持一致. 如果子类继承了父亲的构造,那么子类就会有一个叫父类的名的构造方法. 这一点与构造语法的语法冲突. 原因2: 构造方法的作用是产生对象的.父类和子类是分开的. 3.虽然父类的构造方法没有被子类继承,但在构造子类对象的过程中, 会先在内存中产生父类对象部分,再叠加子类特有部分,从而构造一个完整的子类对象. 也就是说new一个子类对象时,会先调用父类构造,在调用子类构造 类似于"内存叠加的方式" 4.如果子类定义了和父类一模一样的属性,那么子类对象身上会有两个该属性,一个在父类一个在子类 (1) 不应该这么设计,因为设计父类的时候已经考虑了共有,设计子类应该考虑特有. (2) 用super.属性名 代表的是定义在父类部分的同名属性名 (3) 用this.属性名 代表的是定义在子类部分的同名属性名 5.如果子类定义了和父亲一模一样的方法呢? 这叫做方法的"重写' 它是指所有类都有的共同行为,所以我们要定义在父类中 但是,不同的子类又有不同的实现

C++拷贝构造函数心得

空扰寡人 提交于 2019-12-09 21:06:01
C++Primer作者提到拷贝构造函数调用的三种时机: 1. 当用一个类对象去初始化另外一个类对象(类似于 AClass aInstance = bInstance),这里不是调用赋值构造函数(也叫赋值重载运算符)。复制是说初始化,赋值是初始化后重新覆盖旧值 2.函数形参是类对象 3.函数返回值为对象,函数执行完返回时会生成一个临时对象,将值复制给临时对象 但是下列代码验证时发现 第三个返回值是对象时并没有调用拷贝构造函数 class ZooAnimal { public: ZooAnimal() : loc (1){} ZooAnimal(const ZooAnimal &lhs) { this->loc = lhs.loc; cout << "copy construct" << endl; } virtual ~ZooAnimal() { cout << "deconstructer" << endl; } virtual void rotate() { cout << "ZooAnimal" << endl; cout << loc << endl; } public: int loc; string name; }; ZooAnimal func() { ZooAnimal x;     x,loc = 2; return x; } int main(int argc,

java动态代理

浪子不回头ぞ 提交于 2019-12-09 01:13:28
   引言   Java动态代理是代理模式的一种,代理模式就是:为另一个对象提供一个替身或占位符一控制对这个对象的访问。举个例子,明星都有一个经济人,一般各种商业活动,都会先找到经济人进行洽谈,洽谈成功,才会给明星安排上活动,经纪人就是明星的代理。   在java.lang.reflect包中实现了对代理的支持,利用这个包,可以在运行时动态的创建一个代理类。通过实现一个或多个接口,并将方法的调用转发到你所指定的类。   看下java动态代理的类图:   Proxy类是java根据Subject动态创建的,我们干预不了这个类,所以我们不能在这个类中,去做什么。我们需要一个方式来告诉Proxy我们要做什么。所以我们需要一个InvocationHandler来响应Proxy类的方法调用。可以理解为Proxy收到方法调用后,会将通过InvocationHandler来做实际的工作(其实InvocationHandler也是委托RealSubject来做的)。   简单demo代码  /** * 接口 */ public interface Subject { void doSomething(); } /** * 接口实现类 */ public class RealSubject implements Subject{ public void doSomething(){ System

深刻理解Python中的元类

家住魔仙堡 提交于 2019-12-07 08:22:26
译注: 这是一篇在 Stack overflow 上很热的帖子。提问者自称已经掌握了有关Python OOP编程中的各种概念,但始终觉得元类(metaclass)难以理解。他知道这肯定和自省有关,但仍然觉得不太明白,希望大家可以给出一些实际的例子和代码片段以帮助理解,以及在什么情况下需要进行元编程。于是e-satis同学给出了神一般的回复,该回复获得了985点的赞同点数,更有人评论说这段回复应该加入到Python的官方文档中去。而e-satis同学本人在Stack Overflow中的声望积分也高达64271分。以下就是这篇精彩的回复(提示:非常长) 类也是对象 在理解元类之前,你需要先掌握Python中的类。Python中类的概念借鉴于Smalltalk,这显得有些奇特。在大多数编程语言中,类就是一组用来描述如何生成一个对象的代码段。在Python中这一点仍然成立: 1 2 3 4 5 6 >>>classObjectCreator(object): … pass … >>> my_object=ObjectCreator() >>>printmy_object <__main__.ObjectCreatorobjectat0x8974f2c> 但是,Python中的类还远不止如此。类同样也是一种对象。是的,没错,就是对象。只要你使用关键字class

面向对象的三个特征:封装(抽象)、继承、多态

旧街凉风 提交于 2019-12-06 07:03:44
面向对象的三个特征:封装(抽象)、继承、多态。 继承 : 一种代码重用的方式。 1 、 父类 (基类,超类) 2 、 子类 1). 子类在同一个包下面能够范文父类除了私有 private 修饰的所有属性和方法 2). 在不同包下面 , 子类对象只能访问 public 修饰的属性和方法 3). 在子类内部 , 如果不同包的情况下 , 可以访问 protected 修饰的属性和方法 , 但是不能访问默认的访问修饰符修饰的属性和方法 4). 子类在初始化的时候会先调用父类的默认不带参数构造器 , 如果没有 , 就会报错 , 我们只有人为的修改: 1. 将父类添加一个无参数的构造器 2. 在子类构造器中手动使用 super() 声明调用哪个父类的构造器 3、extends (继承) 例: public class Son extends Father () {} Son : 子类 Father : 父类 子类通过继承父类,可以重用父类中定义的属性和方法。另外,在子类中,还可以定义子类特有的属性和方法。继承采用关键字 extends 。 封装 :按照信息隐藏的原则,将数据组织在一起。封装有两个特点: 信息隐藏,信息集合。 多态:(运行时加载) 1.继承 2.重写 3.父类引用指向子类对象(自动调用子类重写的方法) 允许使用父类(类型的引用)变量指向子类的对象,允许使用接口变量指向实现类对象

enable_shared_from_this用法分析

…衆ロ難τιáo~ 提交于 2019-12-06 06:56:05
一、背景 在 为什么需要异步编程 文章末尾提到,"为了使socket和缓冲区(read或write)在整个异步操作的生命周期一直保持活动,我们需要采取特殊的保护措施。你的连接类需要继承自enabled_shared_from_this,然后在内部保存它需要的缓冲区,而且每次异步调用都要传递一个智能指针给this操作"。本文就详细介绍为什么使用enabled_shared_from_this就能保证对象的生命周期,以及enabled_shared_from_this内部的具体实现分析。 二、为什么需要保证对象生命周期 首先想象下同步编程,比如socket建立connect后,read或者write数据,因为是同步阻塞的,数据传输完后,socket对象就已经完成了此次任务,此时就算对象销毁,也并不会引起异常。但是异步编程就不一样了,当一个线程调用一个异步函数(例如:该函数还是socket写文件任务),该函数会立即返回,尽管规定的任务还没有完成,这样线程就会执行异步函数的下一条语句,而不会被挂起。只有当"写文件任务"完成后,由新的线程发送完成消息来执行结果同步,但是当新的线程完成"写文件任务"后,再发送过来,此时异步函数调用方对象是否还存在,这就是个需要解决的问题,这也就是为什么需要保证对象的生命周期。 更加直白一点的例子,假设你需要做下面的操作: io_service service;

C#多态

跟風遠走 提交于 2019-12-06 05:25:22
1.1什么是虚方法? 在父类中使用 virtual 关键字修饰的方法, 就是虚方法。在子类中可以使用 override 关键字对该虚方法进行重写。 Virtual方法也可以单独执行。 1.2虚方法语法 父类: public virtual 返回值类型 方法名() { 方法体代码; } 子类: public override 返回值类型 方法名() { 方法体代码; } class CatType { public virtual void Cry() { Console.WriteLine("深呼吸,张开嘴巴,开始:"); } } class Cat:CatType { public override void Cry() { base.Cry(); Console.WriteLine("喵喵喵"); } } class Tiger:CatType { public override void Cry() { base.Cry(); Console.WriteLine("咆哮"); } } 1.3.虚方法使用细节 ①将父类的方法标记为虚方法, 就是在父类方法的返回值前加 virtual 关键字,表示这个方法可以被子类重写。 ②子类重写父类方法, 在子类的方法的返回值前加 override 关键字。 ③父类中的虚方法, 子类可以重写, 也可以不重写。 ④父类中用 virtual