一、面向对象思想
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、生命周期不同 了解