7.0_[Java 面向对象]-类和对象

##################################################

目录

面向对象扫盲

万物皆对象

分类思想

对象的属性与方法/实例的特征和行为

如何在 Java 中使用面向对象的思想来处理问题

Object/对象 思想

Encapsulation/封装 思想

Class/类 的思想

类和对象的关系

一个对象是一个类的实例

现实世界 —— 概念世界 —— 计算机世界

举个栗子——类和对象/模具类和月饼实例

类是对象的类型

小总结

Java 的类

类是 Java 程序的基本单元

定义类的成员变量和成员方法

示例定义一个商场类

如何创建和使用对象

实例化

实例化对象/创建对象

引用/调用 对象数据成员

在多个 类/文件 中编写编译运行 Java 程序

Windows CMD 命令提示符编译运行示例

ShangChang.java

test.java

cmd 编译运行

Windows MyEclipse 10 IDE 创建编写编译运行示例


##################################################

面向对象扫盲

——————————

万物皆对象

        世界是由什么组成的?

分子、原子、离子等化学物质

        那你一定是学化学的

不同的颜色组成的!

        那你可能是学画的

这个世界由不同类别的事物组成的

        那你绝对是分类学家了!

        其实 这个问题本身就比较抽象

        在 Java 的世界中万物皆对象

        我们应该站在分类学家的角度去思考,对事物进行分类

——————————

分类思想

        物以类聚 世界由不同类别的事物组成的
        例如:

世界由 动物、植物、物品、人、风景 组成
动物又分为 脊椎动物、无脊椎动物
脊椎动物又分为 哺乳类、鱼类、爬行类。。。。。。
爬行类又分为 有足类、无足类。。。。。。

        就这么一直分下去

        当我们说到某一个分类时 脑海中就可以找到属于该分类的一个具体的事例

        例如

爬行类中的有足类 王八

爬行类中的无足类 蛇

        然后 我们说到这些动物时 脑海中就会浮现出她们的形象
        没错 这些客观存在与现实世界中的王八、蛇什么的的 都被称为对象 

        在 Java 的世界中 万物皆对象

        分类 是人们认识世界的一个很自然的过程 会不自觉的进行分类
        例如 垃圾会分为可回收的和不可回收的
        交通工具分为 车、船、飞机。。。

        分类就是以事物的性质、特点、用途等作为区分的标准
        将符合同一标准的事物归为一类 不同的则分开

        例如 动物 如果根据有无脊椎来分 可以分为有脊椎动物和无脊椎动物
        如果根据是水生还是陆生 可以分为水生动物和陆生动物

        所以 我们应该根据需求 选择合适的 标准/角度 来对 对象 进行分类

——————————

对象的属性与方法/实例的特征和行为

        对象 就是东西 是现实世界中的一个实例

属性即特征
方法即行为

属性、静态特征        就是可以用某些数据来描述的特征
方法、动态特征        就是对象所表现的行为或对象所具有的功能

——————————

如何在 Java 中使用面向对象的思想来处理问题

        Java 是一种面向对象的编程语言 Object Oriented Programmin Language/OOPL
        应该用面向对象的思维来思考问题/编写程序

        在面向对象中 对象是用来描述客观事物的一个实体
        首先对现实世界中的对象进行分析与归纳 找出那些对象与要解决的问题是相关的

例如 商场结帐

        这个问题中 有两个对象:

顾客对象
收银员对象

        只有这两个对象让我们关心:

顾客要结帐 收银员要收款

        既然这俩都是对象 那怎么区分呢?
        每一个对象都有自己的特征 包括静态特征和动态特征

静态特征是可以用某些数据来描述的特征 例如 姓名、年龄
动态特征就是对象所表现的行为或对象所具有的功能 例如 付账、收款

        示例:

顾客对象

    静态特征
        姓名
            老姐姐
        年龄
            38
        体重
            500 kg

    动态特征
        付账

收银员对象

    静态特征
        员工号
            110
        姓名
            小老弟
        部门
            财务部

    动态特征
        收款

        看的出来 不同类别中的对象有不同的静态特征和动态特征
        我们需要把这个统计出来 储存在计算机中!

        那 该怎么做呢?
        该怎么储存在计算机中呢?

——————————

Object/对象 思想

        对象有了这些静态特征和动态特征才变得与众不同

        在面向对象的编程思想中

        把对象的静态特征称为 对象的属性
        动态特征称为 对象的方法

        这两个主要因素才是构成对象的关键点

对象 就是用来描述客观事物的一个实体 由一组属性和方法构成

        在 Java 中

        对象的属性被储存在一些变量中

        例如 姓名储存在一个 String 类型的变量中


        对象的行为则通过定义方法来实现

        例如 付款/收款 都可以定义为一个方法

        所以 不能理解就这么记:

对象 就是虚拟的现实世界的东东
属性 就是这个东东的特征
方法 就是这个东东能干嘛

        例如 人

        对象

        属性

两个眼睛

一个鼻子

一张嘴

一双蹄子

一双爪爪

        方法

能吃饭

能睡觉

能打游戏

——————————

Encapsulation/封装 思想

        好 我们知道了 对象就是用来描述客观事物的一个实体,由一组属性和方法构成。

        而对象具有封装性

封装就是把一个事物包装起来 并尽可能隐藏内部细节

        例如 人

        人在组装前 就是一堆肢体 例如 手、脚、脑袋。。。。。。
        仅仅靠这些部件 是不能起到什么作用的
        只有把这些部件组装完成后 才具有人的功能
        例如 说话、吃饭、跑步。。。。。。

        人就是一个对象 而那些零散的部件就是该对象的属性
        说话、吃饭、跑步 等行为就是该对象的方法

        我们应看出来 对象的属性和方法是相辅相成 不可分割的
        属性和方法共同组成了实体对象 这就是封装性 把一个事物包装起来 并尽可能隐藏内部细节!

    封装
    想象一下你面前有一个 ATM 自动取款机
    你是不是看不到里面有什么?
    但是你可以通过提前设置的插卡口和按键和她进行交互!
    ATM 从吐钱口开始吐钞票!
    这就是封装的经典例子

——————————

Class/类 的思想


        商店 有顾客对象
        但是在现实世界中 有很多顾客 例如 李二哈、李三岁、李恰恰。。。。。。
        所以顾客只是这类人中的一个实例 即 顾客_1 是 人_类 中的一个 对象
        不论是什么人 都有一些共同的属性 如 有头发,有脑袋 等
        也有一些共同的行为 如 走路、打架 等
        将这些共同的属性和行为组织到一个单元中 就得到了这个类 —— 人类

        再比如 跑车法拉利
        法拉利是一个对象  但是现实世界中 还有奔驰、保时捷、凯迪拉克。。。。。。
        因此法拉利只是这一类别中的一个实例
        不论那种车 都有一些共同的属性 如 品牌、颜色 等
        也有一些共同的行为 如 发动、加速 等
        将这些共同的属性和行为组织到一个单元中 就得到了类 —— 汽车类

类定义了此类中的对象实例将会拥有的 特征/属性 和 行为/方法

        类的属性:

        对象所拥有的静态特征在类中表示时称为类的属性
        例如 顾客对象 都有 姓名 特征
        那这个姓名 就可以说是 顾客类 的属性
        只是不同对象的这一属性的值不一样
        顾客老姐姐 顾客小老弟 姓名值就不同

        类的方法:

        对象执行的操作称为类的方法
        例如 顾客对象 都有 付账 行为
        那这个付账 就是 顾客类 的一个方法

——————————

类和对象的关系

%%%%%

一个对象是一个类的实例

类是对象的类型

        这句话能看懂就跳过下面这一段吧

 

        我们刚刚接触了类和对象的概念 她们之间既有区别又有联系

        一个类 为她的全部对象给出了一个统一的 定义/信息/特征/属性

        而她的每个对象则是符合这种定义的一个实体

        类和对象的关系 就是抽象和具体的关系

        类是多个对象进行综合抽象的结果 是实体对象的概念模型
        而 一个对象 就是一个类的实例

%%%%%

现实世界 —— 概念世界 —— 计算机世界

        现实世界中 有一个个具体的 实体

例如 超市 超市中有很多顾客 李恰恰、老姐姐等

        这个顾客角色 就是我们大脑抽象的概念世界中形成的抽象概念
        当需要把顾客这个 抽象概念 定义到计算机中时
        就形成了 计算机世界的 中的 类 !
        就是我们学的 类
        而用类创建的一个实例 就是 对象 该对象和 现实世界 中的 实体 是一一对应的:

        现实世界的 实体 抽象成概念世界 的 抽象概念
        定义 成计算机世界 的 类
        类 创建 对象
        对象 对应着 现实世界 的 实体
        就是这么个关系

%%%%%

举个栗子——类和对象/模具类和月饼实例

        马上就中秋了 总要吃月饼的

        月饼是怎么做出来的?

用模具

        好 在面向对象的编程世界中 制作月饼对象的是模具类

        模具是一个类 定义了这些信息:

月饼的半径
月饼的 馅/口味

        在 Java 面向对象编程中 就用这个类创建出类的一个实例 即创建类的一个对象

用这个模具类做出来的不同大小和不同口味的月饼就是一个个月饼对象

%%%%%

类是对象的类型

        类型是什么?还记得吗?
        变量类型?想起来了吗?

整型/ing、小数/double、字符/char、字符串/String

        这些都是 Java 已经定义好的类型 编程时 只需要用这些类型声明变量即可!


        那么 我们要描述 顾客老姐姐
        那 老姐姐 的数据类型是什么呢?
        字符还是字符串?其实都不是

老姐姐 的类型就是 顾客
顾客类 就是 老姐姐 的类型

        所以说类就是对象的类型 就是我们根据对象而自定义的类型!

实际上定义类就是抽取同类实体的共性定义的一种数据类型

        例如 顾客类、人类、动物类

老姐姐 李恰恰 类型都是 顾客
爸爸 妈妈 姐姐 类型都是 人
狗 猫 老鼠 类型都是 动物

        如果跟变量的概念对比
        整型类 int 对象 数_1、数_2、数_3
        那么  数_1、数_2、数_3 这些变量的类型就是 整型 int
        好比  老姐姐 李恰恰 的类型是 顾客

——————————

小总结


        Java 是一门面向对象的语言

        面向对象于人类的思维一致
        并且信息隐藏,提高了程序的可维护性和安全性
        提高了程序的可重用性

        类和对象的关系是抽象和具体的关系

        类是对象的类型 对象是类的实体

##################################################

Java 的类

——————————

类是 Java 程序的基本单元

        在面向对象程序设计中 类是程序的基本单元 应该为一个文件一个类
        Java 可是一门完全面向对象的编程语言 所有程序都是以类为组织单元的

        回想一下 我们的每一个程序 基本框架是不是都是这样 code:

public class test {
    public static void main(String[] args) {
    }
}

        最外层的框架就是定义一个类了


        我们该怎样在 Java 中描述她们

        Java 中的类将现实世界中的概念模拟到计算机中

        因此需要在类中描述类所具有的属性和方法        给出一个类的模板 code :

public class 类名 {

    /* 定义属性部分 */
    属性类型 属性_1;
    属性类型 属性_2;
    属性类型 属性_N;

    /* 定义方法部分 */
    方法_1 () { };
    方法_2 () { };
    方法_N () { };
}

        可以看出 类的命名也遵循一定的规则
        在 Java 中创建一个类 需要使用一个 class 关键字 一个类名 一对大括号

class 就是创建类的关键字
在 class 前面的 public 表示公有的意思
在 class 后面的要给定义的类命名 然后是一对大括号

        类的主体部分就在 { } 中
        类名通常由多个单词组成 每个单词的首字母大写
        类似于 变量命名 不能使用关键字命名 还不能嵌入空格等特殊符号
        除了 _ 和 $ 以外 不能带有任何特殊符号 还不能以数字开头
        另外 类名最好简洁有意义 尽量使用完整单词 避免缩写词
        除非 该缩写词已经广泛被使用 例如 HTML、HTTP、IP 等

——————————

定义类的成员变量和成员方法


        通过定义类名 来得到程序最外层的框架 code:

public class 类名 {

    /* 类的主体 */
}

        类的属性就是在类的主体中定义变量来描述类所具有的静态特征 即属性
        这些变量又称为类的成员变量 code:

public class 类名 {

    /* 成员属性 */
    数据类型 变量名_1;
    数据类型 变量名_2;
    数据类型 变量名_3;
    数据类型 变量名_N;
}

        类的方法 通过在类中定义方法来描述类所具有的行为
        这些方法称为类的成员方法 怎么声明方法?语法格式:

访问修饰符 返回值类型 方法名() {

    /* 方法主体 */
}

        访问修饰符限制了访问该方法的范围 例如 public 还有其她访问修饰符

        返回值类型 是方法执行后返回结果的类型 这个类型可以是基本类型 或者是引用类型
        也可以没有返回值 若没有返回值 就必须用 void 表示

        方法名 命名都是差不多的 都必须遵循标识符的命名规则
        这里介绍一下 骆驼/Camel、帕斯卡/Pascal 命名法

驼峰命名法 标识符第一个单词的首字母小写 后面每个单词的首字母大写 例如 userNum、userName
帕斯卡命名法 每一个单词的首字母都大写 例如 UserNum、UserName

        不过 程序员们一般都是定义 属性、方法 使用骆驼命名法 定义类使用帕斯卡命名法
        避免很多麻烦冲突等 一目了然

        现在我们可以创建自己的方法了 code:

public class 类名 {

    /* 成员属性 */
    数据类型 变量名_1;
    数据类型 变量名_2;
    数据类型 变量名_3;
    数据类型 变量名_N;

    /* 成员方法 */
    访问修饰符 返回值类型 方法_1(参数列表) {

        /* 方法主体 */
    }
    访问修饰符 返回值类型 方法名_2(参数列表) {

        /* 方法主体 */
    }
    访问修饰符 返回值类型 方法名_3(参数列表) {

        /* 方法主体 */
    }
    访问修饰符 返回值类型 方法名_N(参数列表) {

        /* 方法主体 */
    }
}

——————————

示例定义一个商场类


        code:

public class ShangChang {
/* 商场类 */

	/* 成员属性 */
	String shangChangName;		/* 商场名字 */
	int louCeng;    /* 楼层数目 */
	int gongZuoNum;    /* 工作人员数目 */

	/* 成员方法 */
	public void centerSystem() {

		System.out.println ( shangChangName + "\n"
			+ "配备:" + louCeng + "层" + gongZuoNum + "人" );
	}
}

##################################################

如何创建和使用对象

——————————

实例化

        当我们创建好了类后 下面就可以根据定义的模板创建对象

        类的作用就是创建对象
        由类生成对象 称为类的实例化过程
        一个实例也就是一个对象 一个类可以生成多个对象

——————————

实例化对象/创建对象

        创建类的对象时 需要使用 Java 的 new 关键字
        还记得吗?就像变量赋值一样!

        实例化对象语法:

类名 对象名 = new 类名();

        示例 实例化一个商场对象

ShangChang Shop = new ShangChang();

        声明一个 ShangChang 类型 的 对象
        就像声明一个变量一样 以后 我们调用 Shop 实际上就是调用 ShangChang 类

        抽象对比:

对象类型 对象名 = new 对象类型();
ShangChang Shop =  new ShangChang();

数据类型 变量名
String str;
char ch;
int num;
double dnum;
bool tf;

        使用 new 实例化对象时 我们并没有给她的数据成员赋一个特定的值
        因为 我们要考虑 每个对象的属性值不一样 我们要在实例化对象后再给她的数据成员赋值!

——————————

引用/调用 对象数据成员

        在 Java 中 要引用对象的属性和方法 需要用:

.

        操作符 就是一个点。。。

         对象名 在点左侧 属性名/方法名 在点右侧

        语法格式:

    引用对象的属性:
对象名.属性;
对象名.属性 = 值;

    引用对象的方法:
对象名.方法名();
对象名.方法名( 参数 );

        示例与抽象对比:

Shop.shangChangName = "喜洋洋大超市";    /* 为 Shop 对象中的 商场名字 赋值  */
Shop.louCeng = 3;    /* 为 Shop 对象中的 楼层 赋值 */
Shop.gongZuoNum = 20;    /* 为 Shop 对象中的 工作人员数量 赋值 */
Shop.centerSystem();    /* 调用 Shop 对象中的 centerSystem 方法输出信息 */

对象名.属性 = 值;
Shop.louCeng = 3;

变量名 = 值;
str = "哈哈哈!";
ch = '哈';
num = 521;
dnum = 521.1314;
tf = true;

        调用方法就不用抽象对比了 程序就会跳到指定的方法继续执行
        执行完毕后 再返回来继续执行之后的代码段

##################################################

在多个 类/文件 中编写编译运行 Java 程序

——————————

Windows CMD 命令提示符编译运行示例

        我们现在 可以写多个类 并把她们存放在不同的文件中 编译时 一起编译即可!
        不过虽然说可以放在同一个文件中 但是在实际开发中 还是推荐一个文件一个类
        因为维护方便

        我们还知道 程序执行需要一个入口/一个起点
        这个还是跟以前一样 哪一个类中有 main 方法 就哪里开始!
        我们在 main() 中实例化初始化调用使用我们其她的类和其中的方法!

main() 方法是程序的入口 可以出现在任何一个类中
但是要保证一个 Java 类中只有一个 main() 方法
最起码有一个主类用来放 main() 这样不同的类才能实现不同的方法

%%%%%

ShangChang.java

        code:

public class ShangChang {
/* 定义了一个商场类 */

	/* 成员属性 */
	String shangChangName;	/* 商场名字 */
	int louCeng;	/* 楼层数目 */
	int gongZuoNum;	/* 工作人员数目 */

	/* 成员方法 */
	public void centerSystem() {

		System.out.println ( shangChangName + "\n"
			+ "配备:" + louCeng + " 层 " + gongZuoNum + " 人" );
	}
}

%%%%%

test.java

        code:

public class test {

	public static void main(String[] args) {

		/*	实例化 ShangChang 对象
		 *
		 *	现在你能看明白 Scanner 输入方法是怎么完成的了吗:
		 * Scanner input = new Scanner(System.in);
		 */
		ShangChang Shop = new ShangChang();

		System.out.println  ("###初始化成员变量之前###");
		Shop.centerSystem();	/* 调用 商场类 中的 系统中心 方法 */

		/* 为 Shop 对象的属性成员赋值 即初始化 */
		System.out.println();
		System.out.println("###初始化成员变量之后###");
		Shop.shangChangName = "喜洋洋灰太狼";	/* 初始化商场名字 为 喜洋洋灰太狼 */
		Shop.louCeng = 10;	/* 初始化楼层数目 为 10 层 */
		Shop.gongZuoNum = 200;	/* 初始化工作人员数目 200 名 */
		Shop.centerSystem();	/* 带着本次初始化的新值 调用 商场/ShangChang 类中的 系统中心/centerSystem 方法 */
	}
}

%%%%%

cmd 编译运行

        demo:

C:\Users\byme\javaTest>type ShangChang.java    /* 查看 ShangChang.java 文件内容 */
public class ShangChang {
/* 定义了一个商场类 */

        /* 成员属性 */
        String shangChangName;  /* 商场名字 */
        int louCeng;    /* 楼层数目 */
        int gongZuoNum; /* 工作人员数目 */

        /* 成员方法 */
        public void centerSystem() {

                System.out.println ( shangChangName + "\n"
                        + "配备:" + louCeng + " 层 " + gongZuoNum + " 人" );
        }
}
C:\Users\byme\javaTest>type test.java    /* 查看 test.java 文件内容 */
public class test {

        public static void main(String[] args) {

                /*      实例化 ShangChang 对象
                 *
                 *      现在你能看明白 Scanner 输入方法是怎么完成的了吗:
                 * Scanner input = new Scanner(System.in);
                 */
                ShangChang Shop = new ShangChang();

                System.out.println  ("###初始化成员变量之前###");
                Shop.centerSystem();    /* 调用 商场类 中的 系统中心 方法 */

                /* 为 Shop 对象的属性成员赋值 即初始化 */
                System.out.println();
                System.out.println("###初始化成员变量之后###");
                Shop.shangChangName = "喜洋洋灰太狼";   /* 初始化商场名字 为 喜
洋洋灰太狼 */
                Shop.louCeng = 10;      /* 初始化楼层数目 为 10 层 */
                Shop.gongZuoNum = 200;  /* 初始化工作人员数目 200 名 */
                Shop.centerSystem();    /* 带着本次初始化的新值 调用 商场/ShangC
hang 类中的 系统中心/centerSystem 方法 */
        }
}
C:\Users\byme\javaTest>dir *.java    /* 这个项目有多个文件 */
 驱动器 C 中的卷是 System_8.1
 卷的序列号是 B6F6-A064

 C:\Users\byme\javaTest 的目录

2022/05/24  08:58               338 ShangChang.java
2022/05/24  08:58               789 test.java
               2 个文件          1,127 字节
               0 个目录  7,941,496,832 可用字节

C:\Users\byme\javaTest>dir *.class    /* 暂时没有字节码文件 */
 驱动器 C 中的卷是 System_8.1
 卷的序列号是 B6F6-A064

 C:\Users\byme\javaTest 的目录

找不到文件

C:\Users\byme\javaTest>javac test.java Shangchang.java    /* 编译这些源文件 */

C:\Users\byme\javaTest>dir *.class    /* 产生多个字节码文件 */
 驱动器 C 中的卷是 System_8.1
 卷的序列号是 B6F6-A064

 C:\Users\byme\javaTest 的目录

2022/05/24  09:01               788 ShangChang.class
2022/05/24  09:01               730 test.class
               2 个文件          1,518 字节
               0 个目录  7,941,488,640 可用字节

C:\Users\byme\javaTest>java test    /* 执行 main 方法所在的字节码文件 */
###初始化成员变量之前###
null
配备:0 层 0 人

###初始化成员变量之后###
喜洋洋灰太狼
配备:10 层 200 人

C:\Users\byme\javaTest>

        删除 ShangChang.class 运行出错:

C:\Users\byme\javaTest>del ShangChang.class

C:\Users\byme\javaTest>dir *.class
 驱动器 C 中的卷是 System_8.1
 卷的序列号是 B6F6-A064

 C:\Users\byme\javaTest 的目录

2022/05/24  09:01               730 test.class
               1 个文件            730 字节
               0 个目录  7,941,156,864 可用字节

C:\Users\byme\javaTest>java test
Exception in thread "main" java.lang.NoClassDefFoundError: ShangChang
        at test.main(test.java:10)
Caused by: java.lang.ClassNotFoundException: ShangChang
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        ... 1 more

C:\Users\byme\javaTest>

——————————

Windows MyEclipse 10 IDE 创建编写编译运行示例

        使用 MyEclipse 10 IDE 编写项目

        Eclipse 同样适用 两种本质上是一种环境

MyEclipse 10

        新建项目:

新建

        项目名:

Test

        新建类:

新建类

        名称 ShangChang

        不勾选 main()

ShangChang

         ShangChang 类文件创建完毕:

ShangChang

        复制代码后 Ctrl s 快捷保存:

代码

        再次新建类:

新建类

        名称 test

        勾选 main 方法:

test

        新建类成功:

新建类

        复制代码 Ctrl s 保存:

代码

        Ctrl 11 编译运行点击确定:

Ctrl 11

        成功编译运行:

成功

        成功找到 src 目录下的源文件:

src

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

燃吹

呜呜呜没钱钱吃饭了……

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值