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 按值传递 改变值不会有影响
   }
}