23_面向对象思想

第二十三章 面向对象思想

作者:张子默

一、面向对象思想概述

1、概述

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

2、举例

洗衣服

  • 面向过程:把衣服脱下来→找一个盆→放点洗衣粉→加点水→浸泡十分钟→揉一揉→清洗衣服→拧干→晾起来

  • 面向对象:把衣服脱下来→打开全自动洗衣机→扔衣服→按钮→晾起来

区别

  • 面向过程:强调步骤

  • 面向对象:强调对象,这里的对象就是洗衣机

3、特点

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

二、类和对象

1、什么是类

  • 是一组相关属性行为的集合。可以看成是一类事物的模板,使用事物的属性特征和行为特征来描述该类事物。

现实中,描述一类事物:

  • **属性:**事物的状态信息

  • **行为:**事物能够做什么

举例:小猫

属性:名字、体重、年龄、颜色。行为:走、跑、叫。

2、什么是对象

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

现实中,一类事物的一个实例:一只小猫

举例:一只小猫

属性:Tom、5KG、2years、yellow。行为:溜墙根走、蹦跶的跑、喵喵叫。

3、类与对象的关系

  • 类是对一类事物的描述,是抽象的

  • 对象是一类事物的实例,是具体的

  • 类是对象的模板,对象是类的实体。

在这里插入图片描述

三、类的定义

1、事物与类的对比

现实世界的一类事物:

**属性:**事物的状态信息。**行为:**事物能否做什么。

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

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

2、类的定义格式

public class ClassName {
	//成员变量
	//成员方法
}
  • 定义类就是定义类的成员,包括成员变量成员方法

  • 成员变量和以前定义变量几乎是一样的。只不过位置发生了改变。在类中,方法外

  • 成员方法和以前定义方法几乎是一样的。只不过**把static去掉,**static的作用在面向对象后面章节中再做详细讲解。

类的定义格式举例

	/*
	定义一个类,用来模拟"学生"事物,其中就有两个组成部分
		属性(是什么)
			姓名
			年龄
		
		行为(能做什么)
			吃饭
			睡觉
			学习
			
	对应到Java类当中
		成员变量(属性)
			String name; //姓名
			int age; //年龄
		
		成员方法(行为)
			public void eat() {} //吃饭
			public void sleep() {} //睡觉
			public void study() {} //学习
	*/
	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、对象的使用格式

创建对象

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

使用对象访问类中的成员

	对象名.成员变量;
	对象名.成员方法();

对象的使用格式举例

	public class Test01_Student {
		public static void main(String[] args) {
			//创建对象格式:类名 对象名 = new 类名();
			Student s = new Student();
			System.out.println("s:"+s); //cn.itcast.Student@100363
			//直接输出成员变量值
			System.out.println("姓名:"+s.name); //null
			System.out.println("年龄:"+s.age); //0
			System.out.println("‐‐‐‐‐‐‐‐‐‐");
			//给成员变量赋值
			s.name = "赵丽颖";
			s.age = 18;
			//再次输出成员变量的值
			System.out.println("姓名:"+s.name); //赵丽颖
			System.out.println("年龄:"+s.age); //18
			System.out.println("‐‐‐‐‐‐‐‐‐‐");
			//调用成员方法
			s.study(); // "好好学习,天天向上"
			s.eat(); // "学习饿了要吃饭"
		}
	}

2、成员变量的默认值

在这里插入图片描述

五、类与对象的练习

1、定义手机类

	/*
	定义一个类,用来模拟"手机"事物
		属性:品牌、价格、颜色
		行为:打电话、发短信
		
	对应到类当中
		成员变量(属性)
			String brand; //品牌
			double price; //价格
			String color; //颜色
		成员方法(行为)
			public void call() {} //打电话
			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 Demo03PhoneOne {
		public static void main(String[] args) {
			//根据Phone类创建一个名为phone的对象
			//格式:类名称 对象名 = 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();
			
		}
	
	}

六、对象内存图

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

在这里插入图片描述

通过上图我们可以理解,在栈内存中运行的方法,遵循"先进后出,后进先出"的原则。变量p指向堆内存中的空间,寻找方法信息,去执行该方法。

但是,这里依然有问题存在。创建多个对象时,如果每个对象内部都保存一份方法信息,这就是非常浪费内存了,因为所有对象的方法信息都是一样的。那么如何解决这个问题呢?请看如下图解。

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

在这里插入图片描述

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

实例

	public class Demo04PhoneTwo {
		public static void main(String[] args) {
			//根据Phone类创建一个名为phone的对象
			//格式:类名称 对象名 = 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(); //群发短信
			System.out.println("==========");
			
			//根据Phone类创建一个名为phone的对象
			//格式:类名称 对象名 = new 类名称();
			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(); //群发短信
		}
	
	}

3、两个引用指向同一个对象的内存图

在这里插入图片描述

	public class Demo05PhoneTwo {
		public static void main(String[] args) {
			//根据Phone类创建一个名为phone的对象
			//格式:类名称 对象名 = 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(); //群发短信
			System.out.println("==========");
			
			Phone two = one;
			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(); //群发短信
		}
	
	}

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

在这里插入图片描述

	public class Demo06PhoneParam {
		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); //土豪金
			
		}
	
	}

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

在这里插入图片描述

	public class Demo07PhoneReturn {
		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); //玫瑰金
		}
		
		public static Phone getPhone() {
			Phone one = new Phone();
			one.brand = "苹果";
			one.price = 8388.0;
			one.color = "玫瑰金";
			return one;
		}
	
	}

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

变量根据定义位置的不同,我们给变量起了不同的名字。如下图所示:

在这里插入图片描述

1、实例

	/*
	局部变量和成员变量
		1、定义位置不一样【重点】
			局部变量:方法内部
			成员变量:方法外部,直接写在类当中
			
		2、作用范围不一样【重点】
			局部变量:只有在方法当中才可以使用,出了方法就不能再用
			成员变量:整个类全都可以用
			
		3、默认值不一样【重点】
			局部变量:没有默认值,如果想要使用,必须手动进行赋值
			成员变量:如果没有赋值,会有默认值,规则和数组一样
			
		4、内存的为止不一样(了解)
			局部变量:位于栈内存
			成员变量:位于堆内存
			
		5、生命周期不一样(了解)
			局部变量:随着方法进栈而诞生,随着方法出栈而消失
			成员变量:随着对象创建而诞生,随着对象被垃圾回收而消失
	*/
	public class Demo08VariableDifference {
		String name; //成员变量
		
		public void methodA() {
			int num = 20; //局部变量
			System.out.println(num);
		}
		
		public void methodB(int param) { //方法的参数是局部变量
			//参数在方法调用的时候,必然会被赋值
			System.out.println(param);
			int age;
			//System.out.println(age); //错误写法,没赋值不能用
			//System.out.println(num); //错误写法
			System.out.println(name); 
		}
	
	}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章