编程思想
编程思想其实就是编程思路,我们开发中2种经典的编程思想就是面向过程编程思想和面向对象编程思想.
- 面向过程编程思想:强调的是过程,必须清楚每一个步骤,然后按照步骤一步一步去实现
- 面向对象编程思想:强调的是对象, 通过调用对象的行为来实现功能,而不是自己一步一步的去操作实现。面向对象仍然包含面向过程,只不过关注点变了,关注谁来做。面向对象的语言中,包含了三大基本特征,即封装、继承和多态。
程序员的角色:
- 面向过程:程序员是具体执行者
- 面向对象:程序员是指挥者
总结:面向对象思想是一种更符合我们思考习惯的思想,它可以将复杂的事情简单化,并将我们从执行者变成了指挥者。
代码示例
package demo01;
import java.util.Arrays;
// 需求:打印数组中所有的元素,打印格式为: [元素1,元素2,元素3,元素,...,元素n]
public class Demo {
public static void main(String[] args) {
int[] arr = {1, 23, 4, 5, 6};
//面向过程
for (int i = 0; i < arr.length; i++) {
if (i == 0) {
System.out.print("[" + arr[i] + ", ");
} else if (i == arr.length - 1) {
System.out.println(arr[i] + "]");
} else {
System.out.print(arr[i] + ", ");
}
}
//面向对象
System.out.println(Arrays.toString(arr));
}
}
类和对象的概述
环顾周围,你会发现很多对象,比如桌子,椅子,同学,老师等。桌椅属于办公用品,师生都是人类。那么什么是类呢?什么是对象呢?
什么是类
类:是一类具有相同特性的事物的抽象描述,是一组相关属性和行为的集合。可以看成是一类事物的模板,使用事物的属性特征和行为特征来描述该类事物。 类在客观世界里是不存在的,是抽象的,只是用来描述数据信息的。类:我们叫做class。 对象:我们叫做Object,instance(实例)。以后我们说某个类的对象,某个类的实例。是一样的意思。
现实中,描述一类事物:
- 属性:就是该事物的状态信息
- 行为:就是该事物能够做什么
Java中用class描述事物也是如此:
- 成员变量:对应事物的属性
- 成员方法:对应事物的行为
什么是对象
对象:是一类事物的具体体现。对象是类的一个实例,必然具备该类事物的属性和行为。现实中,一类事物的一个实例:一只小猫 。对象是类的实例,具体存在的,看得见摸得着的,对象的属性是有具体的值。对象的行为其实就是可以使用的功能\行为。
对象是根据类来创建的,类中有什么,对象就有什么,可以把类看成是对象的数据类型
类与对象的关系
- 类是对一类事物的描述,是抽象的。
- 对象是一类事物的实例,是具体的。
- 类是对象的模板,对象是类的实体。
类的定义
类的组成是由属性和行为两部分组成
- 属性:该类事物的状态信息,在类中通过成员变量来体现(类中方法外的变量)
- 行为:该类事物有什么功能,在类中通过成员方法来体现(和前面的方法相比去掉static关键字即可)
格式
类的定义格式举例:
public class Phone {
//属性(成员变量): 数据类型 变量名;
/**
* 品牌
*/
String brand;
/**
* 价格
*/
double price;
//行为(成员方法): 没有static修饰
/**
* 打电话的功能
*
* @param phoneNum 电话号码
*/
public void call(String phoneNum) {
System.out.println("正则给" + phoneNum + "打电话...");
}
/**
* 发短信的功能
*
* @param phoneNum 电话号码
* @param message 短信内容
*/
public void sendMessage(String phoneNum, String message) {
System.out.println("正在给" + phoneNum + "发送短信,短信内容是:" + message);
}
}
对象的创建和使用
类其实就是对象的数据类型,类是引用数据类型
现在我们来创建Phone类的对象
public class Test {
public static void main(String[] args) {
/*
对象的创建和使用:
对象的创建:
对象创建格式: 类名 对象名 = new 类名();
结论: 类其实也是一种数据类型,是引用数据类型
对象的使用:
访问成员变量:
给成员变量赋值: 对象名.成员变量名 = 值;
获取成员变量的值: 对象名.成员变量名
访问成员方法:
调用方法: 有返回值的方法,无返回值的方法
无返回值的方法:
直接调用: 对象名.方法名(实参);
有返回值的方法:
直接调用: 对象名.方法名(实参);
赋值调用: 数据类型 变量名 = 对象名.方法名(实参);
输出调用: System.out.println(对象名.方法名(实参));
*/
// 创建Phone类的对象
Phone p1 = new Phone();
// 给p1对象的brand成员变量赋值
p1.brand = "华为";
// 给p1对象的price成员变量赋值
p1.price = 999.8;
// 获取p1对象的brand成员变量的值
System.out.println(p1.brand);
// 获取p1对象的price成员变量的值
System.out.println(p1.price);
// 无返回值的成员方法
// 使用p1对象调用call方法
p1.call("10086");
// 使用p1对象调用sendMessage方法
p1.sendMessage("10086", "请问一下联通的客服电话号码是多少?");
}
}
那么,对象名中存储的是什么呢?答:对象地址。直接打印对象名和数组名都是显示“类型@对象的hashCode值",所以说类、数组都是引用数据类型,引用数据类型的变量中存储的是对象的地址,或者说指向堆中对象的首地址。
类的属性(成员变量)
成员变量的分类
- 实例变量:没有static修饰,也叫对象属性,属于某个对象的,通过对象来使用
- 类变量:有static修饰,也叫类变量,属于整个类的,不是属于某个实例
如何声明成员变量
属性的类型可以是Java的任意类型,包括基本数据类型、引用数据类型(类、接口、数组等)
示例
public class Chinese {
static String country;//类变量
String name;//成员变量,有默认值
char gender = '男';//成员变量,显式赋值
}
如何在类外面访问成员变量
类变量
实例变量
代码示例
package demo02;
class Chinese {
static String country;//类变量
String name;//成员变量,有默认值
char gender = '男';//成员变量,显式赋值
}
public class TestChinese {
public static void main(String[] args) {
//类名.静态成员变量
System.out.println(Chinese.country); //null
// 错误,非静态成员变量必须通过对象.进行访问
// System.out.println(Chinese.name);
Chinese c1 = new Chinese();
//对象名.非静态成员变量
System.out.println(c1.name);//null
//静态的成员变量也可以通过对象.进行访问
//对象名.非静态成员变量
System.out.println(c1.country);//null
System.out.println(c1.gender); //男
}
}
成员变量的特点
成员变量有默认值
代码示例
package demo03;
class Student {
/**
* 姓名
*/
String name;
/**
* 年龄
*/
int age;
/**
* 分数
*/
double score;
char c;
}
public class Test {
public static void main(String[] args) {
/*
成员变量的默认值:
整数类型: 默认值是0
小数类型: 默认值是0.0
布尔类型: 默认值是false
字符类型: 默认值是不可见字符 '\u0000'
引用类型: 默认值是null
*/
// 创建Student对象
Student stu = new Student();
// 访问成员变量
System.out.println(stu.name);// null
System.out.println(stu.age);// 0
System.out.println(stu.score);// 0.0
System.out.println("=" + stu.c + "=");
}
}
对象内存图
内存是计算机中重要的部件之一,它是与CPU进行沟通的桥梁。其作用是用于暂时存放CPU中的运算数据,以及与硬盘等外部存储器交换的数据。只要计算机在运行中,CPU就会把需要运算的数据调到内存中进行运算,当运算完成后CPU再将结果传送出来。我们编写的程序是存放在硬盘中的,在硬盘中的程序是不会运行的,必须放进内存中才能运行,运行完毕后会清空内存。Java虚拟机要运行程序,必须要对内存进行空间的分配和管理,每一片区域都有特定的处理数据方式和内存管理方式。
内存详解
单个对象的内存图
结论:
- 只要创建对象,就会在堆区开辟一块空间(凡是new就会在堆区开辟一块新的空间)
- 只要调用方法,就会在栈区开辟一块空间,用来执行该方法
多个对象的内存图
结论:
- 多个对象在堆内存中,都有不同的内存划分,成员变量存储在各自对象的内存区域中,成员方法多个对象共用的一份
- 凡是new就会重新在堆区开辟一块新空间
- 对象和对象之间的关系是相互独立的
多个变量指向相同对象内存图
结论:
- 当多个对象的引用指向同一个内存空间(变量所记录的地址值是一样的)
- 只要有任何一个对象修改了内存中的数据,随后,无论使用哪一个对象进行数据获取,都是修改后的数据。
成员变量和局部变量的区别
声明位置和方式
- 静态变量:在类中方法外,并且有static修饰
- 实例变量:在类中方法外,没有static修饰
- 局部变量:在方法体{ }中或方法的形参列表、代码块中
在内存中存储的位置不同
- 静态变量:方法区
- 实例变量:堆
- 局部变量:栈
生命周期
- 静态变量:和类的生命周期一样,因为它的值是该类所有对象共享的,早于对象的创建而存在。
- 实例变量:和对象的生命周期一样,随着对象的创建而存在,随着对象被GC回收而消亡, 而且每一个对象的实例变量是独立的。
- 局部变量:和方法调用的生命周期一样,每一次方法被调用而在存在,随着方法执行的结束而消亡, 而且每一次方法调用都是独立。
作用域
- 静态变量和实例变量:不谈作用域 在本类中,唯一的限制,静态方法或静态代码块中不能使用非静态的,其他都可以直接使用。 在其他类中,能不能使用看修饰符
- 局部变量:有作用域 出了作用域就不能使用
默认值
- 静态变量:有默认值
- 实例变量:有默认值
- 局部变量:没有,必须初始化 其中的形参比较特殊,靠实参给它初始化。