• Java Object-Oriented:day06 【 Objects and Classes】


    一、面向对象思想

    1、概述

    Java语言是一种面向对象的程序设计语言,而面向对象思想是一种程序设计思想,我们在面向对象思想的指引下,使用Java语言去设计、开发计算机程序。 这里的对象泛指现实中一切事物,每种事物都具备自己的属性和行为。
    面向对象思想就是在计算机程序设计过程中,参照现实中事物,将事物的属性特征、行为特征抽象出来,描述成计算机事件的设计思想。 它区别于面向过程思想,强调的是通过调用对象的行为来实现功能,而不是自己一步一步的去操作实现

    2、举例(洗衣服)

    3、面向过程和面向对象区别示例代码

    package day06;
    
    import java.util.Arrays;
    
    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));
        }
    }
    

    输出

    "C:Program FilesJavajdk-13.0.2injava.exe" "-javaagent:C:Program FilesJetBrainsIntelliJ IDEA 2019.2libidea_rt.jar=64069:C:Program FilesJetBrainsIntelliJ IDEA 2019.2in" -Dfile.encoding=UTF-8 -classpath C:javaJavaAppsoutproductionJavaApps day06.Demo01PrintArray
    [10, 20, 30, 40, 50, 60]
    ==============
    [10, 20, 30, 40, 50, 60]
    
    Process finished with exit code 0

    数组存储的数据类型: 创建的数组容器可以存储什么数据类型。

    [] : 表示数组。

    数组名字:为定义的数组起个变量名,满足标识符规范,可以使用名字操作数组。

    new :关键字,创建数组使用的关键字。

    数组存储的数据类型: 创建的数组容器可以存储什么数据类型。

    [ 长度]:数组的长度,表示数组容器中可以存储多少个元素。

    注意:数组有定长特性,长度一旦指定,不可更改。和水杯道理相同,买了一个 2升的水杯,总容量就是2升,不能多也不能少。

    4、特点

    面向对象思想是一种更符合我们思考习惯的思想,它可以将复杂的事情简单化,并将我们从执行者变成了指挥者。面向对象的语言中,包含了三大基本特征,即封装、继承和多态。

    5、什么是类

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

    类 :是一组相关属性和行为的集合。可以看成是一类事物的模板,使用事物的属性特征和行为特征来描述该类事物。现实中,描述一类事物:
    属性 :就是该事物的状态信息。
    行为 :就是该事物能够做什么

    6、什么是对象

    对象 :是一类事物的具体体现。对象是类的一个实例(对象并不是找个女朋友),必然具备该类事物的属性和行为。现实中,一类事物的一个实例:一只小猫。

    7、类与对象的关系

     

    二、类与对象

    1、事物与类的对比

    现实世界的一类事物

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

    2、类的定义格式

    public class ClassName {
      //成员变量
      //成员方法
    }
    

    类的定义格式举例

    思路:定义一个类,用来模拟“学生”事物。其中就有两个组成部分

     对应到Java的类当中

     实现代码

    public class Student {
    
        // 成员变量
        String name; // 姓名
        int age; // 姓名
    
        // 成员方法
        public void eat() {
            System.out.println("吃饭饭!");
        }
    
        public void sleep() {
            System.out.println("睡觉觉!");
        }
    
        public void study() {
            System.out.println("学习!");
        }
    
    }

    注意事项:

    1. 成员变量是直接定义在类当中的,在方法外边。
    2. 成员方法不要写static关键字。

    3、对象的创建使用

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

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

    import 包名称.类名称;
    import day06.Student;

    对于和当前类属于同一个包的情况,可以省略导包语句不写。

    2. 创建,格式:

    类名称 对象名 = new 类名称();
    Student stu = new Student();

    3. 使用,分为两种情况:

    使用成员变量:对象名.成员变量名
    使用成员方法:对象名.成员方法名(参数)
    (也就是,想用谁,就用对象名点儿谁。)

     对象的使用格式举例:

    public class Demo02Student {
    
        public static void main(String[] args) {
            // 1. 导包。
            // 我需要使用的Student类,和我自己Demo02Student位于同一个包下,所以省略导包语句不写
    
            // 2. 创建,格式:
            // 类名称 对象名 = new 类名称();
            // 根据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();
        }
    
    } 

    运行结果

    "C:Program FilesJavajdk-13.0.2injava.exe" "-javaagent:C:Program FilesJetBrainsIntelliJ IDEA 2019.2libidea_rt.jar=64319:C:Program FilesJetBrainsIntelliJ IDEA 2019.2in" -Dfile.encoding=UTF-8 -classpath C:javaJavaAppsoutproductionJavaApps day06.Demo02Student
    null
    0
    =============
    赵丽颖
    18
    =============
    吃饭饭!
    睡觉觉!
    学习!
    
    Process finished with exit code 0

    4、成员变量的默认值

    三、 类与对象的练习

    1、定义手机类

    /*
    定义一个类,用来模拟“手机”事物。
    属性:品牌、价格、颜色
    行为:打电话、发短信
    
    对应到类当中:
    成员变量(属性):
        String brand; // 品牌
        double price; // 价格
        String color; // 颜色
    成员方法(行为):
        public void call(String who) {} // 打电话
        public void sendMessage() {} // 群发短信
     */
    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、定义测试类

    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(); // 群发短信
        }
    
    }
    

    运行结果

    "C:Program FilesJavajdk-13.0.2injava.exe" "-javaagent:C:Program FilesJetBrainsIntelliJ IDEA 2019.2libidea_rt.jar=64344:C:Program FilesJetBrainsIntelliJ IDEA 2019.2in" -Dfile.encoding=UTF-8 -classpath C:javaJavaAppsoutproductionJavaApps day06.Demo01PhoneOne
    null
    0.0
    null
    =========
    苹果
    8388.0
    黑色
    =========
    给乔布斯打电话
    群发短信
    
    Process finished with exit code 0
    

    四、对象调用内存图

    1、一个对象,调用一个方法内存图

     

    通过上图,我们可以理解,在栈内存中运行的方法,遵循"先进后出,后进先出"的原则。变量p指向堆内存中的空间,寻找方法信息,去执行该方法。
    但是,这里依然有问题存在。创建多个对象时,如果每个对象内部都保存一份方法信息,这就非常浪费内存了,因为所有对象的方法信息都是一样的。那么如何解决这个问题呢?请看如下图解。

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

    运行结果

    "D:Program FilesJavajdk-13.0.2injava.exe" "-javaagent:D:Program FilesJetBrainsIntelliJ IDEA 2019.2libidea_rt.jar=59841:D:Program FilesJetBrainsIntelliJ IDEA 2019.2in" -Dfile.encoding=UTF-8 -classpath C:OneDrivejavasrcoutproductionOneDrive day06.demo02.Demo02PhoneTwo
    null
    0.0
    null
    =========
    苹果
    8388.0
    黑色
    =========
    给乔布斯打电话
    群发短信
    =========
    null
    0.0
    null
    =========
    三星
    5999.0
    蓝色
    =========
    给欧巴打电话
    群发短信
    
    Process finished with exit code 0

     

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

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

    运行结果

    "D:Program FilesJavajdk-13.0.2injava.exe" "-javaagent:D:Program FilesJetBrainsIntelliJ IDEA 2019.2libidea_rt.jar=59949:D:Program FilesJetBrainsIntelliJ IDEA 2019.2in" -Dfile.encoding=UTF-8 -classpath C:OneDrivejavasrcoutproductionOneDrive day06.demo02.Demo03PhoneSame
    null
    0.0
    null
    =========
    苹果
    8388.0
    黑色
    =========
    给乔布斯打电话
    群发短信
    =========
    苹果
    8388.0
    黑色
    =========
    三星
    5999.0
    蓝色
    =========
    给欧巴打电话
    群发短信
    
    Process finished with exit code 0

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

    4、使用对象类型作为方法的参

     运行结果

    "D:Program FilesJavajdk-13.0.2injava.exe" "-javaagent:D:Program FilesJetBrainsIntelliJ IDEA 2019.2libidea_rt.jar=60022:D:Program FilesJetBrainsIntelliJ IDEA 2019.2in" -Dfile.encoding=UTF-8 -classpath C:OneDrivejavasrcoutproductionOneDrive day06.demo02.Demo04PhoneParam
    苹果
    8388.0
    土豪金
    
    Process finished with exit code 0

    5、使用对象类型作为方法的返

     运行结果

    "D:Program FilesJavajdk-13.0.2injava.exe" "-javaagent:D:Program FilesJetBrainsIntelliJ IDEA 2019.2libidea_rt.jar=60047:D:Program FilesJetBrainsIntelliJ IDEA 2019.2in" -Dfile.encoding=UTF-8 -classpath C:OneDrivejavasrcoutproductionOneDrive day06.demo02.Demo05PhoneReturn
    苹果
    8388.0
    玫瑰金
    
    Process finished with exit code 0

    6、、成员变量和局部变量区别

    示例代码

    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); // 错误写法!
            System.out.println(name);
        }
    }
    

    运行结果

    "D:Program FilesJavajdk-13.0.2injava.exe" "-javaagent:D:Program FilesJetBrainsIntelliJ IDEA 2019.2libidea_rt.jar=60047:D:Program FilesJetBrainsIntelliJ IDEA 2019.2in" -Dfile.encoding=UTF-8 -classpath C:OneDrivejavasrcoutproductionOneDrive day06.demo02.Demo05PhoneReturn
    苹果
    8388.0
    玫瑰金
    
    Process finished with exit code 0
    

    1、在类中的位置不同 重点

    2、作用范围不一样 重点

    3、初始化值的不同 重点

    4、在内存中的位置不同 了解

    5、生命周期不同 了解

  • 相关阅读:
    极简Docker和Kubernetes发展史
    什么是健身
    《高效休息法》IT从业者如何高效休息
    《我们赖以生存的隐喻》文学中的面向对象
    sequelize时间自动格式化
    什么是消息队列
    node.js中this指向失效解决
    node.js的async和await
    node.js箭头函数使用
    node.js如何批量赋值
  • 原文地址:https://www.cnblogs.com/luoahong/p/12602869.html
Copyright © 2020-2023  润新知