
本文共 4260 字,大约阅读时间需要 14 分钟。
一、什么是面向过程的开发方式,什么是面向对象的开发方式?
(1)面向过程的开发方式,主要的特点是注重步骤,第一步干什么,第二步干什么。
另外面向过程也注重实现功能的因果关系。
因为A所以B
因为B所以C
(2)面向过程有什么特点?
面向过程最主要的是每一步每一步的因果关系,其中A步骤因果关系到B步骤,A和B联合起来形成一个子模块,子模块和子模块之间又因为因果关系结合在一起,假设其中任何一个因果关系出现问题(错误),此时整个系统的运转都会出现问题。(代码和代码之间的耦合度太高,扩展力太差。)
(3)面向过程有什么优点(快速开发)?
对于小型项目,采用面向过程的方式进行开发,效率较高,不需要前期进行对象的提取,模型的建立,采用面向过程方式可以直接开始干活,
(4)什么是面向对象的开发方式?
采用面向对象的方式进行开发,更符合人类的思维方式。面向对象就是将现实世界分割成不同的单元,然后每一个单元都实现成对象,然后驱动一下,让各个对象之间协作起来形成一个系统。
(5)举个栗子
让我说一下面向过程和面向对象的区别,就是同样是电视,电视是有什么的部件构成的,如果焊接在一起,那么如果有一个部件坏了,会导致整个电视就可能需要换新的了,这就是面向过程,也就是说耦合度比较大,扩展能力不强,如果是面向对象,那么电视的各个部件是拼接在一起的,一个部件坏了,可以买个新的,只换部件就好了,所以,扩展能力比较强。
二、面向对象的程序开发过程
OOA(Object-Oriented Analysis):面向对象的分析;OOD:面向对象的设计;OOP:面向对象的编程。
这个是整个软件开发的过程,都是采用OO进行贯穿的,实现一个软件的过程。
三、面向对象的三大特征
(1)封装(2)继承(3)多态
四、类和对象
(一)类和对象的概念
(1)什么是类?
类实际上在现实生活中是不存在的,是人类抽象的概念,是不存在的。类是一个
(2)什么是对象?
对象是实际存在的个体。
在java语言中,要想得到"对象",必须先定义“类",对象是通过类这个模板创造出来的。
(3)重要术语
实例:对象还有另一个名字
实例化:通过类这个模板创建对象的过程,叫做实例化。
类里面包括什么?
一个类=属性+方法,属性来源于状态,方法来源于动作。
(二)类的定义
(1)类语法格式:
[修饰符列表] class 类名{ //类体=属性+方法 //属性在代码上"变量"的形式存在 //方法描述动作/行为 }
(2)为什么属性是以变量的形式存在的?
因为属性对应的是“数据”,数据在程序中只能放到变量中。属性就是变量。
(3)变量分类:
方法体声明的变量:局部变量,方法体外声明的变量:成员变量。
(三)对象的创建
(1)创建对象的语法是什么?
new 类名();类名 变量名 = new 类名();Student s1 = new Student();这个和 int i =10; 是一样的。
解释:Student和int都是数据类型,都是在栈中开辟内存的。
s1和i都是变量名,10是具体的数据,new Student()是创建的对象是在堆中开辟内存。最后s1里面存储的是new Student()的地址。
五、创建对象时内存的变化(创建对象的原理)
(1)对象在那个内存中存储?
凡是通过new运算符创建的对象,都是存储在堆内存当中,new运算符的作用就是堆内存中开辟了一块空间,栈的活动最平凡,对象存储在堆内存当中,局部变量存储在栈内存当中。
(2)成员变量默认赋值
变量必须先声明,再赋值才能访问,局部变量是这样,但是对于成员变量来说,没有手动赋值时,系统默认赋值,赋的值都是默认值。
类型 |
| 默认值 |
Byte
|
| 0 |
Short |
| 0 |
Int |
| 0 |
Long |
| 0L |
Float |
| 0.0F |
Double |
| 0.0 |
Boolean |
| false |
Char |
| /u000 |
引用数据类型 |
| null |
(3)什么是实例变量(一个对象一份)
对象又被称为实例,实例变量实际上就是:对象级别的变量。
public class Student{ double height;}
height这个属性明显所以的学生都有,但是每一个对象都有“自己的身高值”,假设创建10个对象,那么就要10个height值,所以这种变量数据对象级别的变量,也就是实例变量。
实例变量在访问的时候,不能通过类.实例变量名来进行访问,因为实例变量必须先创建一个对象,堆内存中存储对象,以及对象的实例变量。
保存对象内存地址的变量,比方说Student s1 = new Student(); s1就保存了new Student()的地址,所以s1就是引用。
(4)对象和引用的区别?
对象是通过new出来的,在堆内存中存储,引用是:但凡是变量,并且该变量中保存了内存地址指向了堆内存当中的对象的。
(对象是从堆中new出来的,引用是存储对象内存地址的一个变量)
(5)如何访问实例变量
语法机制:
引用.实例变量名
(6)举个栗子,并且画出内存图。这个超级重要。
//地址类public class Address{ //一个家庭地址有3个属性 //城市 String city; //街道 String street; //邮编 String zipcode;}
//用户类public class User{ //类=属性+方法 int id; String username; Address addr;}
public class Test{ public static void main(String [] args){ //家庭住址对象 Address a = new Address(); a.city = "廊坊"; a.street ="爱民西道100号"; a.zipcode="12345"; //用户对象 User u = new User(); u.id = 1; u.username = "廊坊师范"; u.addr = a;}}
内存图如下:
总结:java中只要一个传递规则:
不管你是什么数据类型,基本也好,引用也罢,实际上在传递的时候都是将变量中保存的那个“值”复制一份过去,传过去,值的话,就直接复制,引用的话,就直接复制地址。
(六)程序在什么情况下会出现空指针异常
(1)程序在什么情况下会出现空指针异常?
引用没有了存储的地址就会出现空指针异常。
因此 User这个对象,没有引用指向它了,java中规定堆内存程序员是无权利直接操作的,此时这个对象就像氢气球,一样飘走了,等待垃圾回收期的回收,GC会将这个垃圾对象释放掉。
(2)什么时候数据会被垃圾回收期回收?
没有任何引用指向该对象的时候。
(3)出现空指针异常的前提条件是?
“空引用”访问实例(对象)相关的数据时,都会出现空指针异常。
(七)方法的调用时参数传递问题
(1)当值传递为基本数据类型:
x是局部变量,它的域是main区。
i也是局部变量,它的域是add。
Int x =100;
Int y =x;
这个和上面有异曲同工之妙。
java中规定:参数传递的时候,和类型无关。不管是基本数据类型还是引用数据类型,统一都是将盒子中保存的那个“值”复制一份,传递下去。内存地址也是值,也是盒子中保存的一个东西。
java中只要一个规定:参数传递的时候,一定是将“盒子”中的东西复制一份传递过去。
(2)当值传递为引用数据类型
分析:add方法里面的形式参数为Person,所以为引用数据类型。Person p 变量是在栈中存储的,但是存储的是new Person()的地址,也就是说p是指向new Person的。
重点(总结):java中关于方法调用时参数传递实际上只要一个规则:
不管你是基本数据类型,还是引用数据类型,实际上在传递的时候都是将变量中保存的那个"值"复制一份,传过去。
Int x =1;Int y =x;把x中保存1复制一份传给y。Person p1 = new Person(Person p1= 0x123);Pserson p2 = p1 (相当于p1=0x123传给p2);p1和p2都是两个局部变量。
(八)构造方法
(1)什么是构造方法,有什么用?
构造方法是一个比较特殊的方法,通过构造方法可以完成对象的创建,以及实例变量的初始化,换句话说:构造方法用来创建对象,并且给对象属性赋值。(实例变量没有手动赋值时,系统会默认赋值。)
(2)当一个类没有提供任何构造方法,系统会默认提供一个无参数的构造方法。
(3)构造方法如何调用?使用哪个运算符呢?
使用new运算符 语法格式: New 类名();
(4)构造方法的语法结构?
[修饰符列表] 构造方法名 (形式参数列表){ 构造方法体; (通过在构造方法体中给属性赋值,完成属性的初始化。) }
它和普通方法的区别就是没有返回值。
注意:(a)构造方法名和类名必须一致。
(5) 构造方法
(a)当一个类中没有提供任何构造方法,系统默认提供一个无参数的构造方法,这个无参数的构造方法叫做缺省构造器
(b)当一个类中手动的提供了构造方法,那么系统将不会再提供无参数构造方法
(c)无参数构造方法,和有参数构造方法都可以调用。
Student x = new Student();Student y = new Student(123);
(d) 构造方法支持方法重载吗?
构造方法是支持方法重载的
(6)实例变量没有手动赋值的时候,实际上系统会默认赋值,那么是什么时候进行复制的?
是在类加载的时候给这些实例变量赋值的吗?
不是,实例变量是在构造方法执行的过程中完成的初始化的,完成赋值的。
其实在构造方法里面给实例变量赋的值,只不过看不见。
对于实例变量来说,只要构造方法没有赋值,那么系统都会自动给它赋默认的值。
public User(){age =0;name =null;id=0}
总结:面向对象就是更加符合人的思维逻辑,因为人认识事物就是面向对象的,面向对象的重点也就是知道创建对象在内存中是如何变化的,以及在值传递的时候,如何传递的。
发表评论
最新留言
关于作者
