Java之类,对象,构造方法

news2024/9/24 0:27:07

类和对象:

类(Class)

类是一个模板或蓝图,它定义了一组具有相同属性(数据)和方法(行为)的对象的特征。可以把类比作建筑的设计图纸,它描述了建筑将会有哪些部分(比如房间、门窗)和功能(比如供暖、照明)。

在 Java 中,类通过关键字 class 定义,它包含了两大部分:

属性:这些是类中定义的变量,用于存储对象的状态或数据。

方法(也叫做成员函数):这些是类中定义的函数,用于定义对象可以执行的操作。

public class Car {
    // 属性
    String color;
    int year;

    // 方法
    void accelerate() {
        System.out.println("Car is accelerating.");
    }
}

 对象(Object)

对象是类的一个实例。如果说类是设计图纸,那么对象就是根据这个图纸建造的实际建筑。每个对象都拥有类中定义的属性和方法的具体实例。

创建类的实例(对象)时,每个对象都会拥有独立的属性集,这意味着每个对象的属性可以有不同的值,但所有对象都会共享相同的方法。

public class TestCar {
    public static void main(String[] args) {
        // 创建 Car 类的对象
        Car myCar = new Car();
        
        // 访问属性并赋值
        myCar.color = "Red";
        myCar.year = 2021;
        
        // 调用方法
        myCar.accelerate();
    }
}

构造方法:

构造方法是一种特殊类型的方法,在 Java 中用于初始化新创建的对象。构造方法的主要特点是它与类同名并且没有返回类型,不仅仅是没有 void,而是连返回类型声明都没有。

 //默认构造方法
    public Student(){
        System.out.println("默认构造方法");
    }

    //含参数的构造方法
    public Student(String name, int age){
        this.name = name;
        this.age = age;
    }

在 Java 中,如果一个类没有显式定义任何构造方法,编译器会为这个类提供一个默认的无参数构造方法。但如果你定义了至少一个构造方法(无论是有参数还是无参数的),编译器就不会提供默认的构造方法。因此,如果你想让你的类在不提供任何特定参数的情况下也能创建对象,你需要显式定义一个无参数的构造方法。 

构造方法的重载:

构造方法重载的规则:

  1. 参数数量不同:每个构造方法的参数个数要不同。
  2. 参数类型不同:构造方法的参数类型要不同,即使参数数量相同。
  3. 参数顺序不同:即使参数的类型相同,但顺序不同,也可以构成重载
class Person {
    String name;
    int age;
    
    // 无参构造方法
    public Person() {
        this.name = "Unknown";
        this.age = 0;
    }
    
    // 带一个参数的构造方法
    public Person(String name) {
        this.name = name;
        this.age = 0;
    }
    
    // 带两个参数的构造方法
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    
    // 显示信息的方法
    public void display() {
        System.out.println("Name: " + name + ", Age: " + age);
    }
}

public class Main {
    public static void main(String[] args) {
        Person p1 = new Person();               // 使用无参构造方法
        Person p2 = new Person("Alice");        // 使用带一个参数的构造方法
        Person p3 = new Person("Bob", 25);      // 使用带两个参数的构造方法

        p1.display();
        p2.display();
        p3.display();
    }
}

输出:

Name: Unknown, Age: 0
Name: Alice, Age: 0
Name: Bob, Age: 25

 通过构造方式的重载,可以通过多种方法创建对象

标准的JavaBean类:

package day2;

public class Student {
    //private私有属性,表示只在这个类里面可以调用
    //set方法:给成员变量赋值
    //get方法:对外提供成员变量的值
    //this:表示当前方法调用者的地址
    private String name;
    public void setName(String name){
        this.name  = name;
    }
    public String getName(){
        return this.name;
    }
    private int age;
    public void setAge(int age){
        if(age >= 6 ) this.age = age;
    }
    public int getAge(){
        return this.age;
    }

    //构造方法的名字应该和对象名字相同
    //构造方法没有返回值,所以不需要写void这些返回类型。
    //当不存在构造方法是,系统会自动生成默认构造方法,
    // 一旦我们手写了构造方法,系统也不会生成默认方构造方法了。

    //默认构造方法
    public Student(){
        System.out.println("默认构造方法");
    }

    //含参数的构造方法
    public Student(String name, int age){
        this.name = name;
        this.age = age;
    }
    //其他行为。
}

在主方法中创建对象:

package day2;

public class StudentTest {
    public static void main(String[] args) {
        Student s1 = new Student();
        s1.setName("李四");
        s1.setAge(20);
        //使用有参数的构造方法,就不需要调用set方法了
        Student s2 = new Student("张三",24);

    }
}

this关键字:

理解堆与栈:

1. 栈(Stack)

栈是一种用于管理方法调用和局部变量的内存区域,它遵循后进先出(LIFO)的原则。每次调用一个方法时,都会在栈中为该方法分配一个新的栈帧,存储该方法的局部变量、方法参数和返回地址等。

特点:
  • 快速访问:栈内存的分配和回收非常快,因为它是直接由操作系统管理的,每个线程都有自己的栈。
  • 局部变量存储:局部变量和方法参数都存储在栈中。当方法调用结束时,栈帧会被自动销毁,所有局部变量都会被回收。
  • 线程隔离:每个线程都有自己的栈,因此线程之间的栈是相互独立的。
  • 空间有限:栈的大小通常较小(可以在 JVM 启动时指定),并且栈溢出(StackOverflowError)通常是由递归或深度嵌套方法引起的。
示例:
public void methodA() {
    int x = 10;  // x 是一个局部变量,存储在栈中
    methodB();
}

public void methodB() {
    int y = 20;  // y 是一个局部变量,存储在栈中
}

在这个例子中,当 methodA 被调用时,它的局部变量 x 存储在栈中。当 methodB 被调用时,y 也会被存储在栈中。

2. 堆(Heap)

堆是一个全局的内存区域,用于存储所有的对象。JVM 在堆上分配对象内存,并由垃圾收集器(Garbage Collector)负责管理堆上的对象的生命周期。

特点:
  • 对象存储Java 中所有通过 new 关键字创建的对象都存储在堆中。无论是局部变量还是全局变量,只要是对象引用,都指向堆中的实际对象。
  • 共享内存:堆是线程共享的,所有线程可以访问堆中的对象。因此需要进行同步管理,以避免线程安全问题。
  • 垃圾回收:对象的分配和回收由 JVM 的垃圾收集器自动管理。垃圾回收会扫描堆中的无用对象并回收内存。
  • 存储时间长:与栈不同,堆中的对象生命周期较长,直到没有任何引用指向该对象时,它才会被垃圾回收。
示例:
public class Example {
    int[] numbers = new int[10];  // numbers 数组存储在堆中
}

3. 堆与栈的协同工作

栈中的局部变量(比如引用变量)可以指向堆中的对象。比如,在方法内创建的对象,它们的引用会存储在栈中,而对象本身存储在堆中。当方法结束时,栈上的引用被销毁,但堆中的对象仍然存在,直到垃圾收集器回收它。

示例:
public class Main {
    public static void main(String[] args) {
        Person person = new Person();  // person 引用存储在栈中,但对象在堆中
    }
}

在这个例子中,person 引用变量在栈中,而 Person 对象存储在堆中。

总结

  • :存储局部变量和方法调用信息,速度快,但空间有限。
  • :存储所有对象,由垃圾收集器管理,空间大但访问速度相对较慢

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2158881.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

初学者怎么入门大语言模型(LLM)?看完这篇你就懂了!

当前2024年,LLM领域发展日新月异,很多新的实用技术层出不穷,个人认为要跟上LLM的发展,需要掌握以下内容,并需要不断地跟踪学习。 入门LLM前置基础 深度学习基础知识:推荐李宏毅的深度学习课程Python和num…

数据结构2——单链表

目录 1.链表 1.1链表的概念及结构 1.2 链表的分类 ​编辑2.无头单链表的实现 1. 节点 2.遍历链表 3.动态增加新节点 4.查找(修改) 5.插入 5.1 尾插 5.2 头插 5.3 在pos之前插入x 5.4 在pos之后插入x 6.删除 6.1 尾删 6.2 头删 6.3 删除…

DPDK 简易应用开发之路 4:基于Pipeline模型的DNS服务器

本机环境为 Ubuntu20.04 ,dpdk-stable-20.11.10 使用scapy和wireshark发包抓包分析结果 完整代码见:github Pipeline模型 DPDK Pipeline模型是基于Data Plane Development Kit(DPDK)的高性能数据包处理框架。它通过将数据流分为多…

基于SpringBoot+Vue+MySQL的旅游推荐管理系统

系统展示 用户前台界面 管理员后台界面 系统背景 随着社会的快速发展和人民生活水平的显著提高,旅游已成为人们休闲娱乐的重要方式。然而,面对海量的旅游信息和多样化的旅游需求,如何高效地管理和推荐旅游资源成为了一个亟待解决的问题。因此…

学习记录:js算法(四十三):翻转二叉树

文章目录 翻转二叉树我的思路网上思路递归栈 总结 翻转二叉树 给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点 图一: 图二: 示例 1:(如图一) 输入:root [4,2,7,1…

大模型价格战,打到了负毛利,卷or不卷?

国产大模型淘汰赛在加速。这轮淘汰赛会持续一两年,只有少数真正具备实力的基础模型企业能继续活下去 中国市场的大模型价格战已经打了近半年。这轮价格战已经打到了负毛利,而且暂时没有停止迹象。头部云厂商仍在酝酿新一轮降价。这轮降价会在今年9月下旬…

视频单目标跟踪研究

由于对视频单目标跟踪并不是很熟悉,所以首先得对该领域有个大致的了解。 视频目标跟踪是计算机视觉领域重要的基础性研究问题之一,是指在视频序列第一帧指定目标 后,在后续帧持续跟踪目标,即利用边界框(通常用矩形框表…

printf 命令:格式化输出

一、命令简介 ​printf​ 命令在 Linux 系统中用于格式化并打印字符串到标准输出。它是 C 语言中 printf ​函数的命令行版本,因此其格式化选项与 C 语言中的非常相似。 相关命令: echo:通常使用 echo,它比较简单。printf&…

你们用过微信CRM管理系统吗?

微信CRM管理系统是近年来流行的管理软件,在市场上得到了很高的认可。许多企业正在应用微信CRM管理系统,那系统具体有些什么功能呢? 1、聚合聊天,可以管理多个微信号 2、批量多号自动加好友任务,设置好时间间隔以及加人…

《论软件系统架构风格》写作框架,软考高级系统架构设计师

论文真题 系统架构风格(System Architecture Style)是描述某一特定应用领域中系统组织方式的惯用模式。架构风格定义了一个词汇表和一组约束,词汇表中包含一些构件和连接件类型,而这组约束指出系统是如何将这些构件和连接件组合起…

李沐对大模型趋势的几点判断,小模型爆发了!

李沐是上海交通大学 2011 届计算机科学与工程系本硕系友。他曾担任亚马逊资深首席科学家,加州大学伯克利分校和斯坦福大学的访问助理教授,是前 Marianas Labs 联合创始人,深度学习框架 Apache MXNet 的创始人之一。目前是 BosonAI 联合创始人…

C++之STL—string容器

本质:类 class 封装了很多方法:查找find,拷贝copy,删除delete 替换replace,插入insert 构造函数 赋值操作 assign: 字符串拼接 + append: string查找和替换 没查找到,po…

【刷题2—滑动窗口】最大连续1的个数lll、将x减到0的最小操作数

目录 一、最大连续1的个数lll二、将x减到0的最小操作数 一、最大连续1的个数lll 题目: 思路: 问题转换为:找到一个最长子数组,这个数组里面0的个数不能超过k个 定义一个变量count,来记录0的个数,进窗口、…

时序预测 | Python实现KAN+LSTM时间序列预测

时序预测 | Python实现KAN+LSTM时间序列预测 目录 时序预测 | Python实现KAN+LSTM时间序列预测预测效果基本介绍程序设计预测效果 基本介绍 时序预测 | KAN+LSTM时间序列预测(Python) KAN作为这两年最新提出的机制,目前很少人用,很适合作为时间序列预测的创新点,可以结合…

【重学 MySQL】三十八、group by的使用

【重学 MySQL】三十八、group by的使用 基本语法示例示例 1: 计算每个部门的员工数示例 2: 计算每个部门的平均工资示例 3: 结合 WHERE 子句 WITH ROLLUP基本用法示例注意事项 注意事项 GROUP BY 是 SQL 中一个非常重要的子句,它通常与聚合函数(如 COUNT…

MySQL和SQL的区别简单了解和分析使用以及个人总结

MySQL的基本了解 运行环境,这是一种后台运行的服务,想要使用必须打开后台服务,这个后台服务启动的名字是在安装中定义的如下图(个人定义MySQL88)区分大小写图片来源 可以使用命令net start/stop 服务名,开…

实验十八:IIC-EEPROM实验

这个实验比较复杂,是目前第一个多文件项目 KEY1-4:P3^0-P3^3 IIC_SCL=P2^1; IIC_SDA=P2^0; //定义数码管位选信号控制脚 LSA=P2^2; LSB=P2^3; LSC=P2^4; 代码 main.c #include "public.h" #in

常见汽车零部件ASIL等级示例

ASIL(Automotive Safety Integrity Level,汽车安全完整性等级)评级系统是ISO 26262标准中定义的一套风险分类体系,用于评估道路车辆中电子电气系统(E/E系统)功能安全的风险程度,并确保这些系统在…

Linux相关概念和重要知识点(6)(make、makefile、gdb)

1.make、makefile (1)什么是make、makefile? 在我们写完代码后,要编译运行,如果有多个.c文件就需要每次都自己用gcc -o来处理,这十分麻烦。当我们想要自定义多个文件的处理时,我们会浪费很多时…

MatrixOne助力一道创新打造高性能智能制造AIOT系统

客户简介 深圳一道创新(ETAO Innovation)成立于2012年,是一家创新型软件及信息技术服务商,致力于制造戏份行业—电子制造业的数字转型服务,构建万物互联的智能工程。一道创新致力于把先进的软件系统、数字平台、人工智…