day06_面向对象入门(成员变量丶成员方法)①

编程思想

编程思想其实就是编程思路,我们开发中2种经典的编程思想就是面向过程编程思想和面向对象编程思想.

  • 面向过程编程思想:强调的是过程,必须清楚每一个步骤,然后按照步骤一步一步去实现
  • 面向对象编程思想:强调的是对象, 通过调用对象的行为来实现功能,而不是自己一步一步的去操作实现。面向对象仍然包含面向过程,只不过关注点变了,关注谁来做。面向对象的语言中,包含了三大基本特征,即封装、继承和多态。

程序员的角色:

  • 面向过程:程序员是具体执行者
  • 面向对象:程序员是指挥者

总结:面向对象思想是一种更符合我们思考习惯的思想,它可以将复杂的事情简单化,并将我们从执行者变成了指挥者。

代码示例

package demo01;

import java.util.Arrays;
// 需求:打印数组中所有的元素,打印格式为: [元素1,元素2,元素3,元素,...,元素n]
public class Demo {
    public static void main(String[] args) {
        int[] arr = {1, 23, 4, 5, 6};
        //面向过程
        for (int i = 0; i < arr.length; i++) {
            if (i == 0) {
                System.out.print("[" + arr[i] + ", ");
            } else if (i == arr.length - 1) {
                System.out.println(arr[i] + "]");
            } else {
                System.out.print(arr[i] + ", ");
            }
        }
        //面向对象
        System.out.println(Arrays.toString(arr));
    }
}

类和对象的概述

环顾周围,你会发现很多对象,比如桌子,椅子,同学,老师等。桌椅属于办公用品,师生都是人类。那么什么是类呢?什么是对象呢?

什么是类

:是一类具有相同特性的事物的抽象描述,是一组相关属性行为的集合。可以看成是一类事物的模板,使用事物的属性特征和行为特征来描述该类事物。 类在客观世界里是不存在的,是抽象的只是用来描述数据信息的。类:我们叫做class。 对象:我们叫做Object,instance(实例)。以后我们说某个类的对象,某个类的实例。是一样的意思。

现实中,描述一类事物:

  • 属性:就是该事物的状态信息
  • 行为:就是该事物能够做什么

Java中用class描述事物也是如此:

  • 成员变量:对应事物的属性
  • 成员方法:对应事物的行为

什么是对象

对象:是一类事物的具体体现。对象是类的一个实例,必然具备该类事物的属性和行为。现实中,一类事物的一个实例:一只小猫 。对象是类的实例,具体存在的,看得见摸得着的,对象的属性是有具体的值。对象的行为其实就是可以使用的功能\行为。

扫描二维码关注公众号,回复: 13505173 查看本文章

对象是根据类来创建的,类中有什么,对象就有什么,可以把类看成是对象的数据类型

类与对象的关系

  • 类是对一类事物的描述,是抽象的
  • 对象是一类事物的实例,是具体的
  • 类是对象的模板,对象是类的实体

类的定义

类的组成是由属性和行为两部分组成

  • 属性:该类事物的状态信息,在类中通过成员变量来体现(类中方法外的变量)
  • 行为:该类事物有什么功能,在类中通过成员方法来体现(和前面的方法相比去掉static关键字即可)

格式

类的定义格式举例:

public class Phone {
    //属性(成员变量): 数据类型 变量名;
    /**
     * 品牌
     */
    String brand;
    /**
     * 价格
     */
    double price;

    //行为(成员方法): 没有static修饰

    /**
     * 打电话的功能
     *
     * @param phoneNum 电话号码
     */
    public void call(String phoneNum) {
        System.out.println("正则给" + phoneNum + "打电话...");
    }

    /**
     * 发短信的功能
     *
     * @param phoneNum 电话号码
     * @param message  短信内容
     */
    public void sendMessage(String phoneNum, String message) {
        System.out.println("正在给" + phoneNum + "发送短信,短信内容是:" + message);
    }
}

对象的创建和使用

类其实就是对象的数据类型,类是引用数据类型

现在我们来创建Phone类的对象

public class Test {
    public static void main(String[] args) {
        /*
            对象的创建和使用:
                对象的创建:
                    对象创建格式: 类名 对象名 = new 类名();
                    结论: 类其实也是一种数据类型,是引用数据类型
                对象的使用:
                    访问成员变量:
                        给成员变量赋值:  对象名.成员变量名 = 值;
                        获取成员变量的值: 对象名.成员变量名

                    访问成员方法:
                        调用方法: 有返回值的方法,无返回值的方法
                        无返回值的方法:
                               直接调用: 对象名.方法名(实参);
                        有返回值的方法:
                               直接调用: 对象名.方法名(实参);
                               赋值调用: 数据类型 变量名 = 对象名.方法名(实参);
                               输出调用: System.out.println(对象名.方法名(实参));
         */
        // 创建Phone类的对象
        Phone p1 = new Phone();
        // 给p1对象的brand成员变量赋值
        p1.brand = "华为";
        // 给p1对象的price成员变量赋值
        p1.price = 999.8;

        // 获取p1对象的brand成员变量的值
        System.out.println(p1.brand);
        // 获取p1对象的price成员变量的值
        System.out.println(p1.price);

        // 无返回值的成员方法
        // 使用p1对象调用call方法
        p1.call("10086");
        // 使用p1对象调用sendMessage方法
        p1.sendMessage("10086", "请问一下联通的客服电话号码是多少?");

    }
}

那么,对象名中存储的是什么呢?答:对象地址。直接打印对象名和数组名都是显示“类型@对象的hashCode值",所以说类、数组都是引用数据类型,引用数据类型的变量中存储的是对象的地址,或者说指向堆中对象的首地址。

类的属性(成员变量)

成员变量的分类

  • 实例变量:没有static修饰,也叫对象属性,属于某个对象的,通过对象来使用
  • 类变量:有static修饰,也叫类变量,属于整个类的,不是属于某个实例

如何声明成员变量

属性的类型可以是Java的任意类型,包括基本数据类型、引用数据类型(类、接口、数组等)  

示例

public class Chinese {
    static String country;//类变量
    String name;//成员变量,有默认值
    char gender = '男';//成员变量,显式赋值
}

如何在类外面访问成员变量

类变量

实例变量

 代码示例

package demo02;

class Chinese {
    static String country;//类变量
    String name;//成员变量,有默认值
    char gender = '男';//成员变量,显式赋值
}

public class TestChinese {
    public static void main(String[] args) {
        //类名.静态成员变量
        System.out.println(Chinese.country); //null
        //  错误,非静态成员变量必须通过对象.进行访问
        //	System.out.println(Chinese.name);

        Chinese c1 = new Chinese();
        //对象名.非静态成员变量
        System.out.println(c1.name);//null
        //静态的成员变量也可以通过对象.进行访问
        //对象名.非静态成员变量
        System.out.println(c1.country);//null
        System.out.println(c1.gender); //男
    }
}

成员变量的特点

成员变量有默认值

 代码示例

package demo03;

class Student {
    /**
     * 姓名
     */
    String name;
    /**
     * 年龄
     */
    int age;
    /**
     * 分数
     */
    double score;
    char c;
}

public class Test {
    public static void main(String[] args) {
        /*
            成员变量的默认值:
                整数类型: 默认值是0
                小数类型: 默认值是0.0
                布尔类型: 默认值是false
                字符类型: 默认值是不可见字符 '\u0000'
                引用类型: 默认值是null
         */
        // 创建Student对象
        Student stu = new Student();
        // 访问成员变量
        System.out.println(stu.name);// null
        System.out.println(stu.age);// 0
        System.out.println(stu.score);// 0.0
        System.out.println("=" + stu.c + "=");
    }
}

对象内存图

内存是计算机中重要的部件之一,它是与CPU进行沟通的桥梁。其作用是用于暂时存放CPU中的运算数据,以及与硬盘等外部存储器交换的数据。只要计算机在运行中,CPU就会把需要运算的数据调到内存中进行运算,当运算完成后CPU再将结果传送出来。我们编写的程序是存放在硬盘中的,在硬盘中的程序是不会运行的,必须放进内存中才能运行,运行完毕后会清空内存。Java虚拟机要运行程序,必须要对内存进行空间的分配和管理,每一片区域都有特定的处理数据方式和内存管理方式。

内存详解

单个对象的内存图

 结论:

  • 只要创建对象,就会在堆区开辟一块空间(凡是new就会在堆区开辟一块新的空间)
  • 只要调用方法,就会在栈区开辟一块空间,用来执行该方法

多个对象的内存图

 结论:

  • 多个对象在堆内存中,都有不同的内存划分,成员变量存储在各自对象的内存区域中,成员方法多个对象共用的一份
  • 凡是new就会重新在堆区开辟一块新空间
  • 对象和对象之间的关系是相互独立的

多个变量指向相同对象内存图

结论:

  • 当多个对象的引用指向同一个内存空间(变量所记录的地址值是一样的)
  • 只要有任何一个对象修改了内存中的数据,随后,无论使用哪一个对象进行数据获取,都是修改后的数据。

成员变量和局部变量的区别

声明位置和方式

  • 静态变量:在类中方法外,并且有static修饰
  • 实例变量:在类中方法外,没有static修饰
  • 局部变量:在方法体{ }中或方法的形参列表、代码块中

在内存中存储的位置不同

  • 静态变量:方法区
  • 实例变量:
  • 局部变量:

生命周期

  • 静态变量:和类的生命周期一样,因为它的值是该类所有对象共享的,早于对象的创建而存在。
  • 实例变量:和对象的生命周期一样,随着对象的创建而存在,随着对象被GC回收而消亡, 而且每一个对象的实例变量是独立的。
  • 局部变量:和方法调用的生命周期一样,每一次方法被调用而在存在,随着方法执行的结束而消亡, 而且每一次方法调用都是独立。

作用域

  • 静态变量和实例变量:不谈作用域 在本类中,唯一的限制,静态方法或静态代码块中不能使用非静态的,其他都可以直接使用。 在其他类中,能不能使用看修饰符
  • 局部变量:有作用域 出了作用域就不能使用

默认值

  • 静态变量:有默认值
  • 实例变量:有默认值
  • 局部变量:没有,必须初始化 其中的形参比较特殊,靠实参给它初始化。

猜你喜欢

转载自blog.csdn.net/weixin_44462792/article/details/121710532
今日推荐