java之旅 (第七天)面向对象与面向过程 类 局部变量与成员变量 构造方法 匿名对象
面向对象:
面向过程(PO):
一种非常古老的编程思想,顾名思义就是该思想是站在过程 的角度去思考问题,
强调的是功能的行为,指的是先完成什么功能,后完成什么 功能,而每一个功能都使用函数(方法)把
这些步骤一步一步的进行实现,需要使用的时候就依次调用 对应的功能就可以了。
说人话:
提倡和注重的是每一个功能都来使用方法进行操作,而继续 使用某一功能的时候就继续挨着方法就可以了
面向过程的最大的问题在于随着系统的膨胀,面向过程根本 没有办法应付,最终很有可能导致系统崩溃
为了解决这样的一个问题,有人提出了面向对象的编程思 想。
面向对象(OO):
是一种基于面向过程的编程,顾名思义,该思想是站在面向 过程的基础上去改善为面向对象
原则是将多个功能合理的放到到一个对象当中,然后指挥对 象来做事。强调的是具备某些功能的对象。
1.面向对象的优势和特点:
面向对象是一种更加符合我们思想的思维方式,稳定性好, 可重用性强,易于开发大型架构的软件,具备非常良好的可 维护性
2.点说,面向过程就是每实现一个功能都得去调用子方 法,而面向对象的编程,就是把功能都封装在一个类中,当 创建一个对象时,对象自己能完成一系列的功能
3.面向对象的三大特征:
封装:
封装是指将对象的细节和实现隐藏起来,然后通过公共的 访 问方式对外提供对象的功能
继承:
是实现面向对象代码复用的重要手段通过子类继承父类的方 法,子类可以是一种特殊父类,可以继续扩展也可以反复的 使用父类的方法
多态:
是可以直接把子类对象赋值给父类对象,但运行的时候依然 表现出子类的行为特征,这也就意味着同一类型的对象在运 行的时候可以表现出不同的姿态(行为特征)
4.面向对象和面向过程的举例:
买电脑:
面向过程:想清楚需要什么电脑-->百脑汇-->对比品牌-->确 定参数-->讨价还价-->电脑买回家
面向对象:想清楚需要什么电脑-->交给班长(给钱)-->班长买 回来
洗衣服:
面向过程:买个筒子-->装水-->脱衣服-->放水-->放84-->脚 踩两下-->倒脏水-->放清水-->飘两下-->拿出来-->拧干--> 晒
面向对象:找班长-->班长完成
注意:
千万不要误解为面向对象就一定会优于面向过程
面向对象本质上还是基于面向过程,如果你的项目非常非常 小 那么面向过程的开发能力甚至优于面向对象
类:
类:类是一组相关的属性(成员变量)和行为(成员方法)的集 合,是一个抽象的概念
对象:是该类事物具体表现的存在,也是具体存在的个体(类 的实例化)
成员变量:和之前的变量的定义的格式是一样的,但是位置不 同,在类中方法外
成员方法:和之前的方法的定义格式是一样的,只不过我们想 去掉static
创建对象:
类名 对象名 = new 类型(); //加括号表示构造函数
用对象的成员方法:
对象名.方法名();
对象的比较:
每一次new出来的东西,都会有新的地址值 新的空间
对于对象来说,而"==",比较的是地址值是否相同,而不是内 容是否相同,因此所有的引用类型都需要用.equal()方法比 较
注:
String类型的equal方法直接调用就可以(s.equal("ni"))
数组的equal()方法需import java.util.Arrays
Arrays.equal(str1,str2);
自定义的类型需要自己重写equal()
对象的生命周期:
从new出来的时候开辟空间,到垃圾回收器回收的时候结束生 命
垃圾:内存当中的某一块空间没有被一个栈内存引用的时候, 才是垃圾
垃圾产生时,不一定会运行GC,GC是自动调度 我们没有办法 进行干预(garbage collection )
补充:
1.在C++中,成员变量(数据成员) 方法成员(成员函数)
2.在C++中,class类是独立于main方法之外的,可以不执行 类。但是java中的main函数是在类中,因此至少执行一次 类。但是两种语言都是先从main函数开始执行。
3.栈内存:存放Java语言的所有局部变量(方法内)以及自 定义对象的引用
堆内存:存放Java中所有new出来的东西
方法区:方法区中包含的都是在整个程序中永远唯一的元 素,如class,static变量。
4.C++中,数据成员不可以直接在定义时赋初值,而java中成 员变量是可以在定义时赋初值的。
5.目前无法定义对象数组:Student []arr=new Student [5]
arr[0].name="nihao"; //编译器会报错,说空指针
因此,目前只能:
Student stu=new Student();
Student stu1=new Student();
Student [] arr={stu,stu1};
局部变量 成员变量:
在类中的位置不同:
成员变量 类中方法外
局部变量 方法内或者方法声明上 (main方法也在class中)
在内存中的位置不同:
成员变量 堆内存
局部变量 栈内存
生命周期不同
成员变量 随着对象的存在而存在,随着对象的消失而消失
局部变量 随着方法的调用而存在,随着方法的调用完毕而消 失
始化值不同
成员变量 有默认的初始化值
局部变量 没有默认的初始化值,必须先定义,赋值,才能使 用。
注:
1.局部变量的命名可以和成员变量的命名一致,但是调用 遵 循就近原则
2.在C++中,在函数中,有局部变量与全局变量之分(在同一 函数内,允许同名变量,在类中也允许名变量,但是需要用 this->a来区分数据成员与形式参数)在java中,同一方法中 不允许同 名变量,但是类中就允许成员变量与局部变量同 名(需用 this.来区分成员变量与局部变量)
区分:
C++中this是指针,装载对象的地址,需要this->,(*this)l 来访问
java中this是对象的引用,直接this.方法就可以访问
3.new 出来的对象只是给成员变量在new中分配空间,但是类 的方法中的局部变量都是在栈中分配内存的,并且引用也是
构造方法:
构造方法:
给对象进行数据初始化(定义及初始化,需传参)
格式:
a.方法名和类名一致
b.没有返回值类型,甚至连void也没有
c.没有具体的返回值
举例:
class Student{
private String name ="toobug";
private int age=18;
public Student() {
name = "刘飞龙";
age=30;
System.out.println("我是构造");
}
}
注:
1.java中,成员变量(成员方法)默认为public,需要手动 加上private,而且必须每一个都写上属性关键字
C++中,数据成员,成员函数默认属性为private,并且可以 用 private: 表示一堆东西(数据 函数)共一个属性
2.java中的成员变量允许赋初值,C++不允许(只能在构造函 数以及成员函数中赋值以及改变)
3.在栈中与方法区都有一个main,并且它们的地址都是一样 的(相关联)
4.在我们之前的所有代码当中,其实都有使用构造方法,但 是我们从来没自己去定义过构造(系统自带的无参构造函 数)
5.如果我们手动给出了任意构造方法,系统将不再提供默认 的无参构造。如果这个时候还想继续使用无参构造,就必须 自己手动给出,而且建议永远提供无参构造
匿名对象(临时变量):
a.调用方法,仅仅只使用一次的时候进行使用
注:
1.如果使用多次,这种定义变量的方式不适合 因为会产生 多个对象,而且是垃圾对象
2.好处:匿名对象使用完毕之后就是垃圾,垃圾可以被垃圾 回收器进行回收
举例:
Student s = new Student();
s.show();
s.show();
System.out.println("--------------------");
new Student().show();
new Student().show();
//其实这里是一个新的内存地址,没有赋值给栈内的变量, 用完一次就成了垃圾,等着被回收