Java系列8—对象创建的内存分配和构造方法

2023-11-16

对象的创建

  1. 类和对象的区别
    面向对象【java语言的核心机制,最重要的内容,java语言的特色】
        * 面向过程和面向对象的区别
        -- 面向过程:主要关注点是:实现的具体过程,因果关系
    
    	-- 面向对象:主要关注对象【独立体】能完成哪些功能。
    	    优点:耦合度低,扩展力强。
    	    缺点:前期投入成本较高,需要进行独立体的抽取,大量的系统设计
        
    	-- c语言是纯面向过程的、C++半面向对象、java纯面向对象
    
        * 面向对象的三大特性
        —— 封装
    	—— 继承
    	—— 多态
    	面向对象的分析:OOA
    	面向对象的设计:OOD
    	面向对象的编程:OOP
    
        * 类和对象的概念
          * 什么是类?
             —— 类是一个概念,又名类型,代表了一类事物
    	 —— 在现实世界当中,对象A与对象B具有共同特征,进行抽象总结出的模板
          
          * 对象?
             —— 是实际存在的个体。现实当中实际存在
          
          类——>【实例化】——>对象
    
          对象又被称为实例/instance
    
          对象——>【抽象】——>类
    
          * 一个类主要描述什么信息呢?
          	一个类主要描述的是状态+动作。
        * 类的定义
          语法结构:
          [修饰符列表] class 类名{
          }
    
  2. java虚拟机内存分配
    1、JVM(Java虚拟机)主要包括三块内存空间,分别是:栈内存、堆内存、方法区内存
    
    2、堆内存和方法区内存各有一个,一个线程一个栈内存。
    
    3、方法调用的时候,该方法所需要的的内存空间在栈中分配,称为压栈。方法结束之后,
       该方法所属内存空间释放,称为弹栈。
    
    4、栈中主要存储的是方法体当中的局部变量。
    
    5、方法的代码片段以及整个类的代码片段都被存储在方法区内存当中,在类加载的时候,
       这些代码片段会载入。
    
    6、在程序执行过程中使用new运算符创建的java对象,存储在堆内存中.对象内部有实例,
       所以实例变量存在堆内存中.
    
    7、变量分类:
    	- 局部变量【方法体中声明】
    	- 成员变量【方法体外声明】
    		实例变量【前边修饰符没有static】
    		静态变量【前边修饰符中有static】
    
    8、静态变量存储在方法区内存当中
    
    9、三块内存变化最频繁的是栈内存,最先有数据的是方法区内存,垃圾回收器主要针对堆内存。
    
    10、垃圾回收器【自动垃圾回收机制,GC机制】
    	* 当堆内存当中的java对象成为垃圾数据的时候,会被垃圾回收器回收。
    	* 什么时候会变成垃圾呢?
    		没有更多的引用指向它的时候
    		这个对象无法被访问,因为访问对象只能通过引用的方式
    
    

在这里插入图片描述

  1. 对象的创建和使用
    /*
    	对象的创建和使用
    */
    
    public class OOTest01
    {
    	public static void main(String[] args){
    		// 通过一个类可以实例化N个对象
    		// 实例化对象语法:new 类名();
    		// new是java语句当中的一个运算符
    		// new运算符的作用是创建对象,在JVM堆内存中开辟新的内存空间
    		// 方法区内存在;类加载的时候,.class字节码文件被加载到该内存空间当中
    		// 栈内存(局部变量):方法代码片段执行的时候,会给该方法分配内存空间,在栈中压栈
    		// 堆内存:new产生的对象
    		// Student是一个引用数据类型
    
    		// s是一个局部变量,存储在栈内存中
    		// new Studnet()是一个学生对象
    		// s是一个局部变量,存储对象的内存地址
    		Student s = new Student();
    
    		// 什么是对象?new运算符在堆内存中开辟的内存空间称为对象
    		// 什么是引用?引用是一个变量,只不过这个变量保存了内存地址
    	
    		
    		// 访问变量实例的语法格式
    		// 读取数据:引用.变量名
    		// 修改数据:引用.变量名 = 值
    		
    		int stuNo = s.no;
    		int stuAge = s.age;
    		String stuName = s.name;
    		boolean stuSex = s.sex;
    		
    		System.out.println("姓名:"+stuNo);
    		System.out.println("年龄:"+stuAge);
    		System.out.println("姓名:"+stuName);
    		System.out.println("性别:"+stuSex);
    
    		s.name = "张三";
    		System.out.println("姓名:"+stuName);
    		System.out.println("姓名:"+s.name);
    		
    		// stu也是一个引用,存储新实例的内存地址
    		Student stu = new Student();
    		System.out.println(stu);
    		
    		// 编译报错:
    		// 通过实例才能访问实例变量,不能直接通过类名的格式访问
    		// System.out.println(Student.no);
    	}
    }
    
    /*
    	局部变量在栈内存中存储
    	成员变量中的实例变量在堆内存的java对象内部存储
    
    	实例变量是一个对象一份,100个对象有100份
    
    */
    
    // 学生类
    
    public class Student
    {	
    	// 不创建对象,变量的内存空间是不存在的
    	// 创建完对象之后,对象存储在堆内存中
    	String name;  // String类型的成员变量不赋值默认为null
    	int age;
    	int no;
    	boolean sex;
    
    }
    
  2. java中的构造方法

    (1)构造方法综述
    package test003;
    
    /**
      * 关于java中的构造方法:
     * 		1、构造方法又被称为构造函数/构造器/Constructor
     * 
     * 		2、构造方法语法结构:
     * 			[修饰符列表] 构造方法名(形式参数列表){
     * 				构造方法体;
     * 			}
     * 
     * 		3、普通方法
     * 			[修饰符列表] 返回值类型 方法名(形参列表){
     * 				方法体;
     * 			}
     *		4、对于构造方法来说,返回值类型不需要指定,并且也不能写
     *			void,只要有void就是普通方法了
     *
     *		5、对于构造方法来说,构造方法的方法名必须和类名保持一致
     *
     *		6、构造方法的作用:
     *			构造方法存在的意义是通过构造方法的调用,可以创建对象
     *		
     *		7、构造方法怎么调用?
     *			-- 普通方法调用:修饰符有static时候,类名.方法名;
     *				没有static时候,引用.方法名
     *			-- 构造方法:new 构造方法名(实参列表)
     *		
     *		8、构造方法的返回值:
     *			每一个构造方法实际上执行结束之后都有返回值,但是这个"return 值";这样的语句不需要写。
     *			构造方法结束的时候Java程序自动返回值。
     *			并且返回值类型是构造方法所在类的类型。由于构造方法的返回值类型就是类本身,所以返回值类型不需要写。
     *		
     *		9、当一个类中没有任何构造方法的话,系统会默认产生一个无参数的构造方法,这个构造方法被称为缺省构造器。
    *		
    *		10、建议开发中手动为当前类提供无参数构造方法
    *		
    *		11、构造方法支持重载机制,在一个类当中编写多个构造方法。
    *
    *		12、构造方法不能使用
    */
    
    public class ConstructorTest01 {
    	public static void main(String[] args) {
    		
    		// 创建User对象;
    		// 只要构造方法调用,就会创建对象,以下创建两个对象,在堆内存中
    		User u = new User(3);
    		new User();
    		new User("hello");
    		
    		// 带有static的方法有两种调用形式
    		u.doSome();
    		User.doSome();
    		
    		// 不带static的方法要使用引用.方法,名调用
    		u.doOther();
    	}
    	
    
    (2)、构造方法的作用
    package test003;
    /**
     * 构造方法的作用:
     * 	1、创建对象
     * 	2、创建对象的同时,初始化实例变量的内存空间
     * 
     * 成员变量之实例变量,属于对象级别的变量,这种变量必须现有对象才能有实例变量。
     * 实例变量的内存空间是在构造方法的执行过程中完成开辟的
     * 系统在默认赋值的时候,也是在构造方法执行过程中完成赋值的。
     * 
     * 实例变量是存储在JVM的堆内存内部
     * */
    public class ContructorTest02 {
    	
    	public static void main(String[] args) {
    		
    		Account a = new Account();
    		System.out.println(a);
    		
    		Account a1 = new Account("110");
    		System.out.println(a1);
    		System.out.println("账户是:"+a1.getActno());
    	}
    }
    
    
    // 账户类
    public Account {
    	
    	// 账户
    	private String actno;
    	
    	private double balance;
    	
    	
    	public Account() {
    		// 初始化实例变量的内存空间
    		// actno = null;
    		// balance = 0.0
    	}
    	
    	public Account(String s) {
    		actno = s;
    	}
    
    	public String getActno() {
    		return actno;
    	}
    
    	public void setActno(String actno) {
    		this.actno = actno;
    	}
    
    	public double getBalance() {
    		return balance;
    	}
    
    	public void setBalance(double balance) {
    		this.balance = balance;
    	}
    	
    }
    
    
    package test003;
    
    /**
     * 这是一个User类
     * */
    public class User {
    	
    	
    	public User() {
    		System.out.println("无参数的User构造器");
    	}
    	
    	
    	// 定义有参数的构造方法
    	public User(int age) {
    		System.out.println("带有Int类型参数的构造器");
    	}
    	
    	public User(String s) {
    		System.out.println("带有String参数的构造器");
    	}
    	
    	public static void doSome() {
    		System.out.println("带有static的方法");
    	}
    	
    	public void doOther() {
    		System.out.println("不带static的方法");
    	}
    }
    
    
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java系列8—对象创建的内存分配和构造方法 的相关文章

  • SPNEGO 密码身份验证问题

    我已将我的应用程序配置为通过 SPNEGO 与 Websphere 使用 Kerberos 身份验证 这是详细信息 krb5 conf libdefaults default realm ABC MYCOMPANY COM default
  • 将构造函数作为参数传递给方法

    我是java新手 开始研究构造函数 我看到一些构造函数作为参数传递给方法的示例 请告诉我当构造函数作为参数传递给方法时会发生什么 或者建议我一些链接 我可以在其中获得有关使用构造函数的足够知识 根据您需要传递构造函数的目的 您可以考虑传递供
  • 将 MouseListener 添加到面板

    我正在尝试将鼠标操作添加到我的面板中 这就是程序应该做的事情 编写一个程序 允许用户通过按三下鼠标来指定一个三角形 第一次按下鼠标后 画一个小点 第二次按下鼠标后 绘制一条连接前两个点的线 第三次按下鼠标后 绘制整个三角形 第四次按下鼠标会
  • 使类只能从特定类实例化

    假设我有 3 节课class1 class2 and class3 我怎样才能拥有它class1只能通过实例化class2 class1 object new class1 但不是 class3 或任何其他类 我认为它应该与修饰符一起使用
  • 运行 java -jar 时出现 java.lang.ClassNotFoundException

    我正在使用 ant 来构建我的build xml文件 它编译正常 但随后得到运行时java lang NoClassDefFoundError通过 运行生成的 jar 时java jar my jar jar 似乎这个问题出现了很多 但没有
  • 使用 Spring 控制器处理错误 404

    I use ExceptionHandler处理我的网络应用程序抛出的异常 在我的例子中我的应用程序返回JSON回应HTTP status用于对客户端的错误响应 但是 我正在尝试弄清楚如何处理error 404返回与处理的类似的 JSON
  • 即使在轴上进行自动量程调整,我也可以保留积分刻度线吗?

    我 偷 了一些代码here http fxexperience com 2012 01 curve fitting and styling areachart 拥有一个AreaChart我在 FXML 中使用了 平滑线条 它的工作原理如下
  • 如何在 MSSQL 中获取 CURRENT_DATE?

    我正在使用 jpa 3 o 和 Hibernate 我有一个命名查询 SELECT COUNT wt id FROM WPSTransaction wt WHERE wt createdDate gt CURRENT DATE WPSTra
  • 在java中将字符串日期转换为美国格式

    我有下面的代码 其中日期为字符串类型 我必须将其设置为美国格式 所以下面我已经展示了它 private static final SimpleDateFormat usOutputDate new SimpleDateFormat MM d
  • 可访问数据的 Java 约定。 (公共访问器和 Getter/命名)

    通过 Java API 您会看到大量冲突的命名和实践 这让我感到非常困惑 例如 The String http grepcode com file repository grepcode com java root jdk openjdk
  • 纱线上的火花,连接到资源管理器 /0.0.0.0:8032

    我正在我的开发机器 Mac 上编写 Spark 程序 hadoop的版本是2 6 spark的版本是1 6 2 hadoop集群有3个节点 当然都在linux机器上 我在idea IDE中以spark独立模式运行spark程序 它运行成功
  • 生成 equals 和 hashcode 时忽略属性

    假设我有一个类 Customer public class Customer private String firstName private String lastName private String doNotAddMeToEqual
  • 正确签名的 JNLP 应用程序无法在 Java 7 中运行

    我有一个 JNLP 应用程序 由于证书过期需要更新 我有一个经过 CA 验证的新证书 我已将新证书导入到我的密钥库中 我已导入完整的证书链 我的构建文件对构建中的 jar 进行签名和时间戳
  • Java 中 JButton 的击键/热键

    最初我使用 JMenu 并建立热键以使用加速器工作 它运行得很好 现在我想在 JButton 中实现相同的行为 但我陷入困境 这是我编写的代码 请分享您的想法 以便我可以走上正确的道路 import javax swing import j
  • Android UnityPlayerActivity 操作栏

    我正在构建一个 Android 应用程序 其中包含 Unity 3d 交互体验 我已将 Unity 项目导入 Android Studio 但启动时该 Activity 是全屏的 并且不显示 Android 操作栏 我怎样才能做到这一点 整
  • 使用 PC/SC 读卡器验证 Ultralight EV1

    我在尝试使用 Java 中的 PC SC 读卡器 特别是 ACR1222L 验证 Ultralight EV1 卡时遇到问题 我能够使用 ISO 14443 3 标签的相应 APDU 在不受保护的标签上进行写入和读取 但是 我找不到运行 P
  • 如何从 JavaFX 中的另一个控制器类访问 UI 元素?

    我有一个使用 NetBeans 8 编写的 JavaFX Java 8 应用程序 没有SceneBuilder 我的应用程序有一个主窗口 该窗口有自己的 FXML 文件 primary fxml 和自己的控制器类 FXMLPrimaryCo
  • 如何建立与 FileZilla Server 1.2.0 的 FTPS 数据连接

    使用 Apache commons net 的 Java FTPSClient 进行会话恢复是一个已知问题 会话恢复是 FTPS 服务器数据连接所需的一项安全功能 Apache FTPSClient 不支持会话恢复 并且 JDK API 使
  • Errors/BindingResult 参数应在模型属性、@RequestBody 或 @RequestPart 参数之后立即声明

    我通过剖析示例应用程序来自学 Spring 然后到处添加代码来测试我在剖析过程中开发的理论 在测试添加到 Spring 应用程序中的一些代码时 我收到以下错误消息 An Errors BindingResult argument is ex
  • java中void的作用是什么?

    返回类型 方法返回值的数据类型 如果方法不返回值 则返回 void http download oracle com javase tutorial java javaOO methods html http download oracle

随机推荐

  • java经典笔试题大全(50道含答案)

    java经典笔试题大全 50道含答案 整理了一套常用的Java笔试题 选择题50道 简答题5道 试试你能做对多少题吧 含答案 选择题 共50题 每题1 5分 共75分 多选题选不全或选错都不得分 1 以下属于面向对象的特征的是 C D 两项
  • 关于Python子类调用父类同名属性和方法的讲解

    父类 class Person object def init self self name 张三 self age 30 def showInfo self print self name print self age 子类继承Perso
  • linux centos7 启动到登录页面黑屏解决方案

    你看下你黑屏的特征是不是跟我一样的 1 虚拟机装的 centos7 可视化界面版本 2 虚拟机没关机情况下 主机断电了 3 虚拟机启动时 前面正常读秒和开机 要进到用户登录输入密码那个界面时黑屏了 说下我的解决方案吧 其实也不算解决 只不过
  • 4-1 张量的结构操作

    张量结构操作主要包括 张量创建 索引切片 维度变换 合并分割 一 创建张量 张量创建的许多方法和numpy中创建array的方法很像 以下记录一些比较常用的操作 1 直接采用torch tensor创建 指定数据类型为torch float
  • 基于Simulink的牛顿摆效应模型建模与仿真

    基于Simulink的牛顿摆效应模型建模与仿真 摘要 本文介绍了如何使用Matlab中的Simulink工具来建立和仿真牛顿摆效应模型 牛顿摆效应是指在振动系统中 由于初始条件的微小变化 导致系统发生不可预测的行为 通过建立牛顿摆效应模型
  • 编程语言的区别(静态VS动态)

    编程语言的区别 静态VS动态 编译型VS解释型 静态 VS 动态 Static typing when possible dynamic typing when needed 1 静态语言定义 数据类型需要在编译其间检查的语言 即写程序时要
  • 离线安装 PostgreSQL 12、配置主从服务器以及使用 pgpool-II 实现快速主从切换的教程

    离线安装 PostgreSQL 12 配置主从服务器以及使用 pgpool II 实现快速切换的完整教程 PostgreSQL 是一款功能强大的关系型数据库管理系统 既可以运行在 Linux 系统上 也可以运行在其他操作系统上 为了提高 P
  • 祝大家新年快乐

    好久没有更新文章了 说忙 这借口用化掉了 2022就要来了 祝大家新的一年一切都好 还是要立个flag 2022争取写完一套uniapp微信小程序开发系列文章吧 希望到时候大家能喜欢
  • Xenserver命令大全

    一 监控检查类xentop 查看XenServer与VM的资源使用情况xsconsole 进入XenServer管理面板 查看网卡 IP 系统版本 系统时间 硬件信息等 xe task list 查看XenServer临时任务进程servi
  • c++中rand()函数每次执行的结果都是一样的吗

    问题 include
  • 服务器硬盘接口图文观赏

    现在服务器上采用的硬盘接口技术主要有两种 SATA和SCSI 使用SAS硬盘的产品目前也已经上市 当然还有高端的光纤硬盘 其中前两种是最常见的 下面我们就SATA SCSI SAS等接口技术作简单介绍 SATA SATA Serial Ad
  • java类中获取ServletContext的方法

    在项目中遇到这样一个问题 需要在没有web请求的java普通类中 获取ServletContext 那么该怎么获取呢 答案就是通过ContextLoader类 WebApplicationContext webAc ContextLoade
  • 【华为OD机试 2023】 匿名信(C++ Java JavaScript Python)

    华为od机试题库 华为OD机试2022 2023 C Java JS Py https blog csdn net banxia frontend category 12225173 html 华为OD机试2023最新题库 更新中 C Ja
  • NHibernet Unable to locate persister for the entity

    第一 xml文件必须为 hbm xml 第二 设置xml文件为嵌入的资源 用鼠标点击右键 然后生成操作里 选择嵌入的资源即可解决 https www cnblogs com lyj 转载于 https www cnblogs com xia
  • SSD预测错误调试:RuntimeError: index_select(): functions with out=... arguments don‘t support automatic dif

    一 错误 运行SSD pytorch版本时 运行test py时 遇到这种错误 RuntimeError index select functions with out arguments don t support automatic d
  • Kafka面试必问几个概念 与 使用场景

    介绍下我写的这个kafka项目 里面做了详细的配置注释已经代码的demo 可供大家学习 项目 地址 springboot kafka集群项目实战 kafka集群批量消费数据去重和一致性 kafka的几个重要概念 接下来围绕下面几个概念来进行
  • 运放中接电容的作用

    运放概述 案例讲解 运算分析 一 基本概念 反向放大器 优点 两个输入端电位始终近似为零 同相端接地 反相端虚地 只有差模信号 抗干扰能力强 缺点 输入阻抗很小 等于信号到输入端的串联电阻的阻值 同相放大器 优点 输入阻抗和运放的输入阻抗相
  • 《JavaScript高级程序设计(第四版)》红宝书学习笔记(2)(第四章:变量、作用域与内存)

    个人对第四版红宝书的学习笔记 不适合小白阅读 这是part2 持续更新 其他章节笔记看我主页 记 的表示是ES6新增的知识点 记 表示包含新知识点 第四章 变量 作用域与内存 4 1 原始值与引用值 ECMAScript变量可以包含两种不同
  • C获取linux系统环境变量方法(Environment Variables)

    主要有三种方法 都很简单 1 一个单纯c语言获取的方式 span style font family none font size 14px include span
  • Java系列8—对象创建的内存分配和构造方法

    对象的创建 类和对象的区别 面向对象 java语言的核心机制 最重要的内容 java语言的特色 面向过程和面向对象的区别 面向过程 主要关注点是 实现的具体过程 因果关系 面向对象 主要关注对象 独立体 能完成哪些功能 优点 耦合度低 扩展