早期,我们使用C语言编写程序,是将待解决的问题分解成几个步骤,让计算机根据编排的步骤来执行。以过程为中心来设计开发程序,我们称为面向过程编程。在解决很多类似问题时,我们每一次都需要重新规划过程,重新设计步骤,这样就会比较麻烦,也会产生效率低的问题。因此我们换个角度来思考问题,即以问题本身为核心来分析问题。
在分析问题的时候,以问题涉及的事物(事情+物体)为核心来分析。在英文中事物即Object,此单词的另外一个中文翻译是对象。所以,以事物为核心的分析方式和编程方式,我们称为面向对象编程。
所谓的面向对象,是以具体的事或物为中心进行分析的机制,这种方式更符合日常生活中分析问题的思考方式,所以在现代计算机语言中用的非常多。面向对象是一种编程思想,而不是语法,我们通过编程语言的语法来体现面向对象的思想。Java语言就是面向对象的,提供了很多面向对象的语法。接下来探讨在Java中面向对象的类和对象。
类和对象:类表示归纳和整理,对象表示具体的事物
类的基本语法结构
class 类名{
特征(属性);
功能(方法);
}
创建对象的语法:
new 类名();
写程序步骤:
- 声明类,class 类名{ }
- 创建对象,new 类名()
- 声明属性(即类中的变量,0个或多个)格式:属性类型 属性名称 = 属性值
- 声明方法(行为,0个或多个)格式:void 方法名(参数){ 功能代码 }
- 执行方法,格式:对象.属性;对象.方法名()
按步骤完成下面的例子,练习类和对象的提炼:
练习一:
package chapter04;
public class Object01 {
public static void main(String[] args) {
//所谓面向对象,就是分析问题时,以问题所涉及的事或物为中心的分析方式
//问题:做一道菜,红烧排骨,写出面向对象的制作过程
//类:菜; 对象:红烧排骨
//引用数据类型
Cooking c = new Cooking();//创建对象
c.name = "红烧排骨";
c.food = "排骨";
c.execute();
System.out.println();
//第二道菜(第二个对象)
Cooking c1 = new Cooking();
c1.name = "红烧鱼";
c1.food = "鲫鱼";
c1.execute();
}
}
class Cooking {//声明类,首字母大写(命名规范)
//声明特征(属性)
String name; //名字
String type ="红烧"; //类型
String food; //食材
String relish = "大料"; //佐料
//执行
void execute() {
System.out.println("准备食材:" + food);//字符串拼接操作,使用'+'号连接在一起
System.out.println("准备佐料:" + relish);
System.out.println("开始烹饪");
System.out.println(name + "烹饪完成");
}
}
练习二:
package chapter04;
public class Object02 {
public static void main(String[] args) {
//类:动物; 对象:猫,狗
Animal a1 = new Animal();
a1.type = "猫";
a1.name = "小黑";
a1.run();
Animal a2 = new Animal();
a2.type = "狗";
a2.name = "大黄";
a2.run();
}
}
class Animal {
String type;
String name;
void run() {
System.out.println(type + " " + name + "跑开了");
}
}
练习三:
package chapter04;
public class Object03 {
public static void main(String[] args) {
//狗:2只,小黑,小白
Dog dog1 = new Dog();
dog1.color = "white";
dog1.name = "小白";
dog1.run();
Dog dog2 = new Dog();
dog2.color = "black";
dog2.name = "小黑";
dog2.run();
}
}
class Dog {
String color;
String name;
void run() {
System.out.println(name + "跑开了");
}
}
练习四:
package chapter04;
public class Object04 {
public static void main(String[] args) {
//老师和学生
Teacher t = new Teacher();
t.name = "zhangsan";
t.teach();
Student s = new Student();
s.name = "lisi";
s.study();
}
}
class Teacher {
String name;
void teach() {
System.out.println(name + "老师在讲课");
}
}
class Student {
String name;
void study() {
System.out.println("学生" + name + "在听课");
}
}
总结:
- 类是结构体,里面包含了属性(特征)和方法(行为),会有很多的对象
- class是关键字,关键字全是小写
- 类名是类的名称,遵循标识符的规则,一般情况下,类名首字母大写
- 对象是类的实例化(具象化):new 类名()记得加括号;new也是关键字,表示创建一个具体的对象,使用一次创建一次,每次都是全新的。
- 一般new出来的对象会赋值给变量,方便重复使用。
- 变量的类型就是对象的类型:如 Teacher t = new Teacher(); 但此处把对象赋值给 t 并不是把对象给 t ,即与基本数据类型的赋值不一样。解释见下面类、对象、变量之间的关系。
类、对象、变量之间的关系
首先将内存空间分为栈、堆、元空间三部分,栈内存中存储方法和对象,堆内存中存储对象,元空间内存储类的信息。
- 当我们想构建一个对象 Teacher ,并把对象的值赋值给变量 t 时,会看元空间中是否有类的信息,
- 如果有类的信息,会在堆内存中构建对象 Teacher ,
- 之后把对象的内存地址(引用地址)赋值给变量 t ,于是变量 t 的地址就指向了堆内存中的对象
这里注意区分基本数据类型与引用数据类型:基本数据类型赋值后直接存储到栈中,而不是堆内存中,操作时也是直接对栈内存操作;而 new 出来的对象是引用数据类型,即用图中箭头指向表示的。对象是将内存地址赋值给了变量,变量实际引用了内存中的对象,所以称之为引用变量,变量的类型称之为引用数据类型。
最后,介绍特殊的对象:空对象(NULL),没有引用的对象称为空对象,是一种特殊的值,也叫关键字对象。所有引用类型变量的默认取值都是null。
如 Teacher t1 = null;
null就是空对象,可以简单理解为没有图中 t 指向对象 Teacher 的箭头。