一、类和对象的概念
类(Class) 和 对象(Object) 是面向对象的核心概念。
类是对一类事物的描述,是抽象的、概念上的定义。
对象是实际存在的该类事物的每个个体,因而也称为实例(instance)。
可以理解为:类 = 抽象概念的人;对象 = 实实在在的某个人 ;面向对象程序设计的重点是类的设计,而类的设计,其实就是类的成员的设计。
万事万物皆对象的理解:
- 在Java语言范畴中,我们都将功能、结构等封装到类中,通过类的实例化,来调用具体的功能结构
- 涉及到Java语言与前端Html、后端的数据库交互时,前后端的结构在Java层面交互时,都体现为类、对象。
二、Java类及类成员
现实世界的生物体,大到鲸鱼,小到蚂蚁,都是由最基本的细胞构成的。同理,Java代码世界是由诸多个不同功能的类构成的。常见的类的成员有:
- 属性(filed,又称为成员变量、域、字段)
- 方法(method,又称为成员方法、函数)
三、类和对象的创建
3.1 Java自定义类的创建
语法格式:
修饰符 class 类名 {
属性声明;
方法声明;
}
创建Java自定义类的步骤:
- 定义类(考虑修饰符、类名)
- 编写类的属性(考虑修饰符、属性类型、属性名、初始化值)
- 编写类的方法(考虑修饰符、返回值类型、方法名、形参等)
代码范例:
//1.定义类(考虑修饰符、类名)
class Person{
//2.编写类的属性(考虑修饰符、属性类型、属性名、初始化值)
String name;
int age = 1;
boolean isMale;
//3.编写类的方法(考虑修饰符、返回值类型、方法名、形参等)
public void eat(){
System.out.println("人可以吃饭");
}
public void sleep(){
System.out.println("人可以睡觉");
}
public void talk(String language){
System.out.println("人可以说话,使用的是:" + language);
}
}
3.2 对象的创建和使用
如果想要使用2.3.1节中创建的类,首先需要将2.3.1中的类实例化,也即创建类的对象。实例化完成以后,才能访问其成员。
创建对象语法格式:
类名 对象名 = new 类名();
访问对象成员(包括属性和方法)语法格式:
对象名.对象成员;
代码范例:
public class PersonTest {
public static void main(String[] args) {
//创建Person类的对象
Person p1 = new Person();
//Scanner scanner = new Scanner(System.in);
//调用对象的结构:属性、方法
//调用属性:“对象.属性”
p1.name = "Tom";
p1.isMale = true;
System.out.println(p1.name);
//调用方法:“对象.方法”
p1.eat();
p1.sleep();
p1.talk("Chinese");
}
}
如果创建了一个类的多个对象,对于类中定义的属性,每个对象都拥有独立的一套副本属性(非static的)且互不干扰,意味着:如果我们修改一个对象的属性a,则不影响另外一个对象属性a的值。上述代码新创建一个p2对象:
Person p2 = new Person();
System.out.println(p2.name);//null
System.out.println(p2.isMale);//false
//将p1变量保存的对象地址值赋给p3,导致p1和p3指向了堆空间中的同一个对象实体。
Person p3 = p1;
System.out.println(p3.name);//Tom
p3.age = 10;
System.out.println(p1.age);//10
类的访问机制:
- 在一个类中的访问机制:类中的方法可以直接访问类中的成员变量。 (例外:static方法访问非static,编译不通过。)
- 在不同类中的访问机制:先创建要访问类的对象,再用对象访问类中定义的成员。
四、对象的内存解析
对于以下代码:
class Car{
String color = "red";
int num = 4;
void show(){
System.out.println("color="+color+"..num="+num);
}
}
class CarTest {
public static void main(String[] args) {
//①
Car c1 = new Car(); //建立对象c1
Car c2 = new Car(); //建立对象c2
//②
c1.color = "blue"; //对对象的属性进行修改
c1.show(); //使用对象的方法
c2.show();
}
}
①时内存状态:
②时内存状态:
说明:
- 引用类型的变量,只可能存储两类值:null 或 地址值(含变量的类型)。
- 字符串常量其实是存放在字符串常量池中,此处做简单处理。