【JavaSE】Java面向对象的思想(类、对象、对象调用内存图)

  Java基础,打破模糊概念。

本文目录

  • 1.为什么需要面向对象思想
  • 2.什么是面向对象编程
  • 3.Java中怎样体现面向对象的
    • Java中的类
    • 对象
      • 1.使用对象步骤
      • 2.对象调用内存图
      • 3.使用对象类型作为方法的参数
      • 4.使用对象类型作为方法的返回值
    • 成员变量和局部变量区别


1.为什么需要面向对象思想

思想源于生活,举一个生活中的例子:洗衣服

  • 对于面向过程的体现:把衣服脱下来 -->找一个盆–>放点洗衣粉–>加点水–>浸泡10分钟–>揉一揉–>清洗衣服–>拧干–>晾起来
  • 对于面向对象的体现:把衣服脱下来 -->打开全自动洗衣机–>扔衣服–>按钮–>晾起来

使用面向过程的时候,所有洗衣服步骤都是我们自己亲手做的。如果使用面向对象,就可以找人(或物)帮我们做事,而帮我们做事的人或物就是对象。很明显面向对象,更加省时省心。
  两者的区别:

  • 面向过程:强调步骤。每个过程自己亲力亲为,强调过程具体细节。
  • 面向对象:强调对象,这里的对象就是洗衣机。强调是什么能(对象)帮我实现这个过程,不关心过程具体细节,非常省事。

面向对象思想更符合我们思考习惯,它可以将复杂的事情简单化,并将我们从执行者变成了指挥者。适合我们程序员“偷懒”。

2.什么是面向对象编程

  面向对象思想是一种程序设计思想,使用这样的思想编程就是面向对象编程。对象泛指现实中一切事物,每种事物都具备自己的属性和行为。面向对象编程就是在计算机程序设计过程中,参照现实中事物,将事物的属性特征、行为特征抽象出来,描述成计算机事件。
  它可以将复杂的事情简单化,并将我们从执行者变成了指挥者。面向对象的语言中,包含了三大基本特征,即封装、继承和多态。Java语言是一种面向对象的程序设计语言,在面向对象思想的指引下,使用Java语言去设计、开发计算机程序。
  两种编程的区别:

  • 面向过程:当需要实现一个功能的时候,每一个具体的步骤都要亲力亲为,详细处理每一个细节。
  • 面向对象:当需要实现一个功能的时候,不关心具体的步骤,而是找一个已经具有该功能的人,来帮我做事儿。

举一个java程序理解:

public class Demo01PrintArray {
    public static void main(String[] args) {
        int[] array = { 10, 20, 30, 40, 50, 60 };
        // 要求打印格式为:[10, 20, 30, 40, 50]

        // 使用面向过程,每一个步骤细节都要亲力亲为。
        System.out.print("[");
        for (int i = 0; i < array.length; i++) {
            if (i == array.length - 1) { // 如果是最后一个元素
                System.out.println(array[i] + "]");
            } else { // 如果不是最后一个元素
                System.out.print(array[i] + ", ");
            }
        }
        System.out.println("==============");

        // 使用面向对象
        // 找一个JDK给我们提供好的Arrays类,
        // 其中有一个toString方法,直接就能把数组变成想要的格式的字符串
        System.out.println(Arrays.toString(array));//[10, 20, 30, 40, 50, 60]
    }
}

3.Java中怎样体现面向对象的

Java中是用类和对象来体现
  生活中,你会发现很多对象,比如桌子,椅子,同学,老师等。桌椅属于办公用品,师生都是人类。那么什么是类呢?什么是对象呢?

  • 什么是类:描述一类事物的属性和行为的集合。
    • 属性:属性特征,就是该事物的状态信息。
    • 行为:行为特征,就是该事物能够做什么。
    • 举例:猫。属性:名字、体重、年龄、颜色。行为:走、跑、叫。
  • 什么是对象:对象是一类事物的具体体现,即类的一个实例。具备该类事物的属性和行为。
    • 举例:猫类的实例,一只小猫。
    • 属性:tom、5kg、2 years、yellow。
    • 行为:溜墙根走、蹦跶的跑、喵喵叫。

类与对象的关系
类是对一类事物的描述,是抽象的。
对象是一类事物的实例,是具体的。
类是对象的模板,对象是类的实体 。
例子:手机设计图纸是类,实体的手机产品就是对象了。


Java中的类

  Java中的表示现实世界的一类事物。属性:事物的状态信息。行为:事物能够做什么。
  Java中用class描述事物。成员变量:对应事物的属性。成员方法:对应事物的行为。

类的定义格式:

/*
注意事项:
1. 成员变量是直接定义在类当中的,在方法外边。
2. 成员方法不要写static关键字。(加了static是静态方法了)
*/
public class ClassName {
	  //成员变量
	  //成员方法
}

我们定义一个类,用来模拟“学生”事物。其中就有两个组成部分:
属性(是什么): 姓名、年龄;
行为(能做什么):吃饭、睡觉、学习;

对应到Java的类当中
成员变量(属性):
String name; // 姓名
int age; // 年龄
成员方法(行为):
public void eat() {} // 吃饭
public void sleep() {} // 睡觉
public void study() {} // 学习

程序:

public class Student {
    // 成员变量
    public String name; // 姓名
    public int age; // 姓名

    // 成员方法
    public void eat() {
        System.out.println("吃饭饭!");
    }

    public void sleep() {
        System.out.println("睡觉觉!");
    }

    public void study() {
        System.out.println("学习!");
    }
}

对象

  通常情况下,一个类并不能直接使用,需要根据类创建一个对象,才能使用。

1.使用对象步骤

1.1 导包:也就是指出需要使用的类,在什么位置。

  • 格式:import 包名称.类名称;
  • 例子:import Demo01.Student;
  • 注意:对于和当前类属于同一个包的情况,可以省略导包语句不写。想要使用其它包下的类就需要导入包了。

1.2 创建对象

  • 格式:类名称 对象名 = new 类名称();
  • 例子:Student stu = new Student();

1.3 使用对象

  • 使用成员变量:对象名.成员变量名
  • 使用成员方法:对象名.成员方法名(参数)
  • 注意:如果成员变量没有进行赋值,那么将会有一个默认值,规则和数组一样。
变量类型 默认值
整数(byte,short,int,long) 0
浮点数(float,double) 0
字符(char) ‘\u0000’
布尔(boolean) false
数组,类,接口 null

写一个创建上面学生类对象的例子程序:

public class Demo01Student {
    public static void main(String[] args) {
        // 根据Student类,创建了一个名为stu的对象
        Student stu = new Student();

        // 3. 使用其中的成员变量,格式:
        // 对象名.成员变量名
        System.out.println(stu.name); // null
        System.out.println(stu.age); // 0
        System.out.println("=============");

        // 改变对象当中的成员变量数值内容
        // 将右侧的字符串,赋值交给stu对象当中的name成员变量
        stu.name = "赵丽颖";
        stu.age = 18;
        System.out.println(stu.name); // 赵丽颖
        System.out.println(stu.age); // 18
        System.out.println("=============");

        // 4. 使用对象的成员方法,格式:
        // 对象名.成员方法名()
        stu.eat();//吃饭饭!
        stu.sleep();//睡觉觉!
        stu.study();//学习!
    }
}

2.对象调用内存图

  通过例子来说明,先定义一个类,用来模拟“手机”事物。再创建对象来调用成员变量、成员方法。

public class Phone {
    // 成员变量
    String brand; // 品牌
    double price; // 价格
    String color; // 颜色

    // 成员方法
    public void call(String who) {
        System.out.println("给" + who + "打电话");
    }

    public void sendMessage() {
        System.out.println("群发短信");
    }
}

2.1 一个对象使用的内存图
  创建一个手机类的对象情况。

public class Demo01PhoneOne {
    public static void main(String[] args) {
        // 根据Phone类,创建一个名为one的对象
        // 格式:类名称 对象名 = new 类名称();
        Phone one = new Phone();
        System.out.println(one.brand); // null
        System.out.println(one.price); // 0.0
        System.out.println(one.color); // null
        System.out.println("=========");

        one.brand = "苹果";
        one.price = 8388.0;
        one.color = "黑色";
        System.out.println(one.brand); // 苹果
        System.out.println(one.price); // 8388.0
        System.out.println(one.color); // 黑色
        System.out.println("=========");

        one.call("乔布斯"); // 给乔布斯打电话
        one.sendMessage(); // 群发短信
    }
}

来看一下内存中栈内存、堆内存、和方法区所发生的事情。

【JavaSE】Java面向对象的思想(类、对象、对象调用内存图)_第1张图片
  首先,javac生成的Phone.classDemo01PhoneOne.class文件都存在方法区,.class里有成员变量和成员方法。程序开始运行,先从main方法开始,main方法进栈(也叫压栈)。
  在栈内存中开始执行main方法。Phone one = new Phone();对象变量名one在栈内存中,该语句在堆内存中创建了一个对象new Phone(),给one赋值的是堆内存中对象的地址值。而对象的内容是从方法区的Phone.class文件中获取,并会给成员变量赋上了默认值,而对象中的成员方法保存的是方法区中对应方法的地址值。
  one.brand one.price one.color 三行语句根据one的地址值访问堆内存中相应的成员变量;
  one.brand = "苹果";one.price = 8388.0;one.color = "黑色";再三行语句根据one的地址值访问堆内存中相应的成员变量,并给它们赋上我设置的值;
  one.brand ``one.price one.color后面三行语句根据one的地址值访问堆内存中相应的成员变量;
  one.call("乔布斯");根据one的地址值访问堆内存中相应的成员方法,再根据成员方法的地址值访问方法区的相应的成员方法。进行call()方法调用,call()方法进栈,运行call()方法。一旦call()方法执行完毕,在内存中它就会立刻出栈(弹栈),从栈消失,然后main方法继续执行。
  one.sendMessage();和找到call()方法一样。sendMessage()方法进栈,运行sendMessage()方法。一旦sendMessage()方法执行完毕,在内存中它就会立刻出栈(弹栈)消失,然后main方法继续执行。
  mian方法执行完毕,main()也出栈。main方法停止了,所有内存就会消失不见,程序停止。这就是完整的当我们创建对象,访问成员变量,调用成员方法,内存中栈内存、堆内存、和方法区所发生的事情。

2.2 两个对象使用的内存图
  创建两个手机类的对象情况。

public class Demo02PhoneTwo {
    public static void main(String[] args) {
        Phone one = new Phone();
        System.out.println(one.brand); // null
        System.out.println(one.price); // 0.0
        System.out.println(one.color); // null
        System.out.println("=========");

        one.brand = "苹果";
        one.price = 8388.0;
        one.color = "黑色";
        System.out.println(one.brand); // 苹果
        System.out.println(one.price); // 8388.0
        System.out.println(one.color); // 黑色
        System.out.println("=========");

        one.call("乔布斯"); // 给乔布斯打电话
        one.sendMessage(); // 群发短信
        System.out.println("=========");

        Phone two = new Phone();
        System.out.println(two.brand); // null
        System.out.println(two.price); // 0.0
        System.out.println(two.color); // null
        System.out.println("=========");

        two.brand = "三星";
        two.price = 5999.0;
        two.color = "蓝色";
        System.out.println(two.brand); // 三星
        System.out.println(two.price); // 5999.0
        System.out.println(two.color); // 蓝色
        System.out.println("=========");

        two.call("欧巴"); // 给欧巴打电话
        two.sendMessage(); // 群发短信
    }
}

内存中的情况
【JavaSE】Java面向对象的思想(类、对象、对象调用内存图)_第2张图片
创建两个对象情况和一个对象类似。需要说的就是:

  1. 创建第二个对象是在堆内存中新建一个对象new Phone();赋给第二个对象名two的地址也是一个新的地址值。
  2. 对象访问成员变量,访问的是该对象自己的成员变量。
  3. 两个对象使用同一个方法,会根据地址值指向同一个方法。因为两个对象中的成员方法,保存的都是方法区中Phone.class中对应成员方法的地址值。
  4. 两个对象访问成员变量,调用成员方法不会产生任何联系。

2.3 两个引用指向同一个对象的内存图
  Phone one=new Phone();对象名one,也叫做对象的引用。不同对象的引用指向同一个对象的情况:

public class Demo03PhoneSame {
    public static void main(String[] args) {
        Phone one = new Phone();
        System.out.println(one.brand); // null
        System.out.println(one.price); // 0.0
        System.out.println(one.color); // null
        System.out.println("=========");

        one.brand = "苹果";
        one.price = 8388.0;
        one.color = "黑色";
        System.out.println(one.brand); // 苹果
        System.out.println(one.price); // 8388.0
        System.out.println(one.color); // 黑色
        System.out.println("=========");

        one.call("乔布斯"); // 给乔布斯打电话
        one.sendMessage(); // 群发短信
        System.out.println("=========");

        // 将one当中保存的对象地址值赋值给two
        Phone two = one;
        System.out.println(two.brand); // 苹果
        System.out.println(two.price); // 8388.0
        System.out.println(two.color); // 黑色
        System.out.println("=========");

        two.brand = "三星";
        two.price = 5999.0;
        two.color = "蓝色";
        System.out.println(two.brand); // 三星
        System.out.println(two.price); // 5999.0
        System.out.println(two.color); // 蓝色
        System.out.println("=========");

        two.call("欧巴"); // 给欧巴打电话
        two.sendMessage(); // 群发短信
    }
}

看一下内存中发生的事情:
【JavaSE】Java面向对象的思想(类、对象、对象调用内存图)_第3张图片
需要说的是:

  1. Phone two =one;是将one中保存的对象地址值赋给的twotwo也指向了该对象。
  2. 根据onetwo的地址值都可以访问到该同一对象的成员变量、成员方法。

3.使用对象类型作为方法的参数

看例子程序:

public class Demo04PhoneParam {
    public static void main(String[] args) {
        Phone one = new Phone();
        one.brand = "苹果";
        one.price = 8388.0;
        one.color = "土豪金";

        method(one); // 传递进去的参数其实就是地址值
    }

    public static void method(Phone param) {
        System.out.println(param.brand); // 苹果
        System.out.println(param.price); // 8388.0
        System.out.println(param.color); // 土豪金
    }
}

再看看内存中
【JavaSE】Java面向对象的思想(类、对象、对象调用内存图)_第4张图片
过程很简单,可以回顾前面的过程描述。

4.使用对象类型作为方法的返回值

看例子程序

public class Demo05PhoneReturn {
    public static void main(String[] args) {
        Phone two = getPhone();
        System.out.println(two.brand); // 苹果
        System.out.println(two.price); // 8388.0
        System.out.println(two.color); // 玫瑰金
    }
	//方法返回值是Phone对象
    public static Phone getPhone() {
        Phone one = new Phone();
        one.brand = "苹果";
        one.price = 8388.0;
        one.color = "玫瑰金";
        return one;
    }
}

再看看内存中,过程描述参照前面的对象调用。
【JavaSE】Java面向对象的思想(类、对象、对象调用内存图)_第5张图片

成员变量和局部变量区别

区别 成员变量 局部变量
定义的位置 在方法的外部,直接写在类当中 在方法的内部
作用范围 整个类全都可以通用。 只有方法当中才可以使用,
出了方法就不能再用
默认值 如果没有赋值,会有默认值,
规则和数组一样
没有默认值,如果要想使用,
必须手动进行赋值(初始化)
内存的位置 位于堆内存 位于栈内存
生命周期 随着对象创建而诞生,
随着对象被垃圾回收而消失
随着方法进栈而诞生
随着方法出栈而消失

举一个栗子:

public class Demo01VariableDifference {
    String name; // 成员变量

    public void methodA() {
        int num = 20; // 局部变量
        System.out.println(num);
        System.out.println(name);
    }

    public void methodB(int param) { // 方法的参数就是局部变量
        // 参数在方法调用的时候,必然会被赋值的。
        System.out.println(param);

        int age; // 局部变量
        //System.out.println(age); // 没赋值不能用

        //System.out.println(num); // 错误写法!num属于上一个方法的局部变量,超出了它作用范围
        System.out.println(name);
    }
}

就到这了,欢迎点赞评论,指出不足,笔者由衷感谢o!

你可能感兴趣的:(JavaSE基础)