面向对象总结

Private私有化:

一般的话只对外提供几个功能的话,会把具体实现的过程给封装起来,这样可 可以不让外界随意改动代码,如果私有化成员属性的话,要对外提供两人个方法set get ,因为属性是不能有逻辑判断的,只是容器,用来放东西的,但如果放入的东西不符合规范就会出错,所以要私有化成员属性,再用set 和 get,函数里面可以进行逻辑判断,可以规定属性的范围,这样不容易出来安全隐患。

构造函数:

只要是类,都会有构造函数的。如果自己没有写,就是系统默认生成的,但如果自己写了构造函数,那系统就不会生成了。构造函数是可以被重载的,也就是可以定义多个构造函数,只要类型不一样或者个数不同就可以了。一般可以用来给成员变量初始化的,所以没有返回值和返回类型,如果事物有需要了,可以定义多个构造函数,对方调用哪个,就给哪个初始化,可以让对方选择。构造函数和一般函数不一样的是,一创建新的类就会运行构造函数了,但只运行一次,一般的函数你不调用他是不会运行的,也可以运行多次。

代码块:

代码块比构造函数还要先执行,也执行一次,代码块只要是类中的对象都会初始化,而构造函数是针对的调用他的对象。类中的话运行顺序是:成员变量——》代码块——》构造函数

程序运行的顺序:

main()

{

Person p = new Person();

}

创建一个对象都在内存中做了什么事情?

1,先讲硬盘上指定位置的Person.class文件加载进内存。

2,执行main方法时,在栈内存中开辟了main方法的空间(压栈-进栈)

然后在main方法的栈区分配了一个变量p。

3,在堆内存中开辟一个实体空间,分配了一个内存首地址值。

4,在该实体空间中进行属性的空间分配,并进行了默认初始化。

5,对空间中的属性进行显示初始化。

6,进行实体的构造代码块初始化。

7,调用该实体对应的构造函数,进行构造函数初始化。

8,将首地址赋值给p。p变量就引用了该实体。(指向了该对象)

构造函数有没有return语句?

构造函数中没有void也没有返回值类型,所以是没有return语句的,但是如果加个判断,条件成立就用return返回,这样做是可以的。

单例模式:

就是为了保证所需要的值在内存中的唯一性。一般是内部创建方法,对外提供方法,禁止外部直接访问。

一般是可以用两种,懒汉式和饿汉式,一般是三个步骤:

1, 给构造函数私有化,禁止外部对其直接访问。

2, 在内部new一个对象,私有化并静态

3, 对外提供一个静态的方法让其访问栈内存中的地址,可以让其唯一性,静态是方法直接

以类名.方法的形式让外界调用函数,因为new是不行的,外界不能访问的

4, 懒汉式是在new对象的时候,赋值为null,在方法中判断如果是空就赋值

调用方法有几种?

1, 用new的方法,创建对象来使用方法

2, 如果方法是静态的,可以用类名.方法来调用此函数的方法

3, 如果方法没有调用其它的变量或者函数,只是方法内部定义功能的话,可以把该功能定

义为static,这样不管是静态还是非静态都可以调用此功能,如果是别的类,就不用new对象也可以调用了;static变量是这个类中所有方法一种共性的抽取,只要是类中的方法都可以调用这个变量。

代码块:

1, 静态代码块:随着类的加载而加载的,代码块比成员变量和静态变量都还要先运行 2, 构造函数代码块:比构造函数先运行的

3, 运行的顺序是:静态代码块——》静态变量——》成员变量——》构造代码块——》构

造函数

用new和类名.方法的区别?

方法如果不调用外界的特有数据,就可以加静态,这样调用就可以直接用类名调用了,这样不用再在堆内存中走一遍了。New的话什么都可以创建包括静态的,不过都要在堆内存中创建对象,不管用不用得到,所以如果有静态可以不new省内存空间。

This的用法以及该什么时候使用?

This(构造函数) this代表哪个对象在使用它,它就代表哪个对象,也可以用在构造函数上面,但是要放在第一排,一般是一个构造函数引用另一个构造函数时可以用到,在一个构造函数里面,这样的引用只能使用一次。

一般是要用到本类中的变量或者方法的时候可以加入this,这样可以不起到冲突,指的永远都本类方法中的变量。

什么时候用覆盖?

当一个类的功能要修改时,可以用覆盖操作

抽象类的细节:

1, 抽象类可以有构造函数,用来给子类函数初始化用的

2, 抽象类中可以定义非抽象的方法,抽象类和普通的类差不多,区别主要是比普通类多了

一个抽象的功能,少了一个方法主体。

3, 抽象关键字不能用private static final共同存在,static:抽象类没有方法主体不能被静态直

接调用;final:如果定义为了最终值的话,抽象类不能被子类实现了;private:抽象是不能被访问的。

4, 抽象类中也可以不定义抽象方法,就是为了不让外界创建对象。

5, Final:如果一个类的话只是默认初始化的话,是可以赋值的,赋完了就不能动了,如果

不是默认初始化已经赋值过了,或者XX初始化过了就不能再动了

继承关于覆盖:

如果父类和子类都定义了相同的属性,调用子类的话,默认是用子类的属性,如果想要调用父类的属性就必须用super(),与this()的用法相近,super只用于继承中的,this的话可以调用本类中的属性。在内存中父类的属性还是存在的,只不过调用了子类的,我们形象的说是子类把父类覆盖掉了,一般很少出现父类和子类的属性相同,可以直接调用父类的。

This()和super()区别?

两个都是访问构造函数的,都是放在构造函数的第一行,所以两个不能同时出现在同一个构造函数中,super()只要是构造函数第一行默认都会有的,但当定义了this()时不会出现了,但是还是会调用父类的构造函数,因为this()调用的构造函数第一行默认还是super()所以还是会去访问父类的构造函数。

覆盖的注意事项:

1, 子类要覆盖父类的时候,访问的权限不能小于父类。

2, 覆盖的时候如果一方是静态,另外一方也必须是静态的。

Private和set,get方法的应用及作用域

一般类的属性都会加上private,然后根据具体的需求,设定调用都是否需要更改值或者只调用值,一般定义类都是对外提供方法,但具体的实现步骤是不需要对外公布的所以加私有化。如果父类中定义了private属性,子类不能直接访问,只能间接访问。

抽象类与接口的区别?

1, 抽象类与普通的类差不多,只能被单继承,接口一定需要实现,支持多实现

2, 抽象类可以继承接口

用法:接口可以对外定义一个规则,让程序按照指定的规则来实现接口,内部只要调用接口

的方法就可以;抽象类是子类很多都有具体的实现方法,要定义抽象,如果是具体的公共部分则不需要,子类拿来用就行了。

继承与接口的观点:

1,其实类与类之间的继承是小范围内的,都是些具体的方法对象,所以两个之间的关系会

很紧密。

2,抽象类与子类之间的话范围又比继承的类会大一些,比如一个体系或者一个种群,因为抽象类是在最上面的,而下面具体的实现都是不一样的,单独的个体有不同的实现方法,但是这些个体现全部是有这个功能的,抽象类就有了很多不确定因素,个体现之间一样的功能,一样的实现方式会比较少。

3, 接口的范围是最大的,看起来好像是桥一样,没有什么关系,但如果是从最大的角度看,

接口就是生活,就是生物,比抽象还要大或者很难找到共性的东西,范围太大了,就好比我们生活在地球上,只要是地球上的东西,都跟地球有关,但具体要相关起来也没什么联系,所以我们定义一般都会是一个体系,这样我们体系的最顶层就是抽象,体系之间就可以用看似没有关系的接口当做桥联在一起

4, 一般的范围都不超过抽象。一个体系中最上面是抽象,下面有很多个体就是抽象的子类,

要用自己具体的方法。想要体系中没有的元素就要调用接口,问接口去拿,接口可以别人定义,但不是体系中的,可以被体系调用。

接口的定义:

1, 接口不能被创建对象,只能被类实现

2, 接口与接口之间存在多继承

3, 接口可以继承多个接口

4, 一个类继承另一个类的同时,可以有多个接口

5, 接口的成员变量都是以 public static final 固定写法

6, 接口的函数是以 public abstract 固定的写法的

内部类特性:

1, 内部类是什么:可以把内部类看成是一个数据或者对象,因为类就是类类型的,跟

数组,集合,整型差不多,可以被当做成员变量和局部变量。把内部类看成一个类类型的变量就行

2, 内部类的使用:跟成员变量一样,可以加修饰的,private static 默认,这三种,一

般大多数都是定义在内部的不想让外界直接访问都会加private。如果放在局部变量的位置上的话,内部类如果调用外部类的变量或者属性要在这个变量或属性前加final,不然程序会报错

3, 内部类的调用:如果内部类没有加私有化,那么外界是可以调用内部类里的方法的,

有三种。

类是静态的:外部类对象.内部类对象变量名 = new 外部类对象.内部类()

变量名.方法

内部类和方法全是静态:外部类对象.内部类对象变量名 =外部类对象,内部类对象.

方法

内部类和方法都不是静态:外部类对象.内部类对象变量名 = new 外部类对象.new

内部类

变量名.方法

如果方法是静态,内部类不是静态是会报错的。编译成class文件的时候没调用内

部类,没加载进内存,但是外部类运行的时候会自动找到

静态static并把他加载进内存,java报错

4, 如果外部类中有个num 内部类中一个num 方法中也有个num,想调用方法区的直

接num,调用内部类用this.num,调用外部类用外部类对象.this.num.

多态在父类和子类成员之间的编译和运行

父类变量名 = new 子类

1, 成员变量:当创建父类类型的时候,变量指向了子类,子类继承了父类,成员变量不存

在覆盖,所以当变量名调用变量的时候,会调用父类的变量。

2, 函数:子类继承父类,如果函数一样的话,子类函数会覆盖父类的函数,当变量名调用

函数的时候,调用的是子类的函数

3, Static:如果是静态的,当加载类的时候,父类和子类的静态函数都加载到方法区中了,

所以如果调用方法是父类对象.方法直接到方法区里调用,不经过堆内存了,所以是用父类的静态方法

4, 编译的时候,只要符合格式的规范,引用数据类型有具体的对象;父类函数中有要调用

的函数;static的时候只要有静态的方法就行了。

多态的定义:

子类干的活,父类去做了,如果子类多的话,父类能够全部搞定。但是不能做子类特有的方法,只能做所有子类公共的,也就是父类有的方法都能做。定义很多子类的时候,可以试着抽取他们共性的方法,用他们公共的方法去做事。

如果要做子类特有的活,要把父类强转化成子类,再去做子类的活,当然父类引用的原形要是具体的一个子类,才能做这个子类特有的方法。

Object 所有类的父类,上帝的基本功能大家都能用:

1,boole equals():用来判断两个对象是否相等。可以覆盖用来比较任意两个值是否相等 2,String toString():把对象转化成字符串。可以覆盖把定义的值转化成字符串。

3,Class getClass():获取任意对象的对象名。

4,int getCode():获取哈希值,可以覆盖来用获取其它值。

 

第二篇:面向对象总结

1. 面向对象=对象+类+继承+通信

2. 对象是面向对象开发模式的基本成份。每个对象可用它本身的一组属性和它可以执行的一组操作来定义。属性一般只能通过执行对象的操作来改变。操作又称为方法或服务,它描述了对象执行的功能,若通过消息传递,还可以为其它对象使用。

3. 消息是一个对象与另一个对象的通信单元,是要求某个对象执行类中定义的某个操作的规格说明。一个对象接收到消息则调用消息中指定的方法,并将形式参数与参数表中相应的值结合起来。

4. 类是一组具有相同数据结构和相同操作的对象的集合。类的定义包括一组数据属性和在数据上的一组合法操作。类定义可以视为一个具有类似特性与共同行为的对象的模板,可用来产生对象。同一个类的每个对象都是类的实例 (Instance),它们都可使用类中提供的函数。对象的状态则包含在它的实例变量,即实例的属性中。

5. 继承是使用已存在的定义做为基础建立新定义的技术。新类的定义是基础类所声明的数据和新类所增加的声明的组合。新类复用既存的定义,而不要求修改既存类。既存类可当做基类来引用,则新类相应地可当做派生类来引用。

6. 面向对象的特点:封装(Encapsulation):通过定义类实现;继承(Inheritance):通过派生新类实现;多态性(Morphism):虚拟函数实现。

7. 函数:完成特定功能的一段代码;具有合法的名称;具有一定返回类型;可以多次调用。

8. 参数的传递:值调用、地址调用、引用调用、参数的求值顺序。

9. 重载:具有相同函数名,但其参数个数不同或参数类型不同的一组函数称为重载。

10. 函数声明中可以为一个或多个参数指定缺省参数值。具有缺省值的参数右边不能出现没有缺省值的参数。重载函数的参数具有缺省值时要注意。

11. C++的类是对象的抽象:数据成员、成员函数。

12. 类的结构(外部说明):访问控制描述符:

public后声明的是公有数据成员和成员函数,可被任何程序单元引用。

private后声明的是私有数据成员和成员函数,仅可被类内部引用。

public和private出现的顺序和次数是任意的。

13. 类的结构(内部实现):类成员函数的实现

返回类型 类名::成员函数名(参数声明){语句序列;}

14. 类的实例化--对象的实现

一般语法: ----类标识符 对象标识符;

可以声明多个对象,对象之间代码共享,数据独立。可使用对象名引用对象的公有成员函数。方法如下:------对象名.成员函数名(参数列表);

15. 类的实例化—对象的实现:成员函数所操作的数据成员是该类的某个对象的数据成员。(注:将一个标识符与一个程序实体相关联的过程称绑定。分静态和动态绑定两种。静态绑定在编译时进行,动态绑定在运行时进行。)

16. 构造函数和析构函数:构造函数的作用是在对象被创建时使用特定的值构造对象(初始化)。析构函数的作用是在对象被删除时做一些清理工作。构造函数与类同名。析构函数是类名前加~。两者无返回类型,析构函数无参数。

17. 成员函数的内联实现:(1)函数体放在类体内;(2)函数体放在类体外,使用inline关键字。

18. 带缺省参数值的成员函数和成员函数重载

19. 作用域:一个标识符的有效区域。分为:函数原型作用域、块作用域、类作用域、文件作用域。(1)函数原型作用域:函数原型中所作的参数声明在该作用域,始于左括号(,结束于右括号)。(2)块作用域由一对花括号定义。(局部作用域)

20. 可见性:标识符是否可以引用。在嵌套作用域中,内层作用域的标识符优先于外层作用域的标识符。C++中,标识符必须先声明后引用,在同一作用域中不能声明同样的标识符。

21. 对象的生存期:(1)静态生存期:与程序的运行期相同。这种对象的存储单元相对位置在整个程序的运行期间不变;文件作用域或用static指定。若未显式指定初始值,为零。(2)动态生存期:在函数内部(块作用域)声明的对象是动态生存期。若未显式指定初始值,为任意值。

22. 数据共享的方法:数据存储在局部对象中,通过参数传递机制实现函数间的数据共享。数据存储在全局对象中,通过全局对象进行数据交换。封装在类中。全局对象存在的问题:可见性无限制、不能保证操作的合法性。解决上述问题的方法是类及其封装技术,相应提出静态数据成员和静态成员函数。

23. 指针:对象的地址;指针对象:存放指针的对象。一个指针对象被赋值为一个对象的地址后,称指针指向对象。

24. 数组:一组类型相同的对象。数组元素也可以用指针引用。通过指针引用数组元素:定义指针对象;数组的地址赋值给指针对象。指针引用数组元素的方法:*(pointer + n)或pointer[n]

25. 对象数组:没有为数组指定显式初始值时,数组元素使用缺省值初始化,当定义对象数组时,类中必须定义一个缺省的构造函数。

26. 引用:是标识对象的一种机制(是对象的一个别名)。一般用作参数类型、函数返回类型。一般语法如下: --基本类型& 标识符。一个引用不是独立的对象,只是对另一个对象的引用。--基本类型& 标识符=对象;

27. 栈对象与堆对象:在程序运行中根据需要在堆内存中创建的对象,使用完成后随时被删除。删除语法如下:---delete ptr;;数组对象的删除 delete[] ptr;

28. this指针:一个成员函数被调用时,被自动传递一个隐含的参数,该参数是一个指向正被该函数操作的对象的指针,在程序中可以用this引用它,因此称其为this指针。

29. 操作符重载:当使用操作符来表达对对象的某个操作时,可以将操作符函数声明为类的成员函数或类的友员函数。操作符的参数个数、优先级、结合性和使用语法是由C++规定的,不能被改变。重载操作符的形参不能具有缺省值。重载操作符的返回值类型任意,但最好不是void 。

30. 两种方法的比较:一元函数最好重载为成员函数;二元函数一般重载为友元函数:27.5+x。赋值操作符只能重载为成员函数:27.5=x。++和--操作符有两种形式,一般被重载为成员函数。其中后缀操作重载后带有一个整型参数。下标操作符只能被重载为成员函数

函数调用操作符可以看作是下标操作符的扩展。

31. 继承与多态性:通过已有的类进行扩展产生新类的过程;产生的新类称派生类;产生派生类的类称基类或父类。从一个基类派生称单基继承,从多个基类派生称多基继承。

32. 单基继承的语法:class 派生类名:访问控制 基类名{数据成员和成员函数

声明;}

多基继承:class 派生类名:访问控制 基类名1,访问控制 基类名2…{同上;}

33. 访问控制用于控制基类中声明的名字在多大的范围内能够被派生类的用户访问

访问控制有三种public,protected,private

其他程序模块:基类模块、派生类模块、间接派生类模块。

34. 多继承:可以将其视为单继承来考察,每个基类与派生类的关系可以当做单基继承。

35. 派生类的数据成员由属于基类的部分和属于自己的部分组成,属于基类的部分初始化应由基类的构造函数完成。构造函数不被继承,派生类必须调用基类的构造函数来初始化属于基类的部分数据成员。

一般形式如下: ----C::C(参数表0):C1(参数表1),C2(参数表2),…,Cn(参数表n) 如果冒号右边的某个基类的构造函数参数表为空,则可以省略该项。构造对象时,先执行基类的构造函数,然后执行派生类的构造函数,析构时则相反。多基继承时基类构造函数的执行顺序由继承时的顺序决定(从左向右),与初始化列表中的顺序无关。

36. 如果派生类的一个表达式引用基类中不止一个成员,则存在二义性。 解决二义性的办法是加类限定符。

37. 虚基类:为避免一个基类在多条继承路径上造成在派生类中产生多个基类子对象,可以采用虚基类技术。

38. 拷贝构造函数:用一个对象初始化一个正在建立的同类对象。拷贝构造函数的参数是引用参数。每个类都有一个拷贝初始化构造函数。如未定义,则编译器自动生成一个。功能:用作为初始值的对象的每个数据成员初始化正建立对象的对应的数据成员。

39. 赋值:当需要进行对象之间的赋值操作时,必须定义赋值操作。为与习惯一致,一般用作为=赋值操作符。当使用操作符作为函数名时,必须与关键字operator合用。赋值操作的参数最好用引用方式。赋值操作的参数最好采用引用方式。赋值操作的最好返回对被赋值对象的引用。一般形式:X& X::operator=(const X& p);

40. 派生类的赋值和初始化:如未定义拷贝构造函数和赋值操作,则编译器提供。如自定义,则应在实现中调用基类的拷贝构造函数和赋值操作。

41. 虚函数与多态性:如果类型S是从类型T共有继承的,则称类型S是类型T的子类型。类型S的指针或引用可以适用于类型T的指针或引用的场合。

42. 动态绑定与虚函数:由于在基类和派生类中,相同的名字执行的操作可能不同,所以基类的成员函数在派生类中经常有不同的实现。用virtual关键字可以实现动态绑定。动态绑定只适用于虚函数的参数是指针或引用的情况。 在一个成员函数内调用虚函数时,对该虚函数的调用进行动态绑定。

派生类中虚函数必须满足下列条件:与基类的函数有相同个数的参数;参数类型相同;返回类型或者与基类相同或者返回指针或引用,且返回的指针或引用的基类型是基类中对应函数所返回的指针或引用的基类型的子类型。 在一个成员函数内调用虚函数时,对该虚函数的调用进行静态绑定。

43. 纯虚函数与抽象类:当定义基类时某个虚函数不能给出确定的实现时,可以定义其为纯虚函数。语法如下:virtual 类型 函数名(参数列表)=0。具有纯虚函数的类称为抽象类,抽象类只能用来派生类而不能定义具体的对象。

相关推荐