6

类对象的格式

类名 标识符(变量名/对象的引用)= new 类名();

public class Tool {
    public  static  double Sum(double [] scores){
        double sum=0.0;
        for( int i = 0; i<scores.length;i++){
            sum+=scores[i];
        }
        return  sum;        
    }
}

Tool tool = new Tool();
sum1=tool.Sum(scores)

面向过程和面向对象的区别

1.关注点不同:

  • 面向过程:关心的是事件中的每一步功能怎么做;
  • 面向对象:关心的是事件中的每一步功能有没有什么对象已经实现好了,然后直接拿来使用

2.效率不同:

  • 面向过程:因为自己要参与每一步的实现,所以效率比较慢;
  • 面向对象:因为大多数都是调用别人已经实现好的功能,所以效率比较高;

3.开发质量:

  • 面向过程:因为是自己一步步实现的,大多数情况会有地方出现问题;
  • 面向对象:因为大多数都是调用别人写好的功能,而这些功能一般都进过大量的验证,质量有保证;

4.使用范围不同:

  • 面向过程:适合解决需求简单的问题;
  • 面向对象:更适合解决复杂的需求;

面向对象是基于面向过程的;

面向对象代码例子:

public class Car {
    String color;
    void  run(){
        System.out.println(color+"颜色的车在行驶");
    }
}
class Test{
    public static void  main(String[] args){
        Car car = new Car();
        car.color="红";
        car.run();
    }
}

一个对象调用一个方法内存图


首先JVM运行一个class文件时,使用类加载器先将Demo类加载到方法区,然后main方法压栈(入栈)。

·在栈中运行main方法,当jvm看到Phone时,会自动把Phone类加载到方法区;当看到局部变量p时,会在栈中开辟一块空间;当看到new Phone()时,会在堆内存中开辟空间,并将堆内存中的对应地址0x123赋值给p;还会拿到方法区的地址值指向方法区。

·在main方法中运行到给对象p的属性赋值时,通过地址去堆内存中找到相应属性并赋值,运行p.sendMessage()这一步时,也是根据地址值去堆内存中找到相应的对象,再用对象去方法区中找到sendMessage()方法,然后将sendMessage()方法压到栈中(入栈),调用完毕sendMessage()方法会出栈。

·main方法运行结束后会出栈。

通过以上步骤描述,我们可以理解,在栈内存中运行的方法,遵循"先进后出,后进先出"的原则。变量p指向堆内存中的空间,寻找方法信息,去执行该方法。

两个对象调用同一个方法内存图


对象调用方法时,根据对象中方法标记(地址值),去类中寻找方法信息。这样哪怕是多个对象,方法信息只保存一份,节约内存空间。

一个引用,作为参数传递到方法中内存图


引用类型作为参数,传递的是地址值。

局部变量和成员变量

成员变量:直接定义在类中的变量--直接定义在类的变量。

局部变量:定义在类中局部位置(函数中)的变量--直接定义在函数的变量。

public class test {
    int a = 10;//成员变量
    public static void   main(String[] args ){
        int a =100;//局部变量
        System.out.println("a:"+a);//100
    }
}

区别

1.从定义的位置上:

  • 局部变量:函数里面
  • 成员变量:直接定义在类中

2.从内存上看:

  • 局部变量:栈内存中
  • 成员变量:堆内存中

3.从生命周期(指的是从分配空间到回收空间)上看:

  • 局部变量:随着函数进栈执行,开始分配空间;函数之行结束出栈,空间被回收
  • 成员变量:随着创建对象开始分配空间;随着对象的空间变成垃圾空间被回收而被回收;

4.从使用范围上:

  • 局部变量:仅限于定义它的局部范围里面(比如函数中)
  • 成员变量:整个类中

5.从初始值上看:

  • 局部变量:没有默认值,使用前必须先要初始化

匿名对象

匿名对象:没有名字的对象;

匿名对象,就是创建对象后,不将引用赋值给任何变量;

匿名对象虽然没有那个变量持有它的引用,但是对象创建出来的时候,自己是知道自己的引用,这个时候可以使用它;

匿名对象的应用

如果一个对象只需要作为参数被使用一次,就可以定义为匿名对象,好处是在那行代码执行结束后,不会继续占有内存空间;

开源地址

开源项目地址:https://github.com/371854496/...

java学习资料:https://github.com/371854496/...

各位觉得还阔以的话,点下Star,分享不易,thank you!

公众号 全战开花

获取更多技术干货


楷楷
4k 声望10.5k 粉丝

兴趣是最好的老师!