Java学习day04

面向对象基础

面向对象

面向对象(Object-Oriented)是一种编程范式和思想,它将现实世界中的对象及其相互关系作为程序的基本构建块,并通过封装、继承和多态等概念来组织和管理代码。

面向对象编程(OOP)的核心思想是将数据(属性)和行为(方法)组合成一个称为对象的实体。每个对象都是类的一个实例,类定义了对象的共同特征和行为。

类(Class)是一种用来定义对象的模板或蓝图。它描述了对象的属性和方法,可以看作是创建对象的一种抽象。

类定义了对象的共同特征和行为。

属性表示对象的状态或数据。

方法定义了对象的行为或操作。

实例:

public class Person {
    // 属性
    private String name;
    private int age;

    // 构造方法
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // 方法
    public void sayHello() {
        System.out.println("Hello, my name is " + name + " and I'm " + age + " years old.");
    }
}

this关键字

在面向对象编程中,关键字 this 代表当前对象的引用。它可以在类的方法和构造函数中使用,用于引用当前正在操作的对象。在成员方法中调用成员变量,默认省略了this关键字。

this 的主要作用有:

  1. 引用当前对象的成员变量:可以使用 this 关键字来引用当前对象的成员变量,以区分成员变量和方法内部的局部变量之间的命名冲突。
  2. 调用当前对象的其他方法:通过 this 关键字,可以在类的方法内部调用当前对象的其他方法。这对于在类内部方法之间进行交互和共享数据非常有用。
  3. 在构造函数中调用其他构造函数:在一个类中,可以定义多个构造函数以支持不同的对象初始化方式。使用 this 关键字可以在一个构造函数中调用同一类中的其他构造函数,以避免代码重复。

成员变量

成员变量(Member Variables)也被称为实例变量(Instance Variables),它们是定义在类中的变量,用于存储对象的状态信息。每个对象都拥有自己的一组成员变量副本,并且可以对其进行读取和修改。成员变量通常使用访问修饰符(如 publicprivateprotected)来控制其可见性和访问权限。

  1. public:被声明为 public 的成员变量可以在任何地方被访问,没有访问限制。
  2. private:被声明为 private 的成员变量只能在声明它的类内部访问,其他类无法直接访问该变量。通常使用公共方法(如 getter 和 setter)来间接访问私有成员变量。
  3. protected:被声明为 protected 的成员变量可以在同一个包内的类和子类中访问,其他包中的类无法直接访问该变量。
  4. 默认(无修饰符):如果没有显式地指定修饰符,成员变量具有默认的访问权限,可以在同一个包内的其他类中访问,但对于不在同一包中的类来说是不可见的。

实例

public class MyClass {
    public int publicVar; //公共的,可从任何地方直接访问
    private int privateVar; //私有的,只能在类内部访问
    protected int protectedVar; //受保护的,可以在同一包内的类和子类中访问
    int defaultVar; //没有显式的修饰符,它具有包私有的访问权限。
}
  • 默认修饰符是包私有的,只能在同一包内的其他类中访问。
  • 受保护修饰符提供更宽松的访问权限,可以在同一包内的其他类和子类中访问。

成员方法

成员方法(Member Methods)是定义在类中的方法,用于表示对象的行为或操作。它们可以访问和操作成员变量,并执行特定的任务。成员方法也可以具有参数和返回值。

修饰符与成员变量相同。

构造方法

当创建一个对象时,构造方法用于初始化该对象。它在对象实例化过程中被调用,负责设置对象的初始状态。

构造方法具有以下特点:

  1. 构造方法的名称必须与类名相同,没有返回类型(包括 void)。
  2. 构造方法可以具有参数,用于接收初始化对象所需的值。
  3. 构造方法可以重载,即在同一个类中可以定义多个具有不同参数的构造方法。
  4. 如果没有显式定义构造方法,编译器会自动生成一个默认的无参构造方法

类的实例化

类的实例化是指根据类的定义创建类的对象(也称为实例)。

格式

ClassName objectName = new ClassName();
//ClassName 是类的名称,objectName 是创建的对象的引用变量。通过 new 关键字创建对象,并将对象的引用赋值给引用变量 objectName。

对象的引用

对象引用是指在编程中用于访问和操作对象的变量或表达式。它存储了对象在内存中的地址或引用,通过引用可以间接地操作和访问对象的属性和方法。

在面向对象编程中,当创建一个对象时,实际上是在内存中为该对象分配了一块存储空间,该空间被称为堆(Heap)。对象引用指向对象在堆中的存储位置,以便在代码中通过引用访问对象。

示例

public class Person {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public void displayInfo() {
        System.out.println("Name: " + name);
        System.out.println("Age: " + age);
    }
}

public class Main {
    public static void main(String[] args) {
        Person person1 = new Person("John", 25);  // 创建Person对象并将引用赋给person1
        Person person2 = person1;  // 将person1的引用赋给person2

        person1.displayInfo();  // 通过person1引用调用对象的方法
        person2.displayInfo();  // 通过person2引用调用对象的方法
    }
}

**注意:**对象引用本身不存储对象的数据,它只是指向对象的指针或地址。多个引用可以指向同一个对象,通过这些引用可以同时访问和操作对象的状态。

创建对象的堆栈分析

对象本身的数据存储在堆(Heap)中,而堆栈中的栈帧仅用于存储对象创建过程中的临时数据和方法的执行上下文。栈帧的创建和销毁是随着方法调用的开始和结束而发生的,而堆中的对象在构造函数执行完毕后仍然存在,并可供其他方法使用。

  • 对象在堆中开辟空间,对象的引用在栈中开辟空间
  • 每new一个新对象,都会在堆中开辟一个对象空间
  • 对象有各自的成员变量,成员变量只有在创建对象时才会被加载初始化

参数传递

参数传递(Parameter passing)是指在方法调用过程中向方法传递数据的过程。

  1. 值传递(Pass by Value):在值传递中,实际参数(调用方法时提供的参数)的值被复制到形式参数(方法定义中声明的参数)中。方法内部对形式参数的修改不会影响实际参数。这意味着方法内部对形式参数的任何更改都不会影响方法外部的实际参数。
  2. 引用传递(Pass by Reference):在引用传递中,实际参数的引用(内存地址)被传递给形式参数。这意味着方法内部对形式参数的修改会影响到方法外部的实际参数,因为它们引用的是同一块内存空间。

示例

public class Main {
    public static void main(String[] args) {
        int value = 10;
        modifyValue(value);  // 值传递
        System.out.println("Value after modification: " + value);

        StringBuilder sb = new StringBuilder("Hello");
        modifyStringBuilder(sb);  // 引用传递
        System.out.println("StringBuilder after modification: " + sb);
    }

    public static void modifyValue(int val) {
        val = 20;  // 修改形式参数
    }

    public static void modifyStringBuilder(StringBuilder builder) {
        builder.append(" World");  // 修改形式参数
    }
}

成员变量与局部变量的区别

作用域:

  • 成员变量的作用域是整个类,它们在类中声明,并且可以被类中的所有方法访问和使用。
  • 局部变量的作用域限定在声明它们的方法、代码块或语句中。它们只能在其所在的作用域内被访问和使用。

声明位置:

  • 成员变量在类中声明,通常位于类的顶部,可以作为类的属性。
  • 局部变量在方法、代码块或语句中声明,通常位于方法的内部或代码块的内部。

生命周期:

  • 成员变量的生命周期与对象的生命周期相同。它们在对象创建时被初始化,并在对象销毁时被销毁。
  • 局部变量的生命周期仅限于其所在的方法、代码块或语句的执行期间。它们在方法、代码块或语句执行完毕后被销毁。

初始值:

  • 成员变量可以有默认初始值,如果没有显式赋值,它们将根据其类型自动初始化为默认值(如数值类型为0,布尔类型为false,引用类型为null)。
  • 局部变量没有默认初始值,必须在使用之前显式赋值。

访问权限:

  • 成员变量可以有不同的访问修饰符(如public、private、protected、默认访问修饰符),控制对它们的访问权限。
  • 局部变量没有访问修饰符,它们的作用域限定了对它们的访问。

使用场景:

  • 成员变量通常用于存储对象的状态和属性,可以在类的多个方法中共享和访问。
  • 局部变量用于存储临时数据和方法内部的计算结果,其作用范围仅限于所在的方法或代码块。

类与对象的关系

  1. 类是对象的模板:类是对象的抽象描述,定义了对象的属性和行为。它描述了对象应该具有的状态(实例变量)和行为(方法)。类可以看作是对象的模板或蓝图,通过类可以创建多个相似的对象。
  2. 对象是类的实例:对象是类的具体实例化结果。当使用类作为模板来创建对象时,会在内存中分配一块空间用于存储对象的数据和状态。每个对象都具有类定义的属性和行为,并且可以独立地进行操作。
  3. 类定义了对象的结构和行为:类为对象提供了结构和行为的定义。在类的定义中,可以声明实例变量来描述对象的状态,还可以定义方法来描述对象的行为。对象通过类的定义获得了具体的结构和行为。
  4. 对象具有独立的状态和行为:每个对象都有自己独立的状态和行为。对象的状态由实例变量的值决定,可以通过访问和修改实例变量来改变对象的状态。对象的行为由方法定义,可以通过调用对象的方法来执行相应的操作。
  5. 类和对象之间的关系是多对一的:一个类可以实例化多个对象,这些对象共享类定义的属性和方法。多个对象可以同时存在,彼此之间相互独立,具有各自的状态和行为。
  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值