当前位置: 首页 > news >正文

JAVA面向对象——对象和类的基本语法

JAVA面向对象——对象和类的基本语法

一、面向对象编程基础

1. 程序中的数据存储方式
  • 基本类型:变量(如 int max = 15;)。
  • 数据结构:数组(一维/二维)、对象(特殊数据结构,用于存储复杂事物数据)。
2. 对象的本质
  • 定义:对象是一种特殊的数据结构,用于封装事物的属性(数据),代表现实中的事物(如“赵丽颖”对象包含姓名、年龄、身高、体重等属性)。
  • 创建方式:通过类(模板/设计图)使用 new 关键字创建,每 new 一次生成一个新对象。
    Star s1 = new Star(); // 创建对象
    s1.name = "赵丽颖"; // 设置属性
    

二、类的基本语法

1. 类的定义
  • 作用:定义对象的模板,包含属性(成员变量)和行为(成员方法)。
  • 语法结构
    public class 类名 {// 成员变量(属性)数据类型 变量名; // 如 String name; int age;// 成员方法(行为)public void 方法名() {// 方法逻辑}
    }
    
2. 对象的使用步骤
  1. 定义类:设计对象的属性和方法(如 Star 类)。
  2. 创建对象:使用 new 关键字实例化对象(如 Star s1 = new Star();)。
  3. 操作对象:通过对象名访问属性和方法(如 s1.name = "赵丽颖";)。

三、核心概念解析

1. 构造器(Constructor)
  • 作用:创建对象时初始化成员变量。
  • 特点
    • 与类同名,无返回值类型声明。
    • 默认构造器:若未显式定义构造器,系统自动生成无参构造器。
    • 自定义构造器:若定义有参构造器,默认无参构造器会被覆盖,需手动添加无参构造器以保留。
  • 语法示例
    public class Student {private String name;private int age;// 无参构造器public Student() {}// 有参构造器public Student(String name, int age) {this.name = name;this.age = age;}
    }
    
2. this 关键字
  • 作用
    • 指代当前对象,哪个对象调用方法,this 就指向哪个对象。
    • 解决成员变量与方法参数/局部变量同名时的命名冲突问题。
  • 示例
    public class Student {private String name;public void setName(String name) { // 参数名与成员变量同名this.name = name; // 通过 this 访问成员变量}
    }
    
3. 封装(Encapsulation)
  • 定义:面向对象三大特征之一,将数据(成员变量)和操作数据的方法封装在类中,通过控制访问权限实现“合理隐藏,合理暴露”。
  • 实现方式
    • 隐藏属性:用 private 修饰成员变量,禁止外部直接访问。
    • 暴露方法:用 public 修饰 getter/setter 方法,用于读写属性。
  • 示例
    public class Student {private String name; // 私有属性// getter 方法(获取属性)public String getName() {return name;}// setter 方法(设置属性)public void setName(String name) {this.name = name;}
    }
    
4. 实体类(Javabean)
  • 定义:一种符合特定规范的类,用于存储数据,数据与业务逻辑分离。
  • 规范要求
    1. 所有成员变量 private 修饰,提供 publicgetter/setter 方法。
    2. 必须包含无参构造器,有参构造器可选。
  • 应用场景:在软件开发中用于封装数据(如数据库表中的记录),便于数据传输和存储。

四、static 关键字

1. static 修饰成员变量(静态变量/类变量)
  • 特点
    • 属于类,而非单个对象,内存中仅存储一份,被所有对象共享。
    • 访问方式:类名.静态变量(推荐)或 对象名.静态变量(不推荐)。
  • 示例
    public class Student {public static int totalStudents; // 静态变量,记录学生总数private String name;public Student() {totalStudents++; // 每次创建对象时总数加 1}
    }
    
2. static 修饰成员方法(静态方法/类方法)
  • 特点
    • 属于类,可通过 类名.方法名 直接调用,无需创建对象。
    • 限制:静态方法中不能直接访问实例成员(实例变量、实例方法),只能访问静态成员。
  • 应用场景
    • 工具类设计(如 Math 类、自定义的 StringUtils),提供通用功能,避免对象创建开销。
    • 主方法 main 是静态方法,程序入口需直接调用。
  • 示例
    public class Utils {// 静态方法:计算两数之和public static int add(int a, int b) {return a + b;}
    }
    // 调用方式:Utils.add(1, 2);
    
3. 静态方法与实例方法的区别
特征静态方法实例方法
所属对象
调用方式类名.方法名(推荐)对象名.方法名
能否访问静态成员
能否访问实例成员不能
是否存在 this 关键字是(指向当前对象)

五、内存模型(详细解析)

Java程序运行时的内存分配遵循特定的模型,主要分为 栈内存(Stack Memory)堆内存(Heap Memory)方法区(Method Area)(JDK 8及之后称为 元空间 Metaspace)。理解这三部分的作用和数据存储机制,对掌握对象创建、变量作用域及内存管理至关重要。

1. 栈内存(Stack Memory)

作用

  • 存储局部变量(方法内定义的变量、方法参数)和对象引用(如 Star s1 中的变量名 s1)。
  • 遵循**先进后出(LIFO)**的栈结构,用于管理方法的调用和执行顺序。

特点

  • 线程私有:每个线程拥有独立的栈空间,线程结束后栈内存自动释放。
  • 存储内容
    • 基本数据类型的局部变量(如 int age = 18; 中的 age)。
    • 对象引用变量(存储对象在堆内存中的地址,如 s1 指向 new Star() 的地址)。
  • 内存大小受限:栈的大小由JVM启动参数配置(默认较小,如1MB),若方法嵌套调用过深易引发 栈溢出(StackOverflowError)

示例

public class Test {public static void main(String[] args) {Star s1 = new Star(); // s1 是栈内存中的对象引用,指向堆中的 Star 对象int num = 10; // num 是栈内存中的基本类型变量print(s1, num); // 调用方法时,参数 s1 和 num 压入栈}public static void print(Star s, int n) {// s 和 n 是栈内存中的局部变量}
}
2. 堆内存(Heap Memory)

作用

  • 存储对象实例数组,是对象创建的唯一区域(通过 new 关键字分配内存)。
  • 对象的成员变量(属性)在此分配空间并存储具体数据(如 s1.name = "赵丽颖" 中的 name 值)。

特点

  • 线程共享:所有线程均可访问堆内存中的对象。
  • 动态分配:内存分配灵活,大小由JVM动态管理(可通过 -Xms-Xmx 参数调整)。
  • 垃圾回收(GC):JVM定期回收不再被引用的对象,避免内存泄漏。
  • 存储内容
    • 对象的实例数据(如 Star 对象的 nameage 等属性值)。
    • 数组的元素(如 int[] arr = {1, 2, 3}; 中的数组元素)。

示例

Star s1 = new Star(); // 堆内存中创建 Star 对象,存储属性值
s1.name = "赵丽颖"; // "赵丽颖" 存储在堆中对象的 name 属性里
s1.age = 36; // 36 存储在堆中对象的 age 属性里
  • 内存地址:堆中的对象有唯一的内存地址(如 0x15aeb7ab),栈中的引用变量指向该地址。
3. 方法区(Method Area)

作用

  • 存储类的元数据(字节码文件 .class)、静态变量(static)常量(final)方法定义(如方法名、字节码指令)。
  • 属于线程共享区域,供全程序访问。

特点(JDK 8及之后)

  • 元空间(Metaspace):方法区的实现由永久代(PermGen)改为元空间,内存分配从本地内存(Native Memory)中划分,避免了永久代的内存溢出问题。
  • 存储内容
    • 类的结构信息(类名、父类、接口、成员变量和方法的定义)。
    • 静态变量(如 public static int totalStudents;)。
    • 字面量(如字符串常量 "赵丽颖")和符号引用。
    • 方法的字节码指令(如 printTotalScore() 方法的执行逻辑)。

示例

public class Star {static String country = "中国"; // 静态变量 country 存储在方法区final double PI = 3.14; // 常量 PI 存储在方法区String name; // 成员变量的定义存储在方法区,值存储在堆中public void printInfo() { // 方法定义存储在方法区System.out.println("姓名:" + name);}
}

六、关键总结

  1. 对象与类的关系:类是模板,对象是实例;通过 new 关键字由类创建对象。
  2. 封装的核心:隐藏属性,暴露接口,保证数据安全性和代码可维护性。
  3. static 的作用:实现类级别的数据和方法共享,常用于工具类和全局数据管理。
  4. 构造器的职责:确保对象创建时成员变量被正确初始化,支持重载以灵活初始化。

相关文章:

  • 第一章走进java世界
  • 数据库实验——备份与恢复
  • JavaScript 深拷贝:从基础到实践的全面指南
  • 2025年- H38-Lc146 --142.环形链表(快慢指针,快2慢1,快1慢1)--Java版
  • 前端流行框架Vue3教程:21. 插槽(3)
  • C语言| 指针变量的初始化
  • 如何测试北斗卫星通讯终端的性能?
  • DEBUG:Lombok 失效
  • C++类与对象--6 特性二:继承
  • std::vector<>.emplace_back
  • flutter设置最大高度,超过最大高度时滑动显示
  • 使用frp内网穿透本地的虚拟机
  • spring event事件(四)内部事件(1)ApplicationReadyEvent
  • 介绍Buildroot
  • 2025ICPC南昌邀请赛题解
  • 记录学习的第三十六天
  • ZYNQ Cache一致性问题解析与实战:从原理到创新优化
  • PEFT简介及微调大模型DeepSeek-R1-Distill-Qwen-1.5B
  • mysql不能聚合之数据清洗逗号
  • 第7天-Python+PyEcharts实现股票分时图实战教程
  • 美媒:鲁比奥称特朗普不出席二十国集团领导人会议
  • 解读|俄方称愿与乌方共同起草和平备忘录,特朗普多轮通话外交有效吗?
  • 商务部就美国商务部调整芯片出口管制有关表述答记者问
  • 世卫大会再次拒绝涉台提案,国台办:民进党当局再遭挫败理所当然
  • 半年不到再换岗:伊春市委常委、政法委书记方春彪任伊春森工集团党委书记
  • 多名幼师殴打女童被行拘后续,盘锦教育局工作人员:该局将专项整治全市幼儿园