5.Java基础知识:面向对象01
1、面向过程和面向对象
1.1 面向过程
按照这种思想写程序,我们就要先分析整个程序有哪些功能组成,然后分别写函数实现每一个功能,最后按顺序调用这些函数,实现整个功能;
1.2 面向对象
是一种解决问题的思想;按照这种思想解决问题,我们关心的是事情中有哪些参与者
1.3 举例:
例如:吃饺子
面向过程的方法:
1、包饺子:买菜、洗菜,买面粉;先剁馅,再和面;包饺子;
2、煮饺子:烧开水,下饺子;
3、吃饺子:
4、收拾:收拾碗筷;
面向对象的方法:
1、有饺子:找个饺子馆,告诉老板要吃什么馅,多少个饺子,然后等;
2、吃饺子:服务员端上饺子,开吃;
按照面向过程的方式写程序,我们要亲自写函数实现每一步功能
而按照面向对象的方式写程序,我们一般都是在使用别人已经写好的
1.4 区别:
- 关注点不同:
面向过程:关心的是事件中的每一步功能怎么做;
面向对象:关心的是事件中的每一步功能有没有什么对象已经实现好了,然后直接拿来使用;
- 效率不同:
面向过程:因为自己要参与每一步的实现,所以效率比较慢;
面向对象:因为大多数都是调用别人已经实现好的功能,所以效率比较高;
- 开发质量:
面向过程:因为是自己一步步实现的,大多数情况会有地方会出问题;
面向对象:因为大多数都是调用别人写好的功能,而这些功能一般都经过大量的验证,质量有保证;
- 使用范围不同:
面向过程:适合解决需求简单的问题;
面向对象:更适合解决复杂的需求;
注意:面向对象里面也有过程存在;面向对象是基于过程的,二者并不排斥;
2、对象在需求中的使用
使用伪代码描述 人吃饺子 场景:
1.找对象
名词: 人 饺子
对象: 人 饺子
2.描述对象:
人{
吃(饺子){}
}
饺子{}
3.模拟场景:
// 创建人和饺子的对象
人 小明 = new 人();
饺子 东北饺子 = new 饺子();
//模拟场景
小明.吃(东北饺子);
3、对象在代码中的体现
/**
1.找对象
名词: 人 饺子
对象: 人 饺子
2.描述对象:
人{
吃(饺子){}
}
饺子{}
3.模拟场景:
// 创建人和饺子的对象
人 小明 = new 人();
饺子 东北饺子 = new 饺子();
//模拟场景
小明.吃(东北饺子);
*/
// 使用面向对象思想,用伪代码描述一个场景;
class Person{
void eat(Dumplings d){
System.out.println(d);
}
}
class Dumplings{
}
class Test{
public static void main(String[] args) {
Person xiaoming = new Person();
Dumplings dongbei = new Dumplings();
xiaoming.eat(dongbei);
}
}
4、类和对象的区别
java中,都是先有类,然后才能根据类创建对象;
5、局部变量和成员变量
5.1 概念
成员变量: 直接定义在类中的变量,就叫做成员变量(类中的成员,就指的是直接定义在类中的东西);
局部变量: 定义在函数中(类的局部位置)的变量叫做局部变量;
5.2 使用
class Demo{
int a = 10;//成员变量
void func(){
int a = 100;//局部变量
System.out.println("method: " + a);
}
}
class Test{
public static void main(String[] args)
{
Demo d = new Demo();
d.func();
}
}
5.3 区别
- 从定义的位置上:
局部变量:定义在局部范围(函数中)
成员变量: 直接定义在类中
- 从内存上看:
局部变量: 保存在栈内存中
成员变量: 保存在堆内存中
- 从生命周期(指的是从分配空间到回收空间)上看:
局部变量: 定义它的函数进栈执行到这一行,给它开辟空间;函数出栈,空间被回收
成员变量: 创建对象的时候开辟空间;对象成为垃圾空间被回收的时候,成员变量的空间被回收;
- 从使用范围上:
局部变量: 只能在定义它的函数中使用;
成员变量: 在定义它的类中都可以使用;
- 从初始值上看:
局部变量: 没有默认值,使用前必须先初始化;
成员变量: 有默认值,使用前可以不必先赋值,也可以先赋值;
6、匿名对象
6.1 概念:
匿名对象,就是创建一个对象,不将它的引用赋值给任何变量;
6.2 应用:
因为匿名对象只能在创建它的那行代码里使用一次,该行代码一旦结束,这个对象就成为垃圾空间;
所以在某些对象只需要使用一次的情况下,为了节省内存,可以将其声明为匿名对象;
//未使用匿名对象
class Demo{
int a = 10;
}
class Test{
public static void test(Demo d){
System.out.println(d.a);
}
public static void main(String[] args)
{
Demo d1 = new Demo();
test(d1);
Demo d2= new Demo();
test(d2);
}
}
//使用匿名对象
class Demo{
int a;
void func(){
System.out.println("method: " + a);
}
}
class Test{
public static void main(String[] args)
{
new Demo().a = 10;
System.out.println(new Demo().a); //结果: a = 0
new Demo().func(); //结果: method: 0
}
}
注意:匿名对象的使用局限:只能在创建出来的那行代码中使用一次;一旦那行代码结束,匿名对象就会成为垃圾空间等待回收;
7、引用传递和按值传递
7.1 按值传递:
给变量赋值时,如果变量的数据类型属于8种基本数据类型,这时传递的是实际的常量值;这种数据传递的方式叫做按值传递。
使用这种方式传递数据,修改一个变量的值,对其他变量没有影响;
7.2 引用传递:
给变量赋值时,如果变量的数据类型不属于8种基本数据类型(也就是引用),这时传递的是堆内存中的地址;这种数据传递方式叫引用传递(按址传递)。
使用这种方式传递数据,通过一个变量修改数据,对其他拥有这个引用的变量,都有影响;
class Demo{
int a ;
}
class Test{
public static void update(Demo d){
d.a += 10;
}
public static void update(int a){
a += 10;
}
public static void main(String[] args) {
Demo d = new Demo();
d.a = 10;
update(d);
System.out.println(d.a); //结果:20 引用传递 改变值会有影响
int a = 10;
update(a);
System.out.println(a); //结果:10 按值传递 改变值不会有影响
}
}