一、面向对象OOP
类class:相同事物的共性的代码描述,所有类是引用数据类型。
对象(实例)instance:类的具体的一个个体的实物。
二、类的定义
在Java中,一个类(Class)是定义对象的蓝图或模板,它包含了描述该类对象状态的数据(属性或字段)以及操作这些数据的方法。
示例:
2-1、对象成员变量的默认初始化值
三、封装
示例:
3-1、private权限修饰符
为了防止出现以上的赋值错误,用private修饰属性。
小结:
四、this关键字
4-1、成员变量、局部变量
1、成员变量
-
定义:成员变量是定义在类中的变量,而不是在方法内部。它们可以是任何类型,包括基本数据类型和引用类型。
-
作用域:成员变量的作用域是整个类体(从声明点开始,直到类结束)。但是,它们的访问可能受到访问修饰符(如public、protected、private和默认(无修饰符))的限制。
-
生命周期:成员变量的生命周期与对象实例的生命周期相同。当对象被创建时,成员变量被分配内存并初始化(如果未显式初始化,则自动初始化为默认值)。当对象被销毁时,成员变量所占用的内存也会被释放。
-
访问方式:成员变量可以通过对象实例来访问(对于非静态成员变量)或通过类名来访问(对于静态成员变量)。
2、局部变量
-
定义:局部变量是定义在方法或代码块(如if语句、循环等)内部的变量。它们仅在定义它们的方法或代码块内部可见和可用。
-
作用域:局部变量的作用域是从其声明点开始,到包含它的代码块结束。一旦离开这个作用域,局部变量就不能再被访问。
-
生命周期:局部变量的生命周期是从其被声明并初始化时开始,到包含它的代码块执行完毕时结束。一旦局部变量所在的代码块执行完毕,局部变量所占用的内存就会被释放。
-
访问方式:局部变量只能在声明它们的代码块内部被访问。
-
初始化:局部变量在使用前必须显式初始化,否则编译器会报错。这是因为局部变量存储在栈上,而栈上的内存是自动管理的,如果不初始化,编译器无法确定其初始值。
3、小结
4-2、就近原则(变量遮蔽)
如果一个局部变量(或参数)的名称与类中的一个成员变量相同,那么在这个局部变量被声明的代码块中,成员变量会被遮蔽。
class Test {
int x = 10; // 成员变量
void method() {
int x = 20; // 局部变量,遮蔽了成员变量x
System.out.println(x); // 输出20,因为局部变量x在作用域上更近
}
}
4-3、this的作用
this
关键字是一个非常重要的引用变量,它指向当前对象的实例。this可以区别成员变量和局部变量,当局部变量与成员变量同名时,访问当前对象的成员变量。
若是想要访问被遮蔽的成员变量,需要用this关键字。
五、构造方法(构造器、构造函数)
作用:在创建对象的时候给成员变量进行赋值的。
修饰符 类型(参数列表)
{
// 方法体
}
一个类可以有多个构造方法,只要它们的参数列表不同(这称为方法重载)。
【注意】默认构造方法:
如果类中没有明确声明任何构造方法,则Java编译器会自动提供一个无参的默认构造方法。但是,如果类中定义了至少一个构造方法(无论是否有参数),则不会自动生成默认构造方法。
若是自己重载了构造方法,一般需要把空参构造也创建出来!!!
示例:
public class Person {
// 成员变量
String name;
int age;
// 无参构造方法
public Person() {
this.name = "Unknown";
this.age = 0;
}
// 有参构造方法
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// 另一个有参构造方法,参数列表不同,实现了构造方法重载
public Person(String name) {
this.name = name;
this.age = -1; // 假设-1表示年龄未知
}
// 成员方法(示例)
public void display() {
System.out.println("Name: " + name + ", Age: " + age);
}
public static void main(String[] args) {
// 使用无参构造方法创建对象
Person p1 = new Person();
p1.display(); // 输出: Name: Unknown, Age: 0
// 使用有参构造方法创建对象
Person p2 = new Person("Alice", 30);
p2.display(); // 输出: Name: Alice, Age: 30
// 使用另一个有参构造方法创建对象
Person p3 = new Person("Bob");
p3.display(); // 输出: Name: Bob, Age: -1
}
}
小结:
六、javabean类、pojo类
6-1、javabean类
JavaBean类是一种遵循特定规范的Java类,JavaBean类具有以下几个核心特点:
-
公共类与无参构造方法:JavaBean类必须是
public
类,并且提供一个无参数的公共构造方法(public
constructor)。这个无参构造方法允许在不指定任何参数的情况下创建类的实例。 -
属性封装:JavaBean的属性(即类的成员变量)必须是私有的(
private
),以确保封装性。这意味着类的内部状态不能直接被外部访问或修改。为了访问和修改这些私有属性,JavaBean类必须提供公共的getter和setter方法。这些方法遵循特定的命名规则,例如,对于名为name
的属性,getter方法命名为getName()
,setter方法命名为setName(String name)
。 -
可重用性与可维护性:通过封装数据和相关的操作方法,JavaBean提供了一种可重用且易于维护的组件。这使得JavaBean在Java EE和其他Java应用程序框架中非常受欢迎,因为它们可以被轻松地插入到其他应用程序中,以实现特定的功能。
-
序列化(可选):虽然序列化不是JavaBean的必要条件,但许多JavaBean实现了
Serializable
接口,以便它们可以被序列化到磁盘或通过网络发送。这对于分布式应用程序和需要持久化存储数据的应用程序非常有用。 -
命名规范:JavaBean的命名遵循一定的规范,例如,包名全部小写,类名每个单词首字母大写(驼峰命名法),属性名和方法名也遵循类似的命名规则。
6-2、pojo类
POJO(Plain Old Java Object)类指的是简单的Java对象,它们不依赖于任何特定的框架或技术,也不继承任何特殊的类或实现任何特殊的接口。
POJO类通常只包含一些属性和对应的getter/setter方法,用于存储和访问数据,而不包含任何业务逻辑。
在MVC(模型-视图-控制器)架构中,POJO类常用作模型层的一部分,用于表示应用程序的数据。
POJO与JavaBean在概念上有些相似,但JavaBean通常要求实现Serializable
接口和提供无参构造方法,而POJO则没有这些要求。因此,可以认为JavaBean是POJO的一个特例或子集。
七、对象内存图
【回顾】:
方法区:
当要运行一个类的时候,这个类的字节码文件(xxxx.class)会被加载到方法区中临时存贮。
7-1、一个对象的内存图
当main()方法执行结束后,main()方法会从栈内存中出去,main()方法中的变量也就没有了!
栈中变量指向的堆内存的箭头也就没有了。
所以,堆内存中若是没有变量指向这个空间,这个空间也会在堆内存中消失,变成垃圾!
八、基本数据类型 VS 引用数据类型
8-1、基本数据类型
8-2、引用数据类型
8-3、小结
九、this的内存原理
this的本质:表示所在方法调用者的地址值。