面向对象、值与引用传参、变量与堆栈

学习内容

1.面向对象与面向过程

面向过程:

根据需求,分析解决该需求所需要的步骤,利用函数(方法)将这些步骤一一实现,使用时在进行依次调用。

面向对象:

把需求分解成一个个的功能,利用函数(方法)将这些功能一一实现,使用时调用功能。

在面向对象的思维中,不考虑每个功能具体需要哪些步骤、是怎么实现的,简单来说就是你办事我放心。

例:

如何把大象装入冰箱?

面向对象:1.打开冰箱门(方法)2.把大象装进冰箱(功能)3.关闭冰箱门(功能)

整个过程需要三个方法:打开,装载,关闭,一个对象:大象。

2.对象内存图解

class Car{
      String color;
      int wheels;

  public void run(){
     System.out.print(color+":"+wheels);

  }

}

class TestCar{
    public static void main(String[] args){
           Car w = new Car();
           w.color = "red";
           w.wheels = 4;
           w.run();
    }
    
}

3.类与对象

类指的是对某一类对象的抽象解释,例如动物、人类,而对象则是类具体化的体现,例如猫、中国人,创造对象的过程就是实例化类。

class Human{
     String country;
     int age;
     public static void main(String[] args){
           Human chinese = new Human();
           chinese.country = "中国";
           chinese.age = 20;
     }   
}

4.基本类型与引用类型传参

基本类型:

a的值被复制一份传入方法change,方法内改变a的值,只在方法内生效,方法执行完毕,弹栈,主方法内的a不改变。

class Test{
    public static void change(int a){
            a = 10;
     }
    public static void main(String[] args){
          int a = 5;
          change(a);
          System.out.print(a);
    }
}

 

引用类型:

引用类型传参是把其物理地址传入方法,此时会有两个引用指向该物理地址,即主方法里的参数a,change方法内的形参a,此时方法内改变a[0],

则直接会对堆内的数据进行改变,所以主方法内的a[0]也随之改变。

class Test{
    public static void change(int[] a){
            a[0] = 10;
     }
    public static void main(String[] args){
          int[] a = {5,15,20};
          change(a);
          System.out.print(a[0]);
    }
}

 

5.成员变量与局部变量

区别一:定义的位置不同

定义在类体中、方法外的变量是成员变量

定义在方法中或者{}语句(代码块)里面的变量是局部变量

区别二:在内存中的位置不同

成员变量存储在对内存的对象中

局部变量存储在栈内存的方法中

区别三:生命周期不同

成员变量随着对象的出现而出现在堆中,随着对象的消失而从堆中消失

对象被实例化,成员变量(除静态变量外,静态变量不论有没有实例化对象都会被初始化)就会被初始化!

局部变量随着方法的运行而出现在栈中,随着方法的弹栈而消失

区别四:初始化不同

成员变量因为在堆内存中,有默认的初始化值,可直接使用其默认值。

局部变量在栈内存中,没有默认的初始化值,必须手动的给其赋值才可以使用。

 栈:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(对象可能在常量池里)(字符串常量对象存放在常量池中。)
 堆:存放所有new出来的对象。
静态域:存放静态成员(static定义的)
常量池:存放字符串常量和基本类型常量(public static final)。

原文地址:https://www.cnblogs.com/whwjava/p/8651951.html