目录
4.Java虚拟机栈(Java Virtual Machine Stacks):
5.程序计数器(Program Counter Register):
一.对象和类的区别
在Java编程中,对象和类是两个基本概念,它们有着明显的区别。
类(Class)可以被视为一种蓝图或模板,用于描述具有相同属性和行为的对象的集合。类定义了对象的状态(即属性或数据成员)和行为(即方法或函数)。类是一种抽象的数据类型,它只存在于程序中,并不直接对应于现实世界的任何实体。例如,“人”这个类可以包含许多属性,如姓名、年龄、性别等,以及行为,如说话、行走等。
对象(Object)则是类的实例化,是现实世界中的实体在计算机世界中的表示。对象是类的具体实例,具有类的所有属性和行为。每个对象都有自己独特的状态和行为,可以与其他对象进行交互。例如,在程序中创建一个名为“张三”的“人”对象,这个对象就会具有“人”类所定义的所有属性和行为,并且可以有自己的独特属性值(如姓名为“张三”)。
简而言之,类是对一类事物的抽象描述,而对象则是这个抽象描述的具体实现。类定义了对象的结构和行为,而对象则是类的具体实例,具有自己的状态和行为。在Java中,使用“class”关键字来定义类,使用“new”关键字来创建对象。
二.属性
在Java面向对象编程中,属性(Attributes)是类的重要组成部分,也被称为类的成员变量或字段。属性用于描述对象的状态或特征,是对象数据的存储单位。
以下是关于Java面向对象编程属性的几个要点:
定义属性:
在Java类中,属性通常定义在类的内部,位于方法之外。它们可以是任何有效的数据类型,包括基本数据类型(如int, double, char等)和引用数据类型(如String, 数组, 其他类等)。
public class Person {
// 定义属性
private String name;
private int age;
private boolean isStudent;
}
访问修饰符:
属性可以具有访问修饰符(如public, private, protected, 默认(无修饰符)),这些修饰符决定了属性对于其他类的可见性和可访问性。属性封装:
为了提高数据的安全性和保护对象的内部状态,通常将属性声明为私有(private),并提供公共的getter和setter方法来访问和修改这些属性。
public class Person {
private String name;
// Getter方法
public String getName() {
return name;
}
// Setter方法
public void setName(String name) {
this.name = name;
}
}
属性初始化:
属性可以在声明时初始化,也可以在构造方法中进行初始化。
public class Person {
private String name = "Anonymous"; // 声明时初始化
private int age;
public Person(int age) {
this.age = age; // 构造方法中初始化
}
}
静态属性:
属性也可以是静态的(static),这意味着该属性属于类本身,而不是类的任何特定实例。静态属性通常用于存储与类相关但不依赖于对象状态的信息。
public class Person {
private static int totalPeople = 0; // 静态属性
// ... 其他属性和方法
}
属性与实例变量:
在Java中,类的属性通常被称为实例变量,因为它们与类的实例(即对象)相关联。每个对象都有其自己的属性副本。
属性与局部变量:
与在方法内部定义的局部变量不同,属性是类的成员,而局部变量只存在于方法执行期间。
了解和正确使用属性是Java面向对象编程的重要组成部分。通过封装属性并提供适当的访问方法,可以确保数据的完整性和安全性,同时提高代码的可维护性和可读性。
三.方法
在Java面向对象编程中,方法(Method)是类的重要组成部分,它们定义了对象的行为和功能。方法是一种特殊的函数,用于执行特定的任务或计算,并且可以操作对象的属性(即成员变量)。
以下是关于Java方法的一些要点:
定义方法:
方法定义在类的内部,通常位于类的底部。方法的定义包括方法名、参数列表、返回类型和方法体。方法体包含了执行特定任务所需的Java代码。
public class Person {
private String name;
private int age;
// 定义一个方法
public void introduce() {
System.out.println("My name is " + name + " and I am " + age + " years old.");
}
}
方法签名:
方法的名称和参数列表共同构成了方法签名,它唯一地标识了一个方法。方法的返回类型不包含在方法签名中。
访问修饰符:
方法可以有访问修饰符(如public, private, protected, 默认(无修饰符)),它们决定了方法对于其他类的可见性和可访问性。
返回类型:
方法可以有一个返回类型,这指定了方法执行后返回给调用者的数据类型。如果方法不返回任何值,则使用关键字void。
参数:
方法可以接受参数,这些参数在方法调用时传递,并在方法内部使用。参数可以是基本数据类型或对象类型,也可以有多个参数。
静态方法:
使用static关键字声明的方法称为静态方法。静态方法属于类本身,而不是类的实例,因此可以在没有创建对象的情况下调用。静态方法通常用于执行与类相关但不依赖于对象状态的操作。
实例方法:
非静态方法称为实例方法。实例方法属于类的实例,并且需要通过对象来调用。实例方法可以访问和修改对象的属性。
方法重载(Overloading):
在同一个类中,可以定义多个名称相同但参数列表不同的方法,这称为方法重载。Java编译器根据参数的类型和数量来确定调用哪个方法。
方法重写(Overriding):
在继承关系中,子类可以定义与父类中名称和参数列表相同的方法,这称为方法重写。子类重写的方法具有与父类方法相同的返回类型,并且通常用于提供特定的实现细节。
了解和使用方法是Java面向对象编程的关键部分。通过定义适当的方法,可以创建功能强大且可维护的代码,以响应用户需求并执行各种计算任务。
四.构造方法
构造方法(Constructor)是一种特殊的方法,主要用于在创建对象时初始化对象。在Java等面向对象的编程语言中,每个类都有一个或多个构造方法。
以下是关于构造方法的一些要点:
定义:
构造方法是一种特殊的方法,其名称与类的名称完全相同,并且没有返回类型,甚至连void也没有。作用:
构造方法用于创建并初始化一个类的对象。
当使用new关键字创建对象时,构造方法会被自动调用。特点:
构造方法的名称必须与类的名称完全相同。
构造方法没有返回类型,即使不使用void关键字。
构造方法主要用于初始化对象的状态。
构造方法不能被static、final、synchronized、abstract和native修饰。
类型:
无参构造方法:不接受任何参数的构造方法。
有参构造方法:接受一个或多个参数的构造方法。
默认构造方法:
如果一个类没有定义任何构造方法,那么Java编译器会为其提供一个默认的无参构造方法。但是,一旦我们在类中定义了至少一个构造方法,编译器就不会再自动提供默认构造方法了。
重载:
构造方法可以被重载,这意味着一个类可以有多个构造方法,只要它们的参数列表不同。
调用:
构造方法的调用是在创建对象时自动进行的,使用new关键字和类名来调用。例如,MyClass obj = new MyClass(); 这行代码会调用MyClass类的无参构造方法。
继承:
子类在创建对象时,首先会调用父类的构造方法(通过super关键字),然后再执行自己的构造方法。
构造方法的主要目的是确保对象在被使用之前被正确地初始化。通过定义不同的构造方法,我们可以为类的实例化提供不同的初始化方式。
五.JVM内存模型图
JVM(Java虚拟机)内存模型主要包含以下几个部分:
1.方法区(Method Area):
也被称为元数据区(Metaspace),它存储了已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。
2.堆区(Heap):
这是JVM所管理的最大一块内存区域,几乎所有的对象实例都在这里分配内存。堆区是线程共享的内存区域,它还可以细分为:新生代和老年代。
新生代(Young Generation):新创建的对象首先被分配到这里,并且新生代内存又被分为三部分,Eden区、From Survivor区和To Survivor区。
老年代(Old Generation):存放长期存活的对象。
3.栈区(Stack):
每个线程在创建时都会创建一个虚拟机栈,每一个方法执行的时候都会创建一个栈帧(Stack Frame)用于存储局部变量表、操作数栈、动态链接、方法出口等信息。每一个方法被调用直至执行完成的过程&#