zoukankan      html  css  js  c++  java
  • 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、生命周期不同 了解

  • 相关阅读:
    爬取校园新闻首页的新闻的详情,使用正则表达式,函数抽离
    网络爬虫基础练习
    Mysql 使用 select into outfile
    Mysql 使用CMD 登陆
    使用Clean() 去掉由函数自动生成的字符串中的双引号
    Get Resultset from Oracle Stored procedure
    获取引用某个主键的所有外键的表
    Entity Framework 丢失数据链接的绑定,在已绑好的EDMX中提示“Choose Your Data Connection”
    添加MySql Metat Database 信息
    at System.Data.EntityClient.EntityConnection.GetFactory(String providerString)
  • 原文地址:https://www.cnblogs.com/luoahong/p/12602869.html
Copyright © 2011-2022 走看看